【原创】k8s源码分析-----kubectl(2)Factory

本文QQ空间的链接:http://user.qzone.qq.com/29185807/blog/1461036130

本文csdn博文的链接:http://blog.csdn.net/screscent/article/details/51188790

源码为k8s v1.1.1

1、原因

首先讲讲为啥,我们要讲解Factory

代码在k8s.io\kubernetes\cmd\kubectl

先从main函数入口来说

main函数很简单,进来就直接构建了一个cmd,然后调用了Execute

而cmd里面的参数除了几个标准的输入输出之外,就只有一个NewFactory

下面我们继续看看NewKubectlCommand,在函数中,构建了很多cmd的,每个cmd传入进去的参数也是Factory

代码在k8s.io\kubernetes\pkg\kubectl\cmd

我们简单的看一个NewCmdCreate

很明显在Run中最重要的函数是RunCreate

而在RunCreate中,所有的重要参数都是有Factory产出

所以在分析kubectl命令之前,我们先分析下Factory。

2、构建

代码在k8s.io\kubernetes\pkg\kubectl\cmd\util

下面是源码中的注释

Factory provides abstractions that allow the Kubectl command to be extended across multiple types of
resources and different API sets.

主要的含义就是Factory提供了一些抽象动作,目的就是用于kubectl command可以扩展很多不同的类型和不同的api(英文翻译的不好,大致就是这个意思)

Factory中,提供了很多的函数对象

我们在main函数中看到,其中调用了NewFactory来构建Factory

函数比较长,我们慢慢来分析

代码太长,就不全部贴了。下面挑一些重要的来做详细分析

2.1 mapper

mapper := kubectl.ShortcutExpander{RESTMapper: api.RESTMapper}

我们看看

代码在k8s.io\kubernetes\pkg\kubectl\ kubectl.go

这里的ShortcutExpander其实就是对meta.RESTMapper做了一层封装,而我们上一篇文章(【原创】k8s源码分析-----kubectl(1)api.RESTMapper)已经对RESTMapper已经详细讲解过了,就不再细说了

2.2 Generator

构建了5种类型的Generator

代码在k8s.io\kubernetes\pkg\kubectl\generator.go

Generator就是根据输入参数构建出相对于的api object

2.2.1 BasicReplicationController

"run/v1"对应的是BasicReplicationController,那么我们看看这个

一个空的结构体,但函数ParamNames提供了replicationController所需要的参数

下面我们看看构建

Generate函数比较长,这里贴了好几张图,才贴完。从上面的函数流程来看,就是从输入参数中,查找api.ReplicationController所需要的参数,最后构建成了一个api.ReplicationController的对象,将其返回

2.2.2 BasicPod

"run-pod/v1":对应的是BasicPod

上面就是构建pod所需要的参数

下面我们看看Generate,函数太长,就不全部截图了。关键部分截图出来看看

