K8S源码及定制化系列-源码解读第一步Kubectl(三)

本节重点介绍 :

  • kubectl的职责和 kubectl 的代码原理

  • cobra库的使用简介

kubectl的职责

  • 主要的工作是处理用户提交的东西(包括,命令行参数,yaml文件等)

  • 然后其会把用户提交的这些东西组织成一个数据结构体

  • 然后把其发送给 API Server

  Kubectl系统架构图

K8S源码及定制化系列-源码解读第一步Kubectl(三)_第1张图片

 

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 表示执行动作

  • <

你可能感兴趣的:(Golang,云原生,kubernetes,容器,云原生)