本节重点介绍 :
-
kubectl的职责和 kubectl 的代码原理
-
cobra库的使用简介
kubectl的职责
-
主要的工作是处理用户提交的东西(包括,命令行参数,yaml文件等)
-
然后其会把用户提交的这些东西组织成一个数据结构体
-
然后把其发送给 API Server
Kubectl系统架构图
kubectl 的代码原理
-
从命令行和yaml文件中获取信息
-
通过Builder模式并把其转成一系列的资源
-
最后用 Visitor 模式模式来迭代处理这些Reources
kubectl create命令 执行入口在 cmd目录下各个组件下面
-
代码位置 D:\go_path\src\github.com\kubernetes\kubernetes\cmd\kubectl\kubectl.go
package main import ( goflag "flag" "math/rand" "os" "time" "github.com/spf13/pflag" cliflag "k8s.io/component-base/cli/flag" "k8s.io/kubectl/pkg/cmd" "k8s.io/kubectl/pkg/util/logs" // Import to initialize client auth plugins. _ "k8s.io/client-go/plugin/pkg/client/auth" ) func main() { rand.Seed(time.Now().UnixNano()) command := cmd.NewDefaultKubectlCommand() // TODO: once we switch everything over to Cobra commands, we can go back to calling // cliflag.InitFlags() (by removing its pflag.Parse() call). For now, we have to set the // normalize func and add the go flag set by hand. pflag.CommandLine.SetNormalizeFunc(cliflag.WordSepNormalizeFunc) pflag.CommandLine.AddGoFlagSet(goflag.CommandLine) // cliflag.InitFlags() logs.InitLogs() defer logs.FlushLogs() if err := command.Execute(); err != nil { os.Exit(1) } }
rand.Seed设置随机数
调用kubectl库调用cmd 创建command对象
command := cmd.NewDefaultKubectlCommand()
cobra的使用
cobra 的主要功能如下
-
简易的子命令行模式,如 app server, app fetch 等等
-
完全兼容 posix 命令行模式
-
嵌套子命令 subcommand
-
支持全局,局部,串联 flags
-
使用 cobra 很容易的生成应用程序和命令,使用 cobra create appname 和 cobra add cmdname
-
如果命令输入错误,将提供智能建议,如 app srver,将提示 srver 没有,是不是 app server
-
自动生成 commands 和 flags 的帮助信息
-
自动生成详细的 help 信息,如 app help
-
自动识别帮助 flag -h,--help
-
自动生成应用程序在 bash 下命令自动完成功能
-
自动生成应用程序的 man 手册
-
命令行别名
-
自定义 help 和 usage 信息
-
可选的与 viper apps 的紧密集成
cobra 中的主要概念
-
Commands 表示执行动作
-
Ar