任何一个知识点如果深入学习都是有很多值得深思的地方,kubectl是一个再简单不过的工具,但是它里面引用的一些第三方的包却有很值得考究,第一个是cobra。
举个例子 pkg/kubectl/cmd/exec.go
func NewCmdExec(f cmdutil.Factory, streams genericclioptions.IOStreams) *cobra.Command {
options := &ExecOptions{
StreamOptions: StreamOptions{
IOStreams: streams,
},
Executor: &DefaultRemoteExecutor{},
}
cmd := &cobra.Command{
Use: "exec POD [-c CONTAINER] -- COMMAND [args...]",
DisableFlagsInUseLine: true,
Short: i18n.T("Execute a command in a container"),
Long: "Execute a command in a container.",
Example: exec_example,
Run: func(cmd *cobra.Command, args []string) {
argsLenAtDash := cmd.ArgsLenAtDash()
cmdutil.CheckErr(options.Complete(f, cmd, args, argsLenAtDash))
cmdutil.CheckErr(options.Validate())
cmdutil.CheckErr(options.Run())
},
}
cmd.Flags().StringVarP(&options.PodName, "pod", "p", options.PodName, "Pod name")
// TODO support UID
cmd.Flags().StringVarP(&options.ContainerName, "container", "c", options.ContainerName, "Container name. If omitted, the first container in the pod will be chosen")
cmd.Flags().BoolVarP(&options.Stdin, "stdin", "i", options.Stdin, "Pass stdin to the container")
cmd.Flags().BoolVarP(&options.TTY, "tty", "t", options.TTY, "Stdin is a TTY")
return cmd
}
kubectl的exec命令就是通过cobra实现的,当前kubectl其他的命令也是通过cobra实现的。其实是docker 先使用的cobra的,之前docker的所有命令都是通过cobra实现的。回到正题,下面介绍cobra,通过官方文档
安装
go get -u github.com/spf13/cobra/cobra
使用的方式是: APPNAME COMMAND ARG –FLAG
APPNAME就是你开发应用的名称,譬如docker、 kubectl
COMMAND 就是命令 ,譬如 get
ARG 是参数 譬如ID
FLAG 是标志位
hugo server --port=1313
server 是COMMAND port 是FLAG
下面通过代码看看如果使用,还是官方例子,
在项目的目录下执行
cobra init 会自动创建main.go
cobra add add 添加一个add的命令
cobra add del 添加一个del的命令
cobra add mm 添加一个mm的命令
编译就可以直接运行,不需要一行代码
./appc -h
add A brief description of your command
del A brief description of your command
help Help about any command
mm A brief description of your command
如果执行命令
./appc add
add called
是不是很方便。
回到kubectl上面,它也是充分利用了这个工具包。