作者:L-Darin_209 | 来源:互联网 | 2023-05-19 01:01
本文QQ空间的链接:http:user.qzone.qq.com29185807blog1461036130本文csdn博文的链接:http:blog.csdn.netscrescen
本文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
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyNzE1NTA1)
下面我们继续看看NewKubectlCommand,在函数中,构建了很多cmd的,每个cmd传入进去的参数也是Factory
代码在k8s.io\kubernetes\pkg\kubectl\cmd
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyNzMyMjcw)
我们简单的看一个NewCmdCreate
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyNzQ4ODE4)
很明显在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(英文翻译的不好,大致就是这个意思)
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyODE5NTgz)
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyODMwODk2)
Factory中,提供了很多的函数对象
我们在main函数中看到,其中调用了NewFactory来构建Factory
函数比较长,我们慢慢来分析
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyODQ1MjA5)
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyODU4OTEy)
代码太长,就不全部贴了。下面挑一些重要的来做详细分析
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
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyOTQ2NDc1)
构建了5种类型的Generator
代码在k8s.io\kubernetes\pkg\kubectl\generator.go
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEyOTU5NDI5)
Generator就是根据输入参数构建出相对于的api object
2.2.1 BasicReplicationController
"run/v1"对应的是BasicReplicationController,那么我们看看这个
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMDEzNTIy)
一个空的结构体,但函数ParamNames提供了replicationController所需要的参数
下面我们看看构建
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMDI2MTMx)
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMDM4MTAw)
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMDUwOTEz)
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMTAxNTQw)
Generate函数比较长,这里贴了好几张图,才贴完。从上面的函数流程来看,就是从输入参数中,查找api.ReplicationController所需要的参数,最后构建成了一个api.ReplicationController的对象,将其返回
2.2.2 BasicPod
"run-pod/v1":对应的是BasicPod
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMTE3MzY5)
上面就是构建pod所需要的参数
下面我们看看Generate,函数太长,就不全部截图了。关键部分截图出来看看
func (BasicPod) Generate(genericParams map[string]interface{}) (runtime.Object, error) {
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMTMwNDc1)
查找相关的输入参数,然后构建了一个api.Pod
2.2.3 ServiceGenerator
"service/v1": 对应的是ServiceGeneratorV1
"service/v2": 对应的是ServiceGeneratorV2
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMTQ0MDI2)
从上图的代码来看,v1和v2版本其实是差不多的,只是v1版本多了一个params["port-name"] = "default"
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMjAwMTE2)
上面是service构建所需的参数
func generate(genericParams map[string]interface{}) (runtime.Object, error) {
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMjEyNzU3)
上面就是构建的api.Service
2.3 clients
我们先看看构建Factory的时候是怎么初始化clients以及其主要提供的函数接口
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMjI5NjQ4)
clients *ClientCache
其本身从字面上来看是一个client的缓存,主要提供了clients.ClientForVersion()这个接口用于获取client
代码在k8s.io\kubernetes\pkg\kubectl\cmd\util\clientcache.go
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMjQzODU1)
其中最重要的参数为clients map[string]*client.Client一个map
我们主要提供的接口
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMjU2MzQw)
根据版本号来查找,是否已经构建过,没有的话,就重新构建一个client,那么client是什么呢
代码在k8s.io\kubernetes\pkg\client\unversioned\client.go
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMzA4NDM0)
其中最重要的就是RESTClient
代码在k8s.io\kubernetes\pkg\client\unversioned\restclient.go
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMzIxMTE3)
2.4 小结
主要的构建参数就是generator和clients。
3、功能
下面我们看看Factory都提供了那些功能,其实所有的功能都是在构建的时候,初始化的那些函数对象,并不是以成员函数体现的。
3.1 Object
// Returns interfaces for dealing with arbitrary runtime.Objects.
Object func() (meta.RESTMapper, runtime.ObjectTyper)
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzMzM2NDUw)
函数主要作用就是封装了一个OutputVersionMapper,其实就将RESTMapper和Version版本封装到了一起
另外object函数还返回了一个runtime.objectTyper,就是api.Scheme,这个我们在前面的文章(【原创】k8s源码分析-----kubectl(1)api.RESTMapper)中已经有讲解过
3.2 Client
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzNDExODg5)
其实就是从clients获取到默认版本的client
3.3 RESTClient
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzNDI4MDcw)
RESTClient其实也是从clients获取到的
3.4 PodSelectorForObject
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzNDQzMjAy)
根据不同的类型,返回不同的选择标签
3.5 Generator
![](https://www.#.com/go/aHR0cDovL2ltZy5ibG9nLmNzZG4ubmV0LzIwMTYwNDE5MTEzNDU3NzEx)
根据不同的类型,返回不同的genterator
3.6 小结
Factory提供的功能比较多,这一小结,只分析其中一些比较常用重要的,剩余的可以自己去看下代码,函数功能实现都是很清晰的
龚浩华
QQ 月牙寂 29185807
2016年4月19日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)