本文已发布一年以上。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。
使用 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 上的文档。