func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, error) {

查找相关的输入参数,然后构建了一个api.Pod

2.2.3 ServiceGenerator

"service/v1": 对应的是ServiceGeneratorV1

"service/v2": 对应的是ServiceGeneratorV2

从上图的代码来看,v1和v2版本其实是差不多的,只是v1版本多了一个params["port-name"] = "default"

上面是service构建所需的参数

func generate(genericParams map[string]interface{}) (runtime.Object, error) {

上面就是构建的api.Service

2.3 clients

我们先看看构建Factory的时候是怎么初始化clients以及其主要提供的函数接口

clients    *ClientCache

其本身从字面上来看是一个client的缓存,主要提供了clients.ClientForVersion()这个接口用于获取client

代码在k8s.io\kubernetes\pkg\kubectl\cmd\util\clientcache.go

其中最重要的参数为clients map[string]*client.Client一个map

我们主要提供的接口

根据版本号来查找,是否已经构建过,没有的话,就重新构建一个client,那么client是什么呢

代码在k8s.io\kubernetes\pkg\client\unversioned\client.go

其中最重要的就是RESTClient

代码在k8s.io\kubernetes\pkg\client\unversioned\restclient.go

2.4 小结

主要的构建参数就是generator和clients。

3、功能

下面我们看看Factory都提供了那些功能,其实所有的功能都是在构建的时候,初始化的那些函数对象,并不是以成员函数体现的。

3.1  Object

// Returns interfaces for dealing with arbitrary runtime.Objects.

Object func() (meta.RESTMapper, runtime.ObjectTyper)

函数主要作用就是封装了一个OutputVersionMapper,其实就将RESTMapper和Version版本封装到了一起

另外object函数还返回了一个runtime.objectTyper,就是api.Scheme,这个我们在前面的文章(【原创】k8s源码分析-----kubectl(1)api.RESTMapper)中已经有讲解过

3.2 Client

其实就是从clients获取到默认版本的client

3.3 RESTClient

RESTClient其实也是从clients获取到的

3.4 PodSelectorForObject

根据不同的类型,返回不同的选择标签

3.5 Generator

根据不同的类型,返回不同的genterator

3.6 小结

Factory提供的功能比较多,这一小结,只分析其中一些比较常用重要的,剩余的可以自己去看下代码,函数功能实现都是很清晰的

龚浩华

QQ 月牙寂 29185807

2016年4月19日

(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)

时间: 2024-11-04 08:11:24

【原创】k8s源码分析-----kubectl(2)Factory的相关文章

【原创】k8s源码分析-----kubectl(3)主要框架

本文QQ空间的链接:http://user.qzone.qq.com/29185807/blog/1461123088 本文csdn博文的链接:http://blog.csdn.net/screscent/article/details/51199351 源码为k8s v1.1.1 1.整体流程 我们先整体的流程走一遍,不用太过于关心看不看的懂,先有个整体的流程概念,后续再一步一步分析 1.1 main 先从main开始 代码在k8s.io\kubernetes\cmd\kubectl\kube

【原创】k8s源码分析-----kubectl(1)api.RESTMapper

本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460961715 本文csdn博文链接:http://blog.csdn.net/screscent/article/details/51179485 源码为k8s v1.1.1稳定版本 api. RESTMapper是kube-apiserver和kubectl的基础,在讲解kube-apiserver的时候,我们就有简单的讲解api. RESTMapper,但并没有系统的讲解.那么这一章,我们

【原创】k8s源码分析-----kubelet(4)imageManager

本文qq空间链接:http://user.qzone.qq.com/29185807/blog/1460429307 本文csdn博客链接:http://blog.csdn.net/screscent/article/details/51131261 源码为k8s v1.1.1稳定版本 2.3.imageManager 1.参数 代码在k8s.io\kubernetes\cmd\kubelet\app中 结构体变量 type KubeletServer struct { ... ImageGCH

【原创】k8s源码分析-----kube-proxy(2)ProxyServer

本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460685179 本文csdn博客链接:http://blog.csdn.net/screscent/article/details/51159168 k8s源码为v1.1.1稳定版本 1.ProxyServer的构建与主流程 源码在k8s.io\kubernetes\cmd\kube-proxy main函数入口 这个就不再多说了,这种结构已经见多了 继续进入源码k8s.io\kubernete

《k8s 源码分析》- Custom Controller 之 Informer

Custom Controller 之 Informer 概述 架构概览 reflector - List & Watch API Server Reflector 对象 ListAndWatch watchHandler - add obj to delta fifo Informer (controller) - pop obj from delta fifo Controller processLoop Add obj to Indexer (Thread safe store) shar

【原创】k8s源码分析-----kube-scheduler

本文转自本人空间:http://user.qzone.qq.com/29185807/blog/1459831332 源码为k8s v1.1.1稳定版本 一.主要流程 1.main入口 源码在k8s.io/kubernetes/plugin/cmd/kube-scheduler 这种封装是k8s里面一贯的封装风格,就不再多说了 源码在k8s.io/kubernetes/plugin/cmd/kube-scheduler/app 继续往下 真正的入口 下面有个ratelimiter 在factor

【原创】k8s源码分析-----kubelet(5)diskSpaceManager

本文qq空间链接:http://user.qzone.qq.com/29185807/blog/1460448039 本文csdn博客链接:http://blog.csdn.net/screscent/article/details/51134293 源码为k8s v1.1.1稳定版本 2.4.diskSpaceManager 1.参数 代码在k8s.io\kubernetes\cmd\kubelet\app中 结构体变量 type KubeletServer struct { ... LowD

【原创】k8s源码分析-----kubelet(3)ContainerGC

本人空间链接:http://user.qzone.qq.com/29185807/blog/1460080827 源码为k8s v1.1.1稳定版本 2.2 ContainerGC 1.参数 代码在k8s.io\kubernetes\cmd\kubelet\app中 结构体变量 type KubeletServer struct { ... MinimumGCAge                   time.Duration MaxContainerCount              in

【原创】k8s源码分析----apiserver之APIGroupVersion

本文中转载自本人空间:http://user.qzone.qq.com/29185807/blog/1458892866 前面3篇文章,主要是根据程序处理流程进行跳转分析.经过这些流程的跳转分析,拨开乌云终见日. 我们剥掉那些不重要的部分,直接进入主要框架. APIGroupVersion 在master中,api v1的初始化 生成了一个default的apigroupversion 下面进入到整个框架中最重要的数据结构 一.主要数据结构 1.mapper,其最重要的东西是里面的RESTMap