最佳实践
本指南描述了开发 kubectl
插件时使用的方法。在将插件提交到 Krew 之前,请先查看这些方法。
虽然 Krew 项目团队不会强制执行有关插件工作方式的准则,但遵守这些方法可以让您的插件为更多用户工作并表现得更具可预测性。
选择语言
大多数 kubectl
插件是用 Go 或 bash 脚本编写的。
如果您计划使用 Go 编写插件,请查看
- client-go:与 Kubernetes API 和 kubeconfig 文件一起使用的 Go SDK
- cli-runtime:一组用于与
kubectl
共享代码的程序包,以打印输出或 共享命令行选项 - sample-cli-plugin:Go 中的一个示例插件实现
与 kubectl 保持一致性
对于插件的形状,Krew 没有强求任何规则。
但是,如果您使用 kubectl
支持常用的命令行选项,则可以帮助您的用户简化日常工作。
例如,建议您支持 kubectl
使用的以下命令行标记
-h
/--help
-n
/--namespace
-A
/--all-namespaces
此外,通过使用 genericclioptions 程序包 (Go),您可以在您的插件中支持在 kubectl options
(比如 --kubeconfig
、--context
和许多其它选项)中列出的全局命令行标记。
导入身份验证插件 (Go)
默认情况下,使用client-go的插件无法对许多云提供商上的 Kubernetes 集群进行身份验证。为解决此问题,请将以下 import 包括在您的插件中
import _ "k8s.io/client-go/plugin/pkg/client/auth"
使用 kubectl
前缀修改用法和帮助信息
许多用户将通过不带任何参数(可能会触发帮助消息)或带有-h
/--help
参数来调用您的插件来发现如何使用您的插件。
因此,将您的使用字符串更改为在插件名称前显示kubectl
前缀非常有用。例如
Usage:
kubectl popeye [flags]
若要确定您的可执行文件是否作为kubectl
插件运行,您可以查看argv[0]
,它将包含kubectl-
前缀
-
Go
if strings.HasPrefix(filepath.Base(os.Args[0]), "kubectl-") { }
-
Bash
if [[ "$(basename "$0")" == kubectl-* ]]; then # invoked as plugin # ... fi