本文发布时间超过一年。旧文章可能包含过期内容。请检查页面中的信息自发布以来是否已失效。
使用 kubectl 插件将您的想法带给世界
kubectl
是与 Kubernetes 交互的最关键工具,必须满足多种用户角色的需求和观点。一种让 kubectl
实现您所需功能的方法是将新功能构建到 kubectl
中。
将命令构建到 kubectl
中的挑战
然而,这说起来容易做起来难。作为 Kubernetes 如此重要的基石,对 kubectl
的任何有意义的更改都需要经过一个 Kubernetes Enhancement Proposal (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 上的文档。