本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.27:kubectl apply 中更安全、更高性能的修剪
使用 kubectl apply
命令进行声明式配置管理是创建或修改 Kubernetes 资源的首选方法。然而,它带来的一个挑战是删除不再需要的资源。在 Kubernetes 1.5 版本中,引入了 --prune
标志来解决这个问题,允许 kubectl apply 自动清理从当前配置中移除的、先前已应用的资源。
不幸的是,现有的 --prune
实现存在设计缺陷,降低了其性能并可能导致意外行为。主要问题源于上一次 apply
操作没有明确地编码先前应用的对象集合,因此需要容易出错的动态发现机制。对象泄漏、无意中过度选择资源以及与自定义资源的有限兼容性是此实现的一些显著缺点。此外,它与客户端 apply 的耦合阻碍了用户升级到更优越的服务器端 apply 机制。
kubectl
的 1.27 版本引入了一个经过改进的修剪功能的 Alpha 版本,解决了这些问题。这个新的实现基于一个名为 ApplySet 的概念,承诺提供更好的性能和安全性。
ApplySet 是一组与集群上的一个**父**对象相关联的资源,通过标准化的标签和注解来识别和配置。额外的标准化元数据允许在集群内准确识别 ApplySet 的**成员**对象,简化了修剪等操作。
要利用基于 ApplySet 的修剪功能,请设置 KUBECTL_APPLYSET=true
环境变量,并在你的 kubectl apply
调用中包含 --prune
和 --applyset
标志。
KUBECTL_APPLYSET=true kubectl apply -f <directory/> --prune --applyset=<name>
默认情况下,ApplySet 使用一个 Secret 作为父对象。但是,你也可以使用 ConfigMap,格式为 --applyset=configmaps/<name>
。如果你期望的 Secret 或 ConfigMap 对象尚不存在,kubectl
会为你创建它。此外,还可以启用自定义资源作为 ApplySet 的父对象。
ApplySet 的实现基于一个新的低级规范,该规范可以通过提高互操作性来支持更高级别的生态系统工具。该规范的轻量级特性使这些工具能够继续使用现有的对象分组系统,同时选择性地采用 ApplySet 的元数据约定,以防止被其他工具(如 kubectl
)意外更改。
基于 ApplySet 的修剪功能为 kubectl
中旧版 --prune
实现的缺点提供了一个有前景的解决方案,并可以帮助简化你的 Kubernetes 资源管理。请尝试这个新功能,并与社区分享你的经验——ApplySet 正在积极开发中,你的反馈非常宝贵!
其他资源
- 有关如何使用基于 ApplySet 的修剪功能的更多信息,请阅读 Kubernetes 文档中的使用配置文件对 Kubernetes 对象进行声明式管理。
- 要更深入地了解此功能的技术设计,或学习如何在自己的工具中实现 ApplySet 规范,请参阅 KEP 3659:*ApplySet:
kubectl apply --prune
重新设计和毕业策略*。
我如何参与?
如果你想参与 ApplySet 的开发,可以通过 SIG CLI 与开发人员联系。要提供有关该功能的反馈,请在 kubernetes/kubectl
仓库中提交一个 Bug 或请求一个功能增强。