本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes 1.29:将污点管理器与节点生命周期控制器解耦
这篇博文讨论了 Kubernetes 1.29 中的一项新功能,以改进基于污点的 Pod 驱逐处理。
背景
在 Kubernetes 1.29 中,引入了一项改进,以增强节点上基于污点的 Pod 驱逐处理。这篇博文讨论了对 node-lifecycle-controller 所做的更改,以分离其职责并提高整体代码的可维护性。
变更摘要
node-lifecycle-controller 之前结合了两个独立的功能:
- 根据节点的状况,向节点添加一组预定义的
NoExecute
污点。 - 对
NoExecute
污点执行 Pod 驱逐。
在 Kubernetes 1.29 版本中,基于污点的驱逐实现已从 node-lifecycle-controller 中移出,成为一个名为 taint-eviction-controller 的独立组件。这种分离旨在解耦代码、增强代码可维护性,并为未来对任一组件的扩展提供便利。
作为此变更的一部分,我们引入了额外的度量指标,以帮助你监控基于污点的 Pod 驱逐:
pod_deletion_duration_seconds
衡量了从 Pod 的污点效果被激活到通过 taint-eviction-controller 删除 Pod 之间的时间延迟。pod_deletions_total
报告了自启动以来 taint-eviction-controller 删除的 Pod 总数。
如何使用这项新功能?
新增了一个名为 SeparateTaintEvictionController
的新特性门控。该功能在 Kubernetes 1.29 中作为 Beta 版本默认启用。请参阅特性门控文档。
启用此功能后,用户可以选择性地通过在 kube-controller-manager 中设置 --controllers=-taint-eviction-controller
来禁用基于污点的驱逐。
要禁用新功能并使用 node-lifecylecycle-controller 中的旧污点管理器,用户可以设置特性门控 SeparateTaintEvictionController=false
。
使用场景
这项新功能将允许集群管理员扩展和增强默认的 taint-eviction-controller,甚至可以用自定义实现替换默认的 taint-eviction-controller,以满足不同需求。例如,可以更好地支持在本地磁盘上使用 PersistentVolume 的有状态工作负载。
常见问题解答
此功能是否会改变现有的基于污点的 Pod 驱逐行为?
不会,基于污点的 Pod 驱逐行为保持不变。如果特性门控 SeparateTaintEvictionController
被关闭,将继续使用带有污点管理器的旧版 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)