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

Kubernetes 1.27:kubectl apply 中更安全、性能更高的修剪

使用 kubectl apply 命令进行声明式配置管理是创建或修改 Kubernetes 资源的黄金标准方法。然而,它带来的一个挑战是删除不再需要的资源。在 Kubernetes 1.5 版本中,引入了 --prune 标志来解决这个问题,允许 kubectl apply 自动清理从当前配置中删除的先前应用的资源。

不幸的是,现有的 --prune 实现存在设计缺陷,降低了其性能,并可能导致意外行为。主要问题源于缺乏对先前 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 作为父对象。但是,您也可以使用格式为 --applyset=configmaps/<name> 的 ConfigMap。如果所需的 Secret 或 ConfigMap 对象尚不存在,kubectl 将为您创建它。此外,可以启用自定义资源用作 ApplySet 父对象。

ApplySet 实现基于新的底层规范,可以通过提高互操作性来支持更高级别的生态系统工具。此规范的轻量级特性使这些工具能够继续使用现有的对象分组系统,同时选择加入 ApplySet 的元数据约定,以防止其他工具(例如 kubectl)意外更改。

基于 ApplySet 的修剪为 kubectl 中先前 --prune 实现的缺点提供了一个有希望的解决方案,并有助于简化您的 Kubernetes 资源管理。请尝试使用此新功能,并与社区分享您的经验——ApplySet 正在积极开发中,您的反馈非常宝贵!

其他资源

  • 有关如何使用基于 ApplySet 的修剪的更多信息,请阅读 Kubernetes 文档中的 使用配置文件声明式管理 Kubernetes 对象
  • 要深入了解此功能的技术设计,或了解如何在您自己的工具中实现 ApplySet 规范,请参阅 KEP 3659ApplySet:kubectl apply --prune 重新设计和毕业策略

如何参与?

如果您想参与 ApplySet 的开发,可以联系 SIG CLI 的开发人员。要提供有关该功能的反馈,请在 kubernetes/kubectl 存储库上提交错误报告请求增强功能