【原创】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

【原创】k8s源码分析-----kubectl(2)Factory_第1张图片

 

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

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

【原创】k8s源码分析-----kubectl(2)Factory_第2张图片

 我们简单的看一个NewCmdCreate

【原创】k8s源码分析-----kubectl(2)Factory_第3张图片

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

【原创】k8s源码分析-----kubectl(2)Factory_第4张图片

而在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(英文翻译的不好,大致就是这个意思)

 【原创】k8s源码分析-----kubectl(2)Factory_第5张图片

【原创】k8s源码分析-----kubectl(2)Factory_第6张图片

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

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

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

【原创】k8s源码分析-----kubectl(2)Factory_第7张图片

【原创】k8s源码分析-----kubectl(2)Factory_第8张图片

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

 

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已经详细讲解过了,就不再细说了

【原创】k8s源码分析-----kubectl(2)Factory_第9张图片

2.2 Generator

构建了5种类型的Generator

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

【原创】k8s源码分析-----kubectl(2)Factory_第10张图片

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

 

2.2.1 BasicReplicationController

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

【原创】k8s源码分析-----kubectl(2)Factory_第11张图片

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

下面我们看看构建

【原创】k8s源码分析-----kubectl(2)Factory_第12张图片

【原创】k8s源码分析-----kubectl(2)Factory_第13张图片

【原创】k8s源码分析-----kubectl(2)Factory_第14张图片

【原创】k8s源码分析-----kubectl(2)Factory_第15张图片

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

 

2.2.2 BasicPod

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

【原创】k8s源码分析-----kubectl(2)Factory_第16张图片

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

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

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

【原创】k8s源码分析-----kubectl(2)Factory_第17张图片

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

 

2.2.3 ServiceGenerator

"service/v1": 对应的是ServiceGeneratorV1

"service/v2": 对应的是ServiceGeneratorV2

 【原创】k8s源码分析-----kubectl(2)Factory_第18张图片

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

【原创】k8s源码分析-----kubectl(2)Factory_第19张图片

上面是service构建所需的参数

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

【原创】k8s源码分析-----kubectl(2)Factory_第20张图片

上面就是构建的api.Service

 

 

2.3 clients

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

【原创】k8s源码分析-----kubectl(2)Factory_第21张图片

clients    *ClientCache

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

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

【原创】k8s源码分析-----kubectl(2)Factory_第22张图片

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

我们主要提供的接口

【原创】k8s源码分析-----kubectl(2)Factory_第23张图片

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

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

【原创】k8s源码分析-----kubectl(2)Factory_第24张图片

其中最重要的就是RESTClient

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

【原创】k8s源码分析-----kubectl(2)Factory_第25张图片

 

2.4 小结

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

 

3、功能

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

3.1  Object

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

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

【原创】k8s源码分析-----kubectl(2)Factory_第26张图片

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

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

 

3.2 Client

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

 

3.3 RESTClient

【原创】k8s源码分析-----kubectl(2)Factory_第27张图片

RESTClient其实也是从clients获取到的

 

3.4 PodSelectorForObject

【原创】k8s源码分析-----kubectl(2)Factory_第28张图片

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

 

3.5 Generator

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

 

3.6 小结

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

 

 

 

龚浩华

QQ 月牙寂 道长 29185807

2016年4月19日

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

 

如果你觉得本文对你有帮助,可以转到你的朋友圈,让更多人一起学习。

第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

 

你可能感兴趣的:(golang,分布式,容器云,容器)