目录
前言
最简单的插件模式
命令行Args传参需求
本文仅简单介绍 kubectl 插件开发模式,不做深入扩展。
仅通过开发一个 kubectl pods 命令,来展示开发 kubectl 的方法和技巧
首先介绍一个 kubectl 常用的插件库 krew:GitHub - kubernetes-sigs/krew: Find and install kubectl plugins
其本身也是一个 kubectl 插件,我们可以通过 kubectl plugin list 查看所有可执行的插件。krew 是对插件的一种扩展 ,以 kuebctl krew 运行,可以通过这个工具来管理和安装公网上发布的插件。
要构造一个最简单的插件,只需要编译出一个可执行文件 kubectl-test,并放在机器环境变量$PATH 所在的路径下就完成了。
可以通过执行 kubectl test 来测试。
实际的命令行工具可能需要我们通过 Args 传入各种参数以满足不同的需求。
这里介绍一个非常实用的CLI命令行工具库:Cobra
GitHub - spf13/cobra: A Commander for modern Go CLI interactions
事实上,kubectl 也正是基于此库开发的,该工具可以为我们自动生成命令 Use(用法)、Example(实例)以及可以传入对应的执行函数,也可以装 kubectl 本来就带的通配的Args参数合并到我们要构建的插件中。
首先我们通过 generic 的方法生成restClient,这里的cfgFlags 里包含了例如 --namespacce 这样的 flag,用于之后我们的 flag 合并(或者叫继承)。
func InitClient() *kubernetes.Clientset {
cfgFlags = genericclioptions.NewConfigFlags(true)
config, err := cfgFlags.ToRawKubeConfigLoader().ClientConfig()
if err != nil {
log.Fatalln(err)
}
c, err := kubernetes.NewForConfig(config)
if err != nil {
log.Fatalln(err)
}
return c
}
我们首先构建一个 Cobra Command,定义其用法,参数传递,以及执行的逻辑
func RunCmd(run func(cmd *cobra.Command, args []string) error) {
cmd := &cobra.Command{
Use: "kubectl pods [flags]",
Short: "list pods",
Example: "kubectl pods [flags]",
SilenceUsage: true,
RunE: run,
}
MergeFlags(cmd)
//添加参数
//BoolVar用来支持 是否
cmd.Flags().BoolVar(&ShowLabels, "show-labels", false, "kubectl pods --show-labels")
cmd.Flags().StringVar(&Labels, "labels", "", "kubectl pods --labels=\"app=nginx\"")
err := cmd.Execute()
if err != nil {
log.Fatalln(err)
}
}
其中RunE的入参是一个函数,是调用命令执行的内容,我们需要实现其中的逻辑,例如打印 pod 的信息;而执行命令所带的参数可以通过cmd.Flags().GetString("key")获取到。
MergeFlags中封装的是——
cfgFlags.AddFlags(cmd.Flags())
这步会把像 --namespace 这种 flag 都定义进去;
此外,我们可以还可以通过调用 cmd.Flags() 下的方法来自定义 flag;
如上代码所示,我们完成了 namespace,labels 等 flag 的定义,但具体的实现我们还要在 run 函数中完成。
最后,运行 cmd。
我们可以通过 restClient 去请求 apiserver 获得 pod 列表,并根据上一步中获得的 flag 去过滤数据;
这里再介绍一个用于命令行的库:tablewriter
https://github.com/olekukonko/tablewriter
专门用于构建命令行执行返回结果的制表过程,我们可以使用 README.md 中的 Example 去渲染我们的 pod 列表并输出。
最后同样是通过编译放入 $PATH 路径并执行,有如下效果:
Kubernetes二次开发系列文章:
Kubernetes 开发【1】——webhook 实现 API Server 请求拦截和修改
Kubernetes开发【2】—— Informer的简单应用,构建Event List&Watch机制并推送到钉/企微机器人