【原创】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\kubectl.go

【原创】k8s源码分析-----kubectl(3)主要框架_第1张图片

其中的Factory我们已经分析过了,可以看(【原创】k8s源码分析-----kubectl(2)Factory)

 

1.2 kubectlcommand

接着我们继续往下看

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

【原创】k8s源码分析-----kubectl(3)主要框架_第2张图片

【原创】k8s源码分析-----kubectl(3)主要框架_第3张图片

这里采用了第三方库github.com/spf13/cobra,如果不了解的可以看下用法介绍https://github.com/spf13/cobra

 

在一级cmd下,添加了很多的二级cmd,如NewCmdCreate,NewCmdGet,NewCmdDelete等

 

1.3 cmdCreate

这里我们就以NewCmdCreate为例,继续跟踪

 

代码在Z:\work\mywork\trunk\src\k8s.io\kubernetes\pkg\kubectl\cmd\create.go

【原创】k8s源码分析-----kubectl(3)主要框架_第4张图片

上面先是从Factory里获取一系列参数,然后通过NewBuilder的一系列动作,获取到了Result

【原创】k8s源码分析-----kubectl(3)主要框架_第5张图片

接着调用了Result的visit函数,并传入了回调函数

 

1.4 小结

1、利用第三方库github.com/spf13/cobra构建多级command

2、利用Factory对参数识别,并做一些处理

3、利用builder进行构建visitors

4、对builder构建的visitors,进行处理

 

整体上来看,流程还是很清晰的。主要部分有Factory,已经有讲解过了。再接着就是builder,这里的builder利用的是一个visitor设计模式,builder负责visitors的构建,然后在主command中,对visitors进行相关处理。

2、visitor

既然说builder是一个visitor模型

那么就先从visitor入手

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

【原创】k8s源码分析-----kubectl(3)主要框架_第6张图片

上面是visitor接口

【原创】k8s源码分析-----kubectl(3)主要框架_第7张图片

上面是visitorlist,也属于visitor类型

 

那么一共有多少类型的visitor呢

2.1、URLVisitor

【原创】k8s源码分析-----kubectl(3)主要框架_第8张图片

从上图代码来看很简单,利用http get获取信息,然后构建info,然后继续command中的回调

 

2.2、FileVisitor

【原创】k8s源码分析-----kubectl(3)主要框架_第9张图片

filevisitor其实是对streamvisitor的一层封装

 

2.3、streamvisitor

【原创】k8s源码分析-----kubectl(3)主要框架_第10张图片

【原创】k8s源码分析-----kubectl(3)主要框架_第11张图片

从上图的代码来看,首先读取流,然后进行解码,最后构建info

 

2.4、selector visitor

【原创】k8s源码分析-----kubectl(3)主要框架_第12张图片

【原创】k8s源码分析-----kubectl(3)主要框架_第13张图片

2.5、info visitor

【原创】k8s源码分析-----kubectl(3)主要框架_第14张图片

【原创】k8s源码分析-----kubectl(3)主要框架_第15张图片

 

infovisitor是最直接的visitor,上面所讲解的大部分visitor,最后都要转换成info

3、 build visitors

visitor介绍完了,那我们开始介绍builder,visitor是怎么构建的

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

我们先将流程反过来看

【原创】k8s源码分析-----kubectl(3)主要框架_第16张图片

Do一般是command中最后执行builder的动作,其功能就是返回visitors

其中调用了visitorResult

 

那么我们进去看看

【原创】k8s源码分析-----kubectl(3)主要框架_第17张图片

接下来就是构建

3.1、根据 selectors来构建visitors

根据提供的selector来构建selector visitors

【原创】k8s源码分析-----kubectl(3)主要框架_第18张图片

上面是一些参数的检查

【原创】k8s源码分析-----kubectl(3)主要框架_第19张图片

最后构建了NewSelector

3.2、根据resource and name构建visitors

直接根据resource类型和name来构建info visitors

