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

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

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

不幸的是,现有 --prune 的实现存在设计缺陷,降低了其性能,并可能导致意外行为。主要问题源于先前的 apply 操作没有明确编码先前应用的集合,因此需要容易出错的动态发现。对象泄露、无意中过度选择资源以及与自定义资源的兼容性有限是此实现的一些显著缺点。此外,它与客户端 apply 的耦合阻碍了用户升级到更优越的服务器端 apply 机制。

kubectl 的 1.27 版本引入了一个经过改进的 pruning 实现的 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 3659ApplySet:kubectl apply --prune 重新设计和毕业策略

如何参与?

如果您想参与 ApplySet 的开发,可以通过 SIG CLI 与开发者联系。要提供有关此功能的反馈,请在 kubernetes/kubectl 仓库中提交错误报告提交增强请求