k8s源码分析——kubectl主要框架

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/cbmljs/article/details/102568433

代码版本:1.13
先整体的流程走一遍,不需要太过于关系细节,先整体把握整体的流程概念,后续在一步一步分析。


1. main

先从main函数开始,代码在k8s.io\kubernetes\cmd\kubectl\kubectl.go

main函数中调用了NewDefaultKubectlCommand函数,该函数的实现在:
/pkg/kubectl/cmd/cmd.go中:

该函数调用了同在cmd.NewDefaultKubectlCommandWithArgs方法,
这个方法调用了NewKubectlCommand()方法,在这个方法内,构建了一个kubectl子命令集合(通过cobra脚手架的方式),截取部分如下:

上面的这些子命令集合共同构成了kubernetes命令行接口,kubernetes提供的命令行接口如下(可用kubectl -h)查看。
这里以kubectl create -f name举例,调用了NewCmdCreate方法。去掉绑定参数部分的代码,我们可以看到该方法的核心内容是方法o.RunCreate

RunCreate函数就是create的主要实现。

该段代码所做的事情就是将命令行接收到的参数转化为一个资源的列。它也负责创建一个可以用来迭代访问所有资源的Visitor结构。
这个命令比较复杂,因为它使用了Builder模式的变种,使用独立的函数做各自的数据初始化工作。函数Schema、ContinueOnError、NamespaceParam、DefaultNamespace、FilenameParam、SelectorParam和Flatten都引入了一个指向Builder结构的指针,执行一些对它的修改,并且将这个结构体返回给调用链中的下一个方法来执行这些修改。这些函数都在此文件中:/pkg/kubectl/genericclioptions/resource/builder.go一旦所有的初始化都完成,resource.NewBuilder函数会调用Do函数。这个Do函数很关键,它会返回一个Result对象,并且将执行对资源的创建。Do函数还会创建一个Visitor对象,可以用来遍历所有关联到resource.NewBuilder执行过程的资源。
继续看后续的代码:

调用了r.Visit函数,该函数的实现就是visitor.go中的Visit函数(这里的先不介绍Visit方法,后续在介绍),然后调用了createAndRefresh函数:

这里的代码返回了一个新的Helper对象(这里的先不介绍Helper对象,后续在介绍)。回到createAndRefresh函数中,调用完NewHelper函数,调用了Create函数,在/pkg/kubectl/genericclioptions/resource/helper.go中


可以看到Create函数调用了一个createResource函数。以及实际向API Server发送的用来创建yaml文件描述的资源的REST调用。

整体总结:

  1. 利用第三方库github.com/spf13/cobra构建多级command
  2. 对参数识别,并做一些处理,跳转到响应的处理函数
  3. 利用builder进行构建visitors
  4. 对builder构建的visitors,进行处理

整体上来看,流程还是很清晰的。用一句话来说,就是解析命令行参数,构造RESTful请求向API Server发送请求。

2. visitor

既然说builder是一个visitor模型,那么就先从visitor入手。代码在k8s.io\kubernetes\pkg\kubectl\resource\visitor.go:

查看对应的继承关系,可以看到对应的visitor类型如下:

选择几个常见的来看一下:

2.1 URLVisitor

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

2.2 FileVisitor

3. Helper

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

对应的接口:

我们已简单的Get为例:

其实就是调用了RESTClient的操作。

参考:
https://blog.csdn.net/kwame211/article/details/79005726
https://blog.csdn.net/hahachenchen789/article/details/80607564

猜你喜欢

转载自blog.csdn.net/cbmljs/article/details/102568433