【原创】k8s源码分析-----kubectl(3)主要框架_第20张图片

上面参数的检查和构建,其中最重要的是直接构建了RESTClient

【原创】k8s源码分析-----kubectl(3)主要框架_第21张图片

根据信息,直接构建了NewInfo

3.3、根据name构建visitors

【原创】k8s源码分析-----kubectl(3)主要框架_第22张图片

【原创】k8s源码分析-----kubectl(3)主要框架_第23张图片

也是直接构建了NewInfo

3.4、根据path构建visitors

【原创】k8s源码分析-----kubectl(3)主要框架_第24张图片

path比较复杂

 

4、builder 输入

上面看了builder 构建visitors,那么这里看下builder提供哪些接口用于输入

1、path

       func (b *Builder) Path(paths ...string) *Builder {

2、selector

       func (b *Builder) SelectorParam(s string) *Builder {

       func (b *Builder) Selector(selector labels.Selector) *Builder {

       func (b *Builder) SelectAllParam(selectAll bool) *Builder

3、namespace

       func (b *Builder) NamespaceParam(namespace string) *Builder {

       func (b *Builder) DefaultNamespace() *Builder {

       func (b *Builder) AllNamespaces(allNamespace bool) *Builder {

4、resource

       func (b *Builder) ResourceNames(resource string, names ...string) *Builder {

       func (b *Builder) ResourceTypes(types ...string) *Builder {

       func (b *Builder) ResourceTypeOrNameArgs(allowEmptySelector bool, args ...string)        *Builder

5、url

       func (b *Builder) URL(urls ...*url.URL) *Builder {

6、stream

       func (b *Builder) Stream(r io.Reader, name string) *Builder {

7、stdin

       func (b *Builder) Stdin() *Builder {

以上是一些主要的提供的构建接口

 

5、Info visitor工作

大部分的visitors最终都会转换成info visitor来进行最后的工作流程

那么这里详细讲解下

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

结构体

【原创】k8s源码分析-----kubectl(3)主要框架_第25张图片

构建结构体

【原创】k8s源码分析-----kubectl(3)主要框架_第26张图片

我们看到其中最重要的参数是client RESTClient

【原创】k8s源码分析-----kubectl(3)主要框架_第27张图片

我们看看Get中,调用了NewHelper

我们再看看Create command中传入visitors的回调函数

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

func RunCreate(f *cmdutil.Factory, cmd *cobra.Command,out io.Writer, options *CreateOptions) error {

【原创】k8s源码分析-----kubectl(3)主要框架_第28张图片

也都是调用了NewHelper

 

5.1 Helper

我们再继续看看helper

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

【原创】k8s源码分析-----kubectl(3)主要框架_第29张图片

其提供的接口有

【原创】k8s源码分析-----kubectl(3)主要框架_第30张图片

我们以简单的Get为例

【原创】k8s源码分析-----kubectl(3)主要框架_第31张图片

其实就是调用了RESTClient的操作

 

5.2 RESTClient

看下RESTClient的具体情况

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

【原创】k8s源码分析-----kubectl(3)主要框架_第32张图片

这里的RESTClient是一个interface

我们接着来看这个RESTClient是怎么构建的

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

【原创】k8s源码分析-----kubectl(3)主要框架_第33张图片

Factory通过f.Object()向builder提供了mapper和typer

另外提供了一个函数f.ClientMapperForCommand()

我们看看这个函数

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

 在Factory的分析文章中,我们有分析过这个

【原创】k8s源码分析-----kubectl(3)主要框架_第34张图片

 

最终RESTClient就是client下的Client

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

【原创】k8s源码分析-----kubectl(3)主要框架_第35张图片

【原创】k8s源码分析-----kubectl(3)主要框架_第36张图片

  

6、小结

kubectl整体设计也是非常的清晰,只要搞清楚了其中各个模块的功能职责,代码流程还是很容易跟踪的。

 

 

龚浩华

QQ 月牙寂 道长 29185807

2016年4月20日

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

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

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

 

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