标签:
本文QQ空间的链接:http://user.qzone.qq.com/29185807/blog/1461123088
本文csdn博文的链接:http://blog.csdn.net/screscent/article/details/51199351
源码为k8s v1.1.1
我们先整体的流程走一遍,不用太过于关心看不看的懂,先有个整体的流程概念,后续再一步一步分析
先从main开始
代码在k8s.io\kubernetes\cmd\kubectl\kubectl.go
其中的Factory我们已经分析过了,可以看(【原创】k8s源码分析-----kubectl(2)Factory)
接着我们继续往下看
代码在k8s.io\kubernetes\pkg\kubectl\cmd\cmd.go
这里采用了第三方库github.com/spf13/cobra,如果不了解的可以看下用法介绍https://github.com/spf13/cobra
在一级cmd下,添加了很多的二级cmd,如NewCmdCreate,NewCmdGet,NewCmdDelete等
这里我们就以NewCmdCreate为例,继续跟踪
代码在Z:\work\mywork\trunk\src\k8s.io\kubernetes\pkg\kubectl\cmd\create.go
上面先是从Factory里获取一系列参数,然后通过NewBuilder的一系列动作,获取到了Result
接着调用了Result的visit函数,并传入了回调函数
1、利用第三方库github.com/spf13/cobra构建多级command
2、利用Factory对参数识别,并做一些处理
3、利用builder进行构建visitors
4、对builder构建的visitors,进行处理
整体上来看,流程还是很清晰的。主要部分有Factory,已经有讲解过了。再接着就是builder,这里的builder利用的是一个visitor设计模式,builder负责visitors的构建,然后在主command中,对visitors进行相关处理。
既然说builder是一个visitor模型
那么就先从visitor入手
代码在k8s.io\kubernetes\pkg\kubectl\resource\visitor.go
上面是visitor接口
上面是visitorlist,也属于visitor类型
那么一共有多少类型的visitor呢
从上图代码来看很简单,利用http get获取信息,然后构建info,然后继续command中的回调
filevisitor其实是对streamvisitor的一层封装
从上图的代码来看,首先读取流,然后进行解码,最后构建info
infovisitor是最直接的visitor,上面所讲解的大部分visitor,最后都要转换成info
visitor介绍完了,那我们开始介绍builder,visitor是怎么构建的
代码在k8s.io\kubernetes\pkg\kubectl\resource\builder.go
我们先将流程反过来看
Do一般是command中最后执行builder的动作,其功能就是返回visitors
其中调用了visitorResult
那么我们进去看看
接下来就是构建
根据提供的selector来构建selector visitors
上面是一些参数的检查
最后构建了NewSelector
直接根据resource类型和name来构建info visitors
上面参数的检查和构建,其中最重要的是直接构建了RESTClient
根据信息,直接构建了NewInfo
也是直接构建了NewInfo
path比较复杂
上面看了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 {
以上是一些主要的提供的构建接口
大部分的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
我们再继续看看helper
代码在k8s.io\kubernetes\pkg\kubectl\resource\helper.go
其提供的接口有
我们以简单的Get为例
其实就是调用了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
kubectl整体设计也是非常的清晰,只要搞清楚了其中各个模块的功能职责,代码流程还是很容易跟踪的。
龚浩华
QQ 月牙寂 29185807
2016年4月20日
(版权声明:本文为作者原创,如需转载请通知本人,并标明出处和作者。擅自转载的,保留追究其侵权的权利。)
【原创】k8s源码分析-----kubectl(3)主要框架
标签:
原文地址:http://blog.csdn.net/screscent/article/details/51199351