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

Kubernetes 1.29: 从 taint-manager 解耦 node-lifecycle-controller

本博客讨论了 Kubernetes 1.29 中的一项新功能,旨在改进基于污点 (taint) 的 Pod 驱逐处理。

背景

在 Kubernetes 1.29 中,引入了一项改进,以增强节点上基于污点 (taint) 的 Pod 驱逐处理。本博客讨论了对 node-lifecycle-controller 所做的更改,以分离其职责并提高整体代码的可维护性。

更改摘要

node-lifecycle-controller 之前结合了两个独立的功能

  • 根据节点的条件向节点添加一组预定义的 NoExecute 污点 (taint)。
  • NoExecute 污点 (taint) 上执行 Pod 驱逐。

随着 Kubernetes 1.29 的发布,基于污点 (taint) 的驱逐实现已从 node-lifecycle-controller 中移出,成为一个单独且独立的组件,称为 taint-eviction-controller。这种分离旨在解耦代码、增强代码可维护性,并便于未来对任一组件进行扩展。

作为更改的一部分,引入了额外的指标来帮助您监控基于污点 (taint) 的 Pod 驱逐

  • pod_deletion_duration_seconds 衡量 Pod 的污点 (taint) 效果激活时间与其通过 taint-eviction-controller 删除之间的时间延迟。
  • pod_deletions_total 报告自 taint-eviction-controller 启动以来删除的 Pod 总数。

如何使用新功能?

已添加一个新的特性门控 (feature gate),SeparateTaintEvictionController。该功能在 Kubernetes 1.29 中默认作为 Beta 版本启用。请参阅特性门控文档

当此功能启用时,用户可以通过在 kube-controller-manager 中设置 --controllers=-taint-eviction-controller 选择性地禁用基于污点 (taint) 的驱逐。

要禁用此新功能并使用 node-lifecylecycle-controller 中的旧 taint-manager,用户可以设置特性门控 SeparateTaintEvictionController=false

用例

此新功能将允许集群管理员扩展和增强默认的 taint-eviction-controller,甚至用自定义实现替换默认的 taint-eviction-controller,以满足不同需求。一个例子是更好地支持在本地磁盘上使用 PersistentVolume 的有状态工作负载。

常见问题 (FAQ)

此功能是否改变了基于污点 (taint) 的 Pod 驱逐的现有行为?

不,基于污点 (taint) 的 Pod 驱逐行为保持不变。如果特性门控 SeparateTaintEvictionController 被关闭,则将继续使用包含 taint-manager 的旧版 node-lifecycle-controller。

启用/使用此功能是否会导致现有 SLI/SLO 涵盖的任何操作所需时间增加?

不会。

启用/使用此功能是否会导致资源使用量(CPU、RAM、磁盘、IO 等)增加?

运行一个单独的 taint-eviction-controller 所导致的资源使用量增加可以忽略不计。

了解更多

更多详情,请参阅KEP

致谢

与任何 Kubernetes 功能一样,许多社区成员都做出了贡献,从编写 KEP 到实现新控制器以及审查 KEP 和代码。特别感谢:

  • Aldo Culquicondor (@alculquicondor)
  • Maciej Szulik (@soltysh)
  • Filip Křepinský (@atiratree)
  • Han Kang (@logicalhan)
  • Wei Huang (@Huang-Wei)
  • Sergey Kanzhelevi (@SergeyKanzhelev)
  • Ravi Gudimetla (@ravisantoshgudimetla)
  • Deep Debroy (@ddebroy)