本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

用 kubectl 插件将你的想法带给世界

kubectl 是与 Kubernetes 交互最关键的工具,必须满足多种用户角色,每个角色都有自己的需求和观点。实现您所需 kubectl 功能的一种方法是向 kubectl 构建新功能。

将命令构建到 kubectl 中的挑战

然而,说起来容易做起来难。作为 Kubernetes 如此重要的基石,对 kubectl 的任何有意义的更改都需要通过 Kubernetes 增强提案 (KEP) 来预先讨论预期的更改。

在实现方面,您会发现 kubectl 是一项精巧而复杂的工程。您可能需要很长时间才能适应代码库的流程和风格,才能完成您想实现的目标。接下来是审查过程,它可能会经过几轮,直到满足 Kubernetes 维护者的所有要求——毕竟,他们需要从功能合并之日起接管该功能的所有权并进行维护。

如果一切顺利,您终于可以高兴了。您的代码将随下一个 Kubernetes 版本一起发布。嗯,这可能意味着如果您不走运,您需要再等 3 个月才能在 kubectl 中发布您的想法。

所以这是顺利的快乐之路。但您的新功能可能永远无法进入 kubectl,这有很多充分的理由。首先,kubectl 有其特定的外观和感觉,违反这种风格将不被维护者接受。例如,一个产生带颜色输出的交互式命令将与 kubectl 的其余部分不一致。此外,当涉及到只对极少数用户有用的工具或命令时,维护者可能会简单地拒绝您的提案,因为 kubectl 需要满足常见需求。

但这并不意味着您无法将您的想法提供给 kubectl 用户。

如果您无需更改 kubectl 即可添加功能呢?

这就是 kubectl 插件的亮点所在。自 kubectl v1.12 起,您只需将可执行文件放入您的 PATH 中,这些文件遵循 kubectl-myplugin 的命名模式。然后您可以将此插件作为 kubectl myplugin 执行,它将感觉就像 kubectl 的一个普通子命令。

插件让您有机会尝试新的体验,例如终端 UI、彩色输出、专门功能或其他创新想法。您可以发挥创意,因为您是自己插件的所有者。

此外,插件为您想要向 kubectl 提议的命令提供了安全的实验空间。通过作为插件预发布,您可以更快地将您的功能推向最终用户,并快速收集反馈。例如,kubectl-debug 插件被提议在 KEP 中成为 kubectl 的内置命令)。同时,插件作者可以发布功能并使用插件机制收集反馈。

如何开始开发插件

如果您已经有了插件的想法,如何最好地实现它?首先您必须问自己是否可以将其实现为现有 kubectl 功能的包装器。如果是这样,将插件编写为 shell 脚本通常是最好的方法,因为生成的插件体积小、跨平台工作,并且由于未经编译而具有高度信任度。

另一方面,如果插件逻辑复杂,通用语言通常更好。这里的经典选择是 Go,因为您可以使用出色的 client-go 库与 Kubernetes API 交互。Kubernetes 维护的 sample-cli-plugin 演示了一些最佳实践,可以用作新插件项目的模板。

开发完成后,您只需将插件发布给 Kubernetes 用户。为了获得最佳的插件安装体验和可发现性,您应该考虑通过 krew 插件管理器进行。有关 kubectl 插件技术细节的深入讨论,请参阅 kubernetes.io 上的文档。