Kubernetes 系列 - 3. 启动工具 Cobra

116 阅读1分钟

3. 启动工具 Cobra

3.1 k8s使用示例

k8s启动的时候使用cobra进行构建,例如apiserver的启动流程为:

func main() {
    command := app.NewAPIServerCommand() // command类型为cobra.Command
    code := cli.Run(command)
    os.Exit(code)
}

基本所有的组件启动流程都是一致的,先读取命令行参数,组装成cobra.Command,然后再使用cli.Run跑起来。

启动大体流程如下:

image.png

图1. 启动流程

3.2 Cobra

Cobra 是一个用于构建命令行应用程序的库,它简单易用,支持子命令、标志等多种功能,非常适合构建命令行工具。

主要特点:

  1. 子命令支持:Cobra 支持多级子命令,可以轻松构建复杂的命令行工具。例如,git 命令有 git addgit commitgit push 等多个子命令。

  2. 标志(Flags)支持:Cobra 支持全局标志和局部标志,可以灵活地定义命令行参数。例如,--help 和 -v 等标志。

  3. 自动补全:Cobra 支持自动生成 shell 补全脚本,支持 bash、zsh、fish 和 PowerShell 等多种 shell。

  4. 命令别名:支持命令别名,用户可以为命令定义简短的别名,提高使用便利性。

3.2.1 读取命令行参数

执行cli.Run之后最后会执行到cobra.Command的Execute方法,其中使用os.Args读取命令行参数:

// ExecuteC executes the command.
func (c *Command) ExecuteC() (cmd *Command, err error) {
    ...
    args := c.args

    // Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155
    // 使用 os.Args 读取命令行参数
    if c.args == nil && filepath.Base(os.Args[0]) != "cobra.test" {
       args = os.Args[1:]
    }

    // initialize the hidden command to be used for shell completion
    c.initCompleteCmd(args)
    ...
    return cmd, err
}