码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-04-20 20:15:07      阅读:1279      评论:0      收藏:0      [点我收藏+]

标签:

本文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

技术分享

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

 

1.2 kubectlcommand

接着我们继续往下看

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

技术分享

技术分享

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

 

在一级cmd下,添加了很多的二级cmd,如NewCmdCreateNewCmdGetNewCmdDelete

 

1.3 cmdCreate

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

 

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

技术分享

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

技术分享

接着调用了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

技术分享

上面是visitor接口

技术分享

上面是visitorlist,也属于visitor类型

 

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

2.1、URLVisitor

技术分享

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

 

2.2、FileVisitor

技术分享

filevisitor其实是对streamvisitor的一层封装

 

2.3、streamvisitor

技术分享

技术分享

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

 

2.4、selector visitor

技术分享

技术分享

2.5、info visitor

技术分享

技术分享

 

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

3、 build visitors

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

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

我们先将流程反过来看

技术分享

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

其中调用了visitorResult

 

那么我们进去看看

技术分享

接下来就是构建

3.1、根据 selectors来构建visitors

根据提供的selector来构建selector visitors

技术分享

上面是一些参数的检查

技术分享

最后构建了NewSelector

3.2、根据resource and name构建visitors

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

技术分享

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

技术分享

根据信息,直接构建了NewInfo

3.3、根据name构建visitors

技术分享

技术分享

也是直接构建了NewInfo

3.4、根据path构建visitors

技术分享

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

结构体

技术分享

构建结构体

技术分享

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

技术分享

我们看看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 {

技术分享

也都是调用了NewHelper

 

5.1 Helper

我们再继续看看helper

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

技术分享

其提供的接口有

技术分享

我们以简单的Get为例

技术分享

其实就是调用了RESTClient的操作

 

5.2 RESTClient

看下RESTClient的具体情况

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

技术分享

这里的RESTClient是一个interface

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

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

技术分享

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

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

我们看看这个函数

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

技术分享

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

技术分享

 

最终RESTClient就是client下的Client

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

技术分享

技术分享

  

6、小结

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

 

 

龚浩华

QQ 月牙寂 29185807

2016年4月20日

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

 

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

标签:

原文地址:http://blog.csdn.net/screscent/article/details/51199351

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!