Kubernetes 开发【3】——kubectl插件开发

目录

前言 

最简单的插件模式

命令行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 传参需求

实际的命令行工具可能需要我们通过 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机制并推送到钉/企微机器人

你可能感兴趣的:(Kubernetes二次开发,golang学习之路,kubernetes,云原生,golang)