Cluster API v1.12: 原地更新与链式升级
概述
Cluster API 通过声明式管理方式,为 Kubernetes 集群的完整生命周期提供支持,允许平台团队定义集群的期望状态,并依靠控制器持续进行调和,确保实际状态与期望状态一致。类似于 Kubernetes 中使用 Deployment 或 StatefulSet 管理 Pod,Cluster API 使用 KubeadmControlPlane 管理控制面节点,使用 MachineDeployment 管理工作节点。在 SRE 实践中,安全、可控地管理大量集群的生命周期(如创建、更新、升级)是保障服务可靠性和运营效率的核心挑战。
Cluster API v1.12.0 的发布,引入了原地更新和链式升级两大特性,旨在减少常见生命周期操作中的摩擦,让用户和 SRE 团队能更轻松、更安全地管理 Kubernetes 集群。这些改进体现了项目在保持不可变基础设施原则优势的同时,持续降低工作负载中断的演进方向。
核心概念
原地更新 (In-Place Updates)
传统上,Cluster API(和 Kubernetes Deployment)采用不可变滚动更新策略:当机器的规格(Spec)发生变更时,会创建一台新的机器并销毁旧的机器,从而实现滚动发布。这种方法的优点在于简单、可预测且不依赖于机器的具体配置(如操作系统或启动机制)。
v1.12.0 引入的原地更新功能,扩展了这一模型。它允许用户在不删除和重建机器的情况下,对现有机器直接应用某些更改。Cluster API 控制器现在拥有了一个决策点:当检测到规格变更时,它会自动选择是采用传统的滚动更新(创建新机器),还是调用新的更新扩展(Update Extension)来在现有机器上原地执行更改。
选择哪种方式取决于变更的性质。Cluster API 的维护者建议,对于不会导致节点驱逐或 Pod 重启的变更(例如修改机器的用户凭证),使用原地更新更为合适;而对于必然会引起工作负载中断的变更,则继续使用滚动更新。
链式升级 (Chained Upgrades)
在 Kubernetes 的发布周期中,用户通常需要逐个次要版本(例如 1.32 -> 1.33 -> 1.34)进行升级。ClusterClass 和托管拓扑功能为 Kubernetes-as-a-Service 平台提供了强大的抽象。
v1.12.0 引入的链式升级功能,允许用户在一次操作中声明一个跨多个次要版本的目标版本(例如,从 1.32 直接升级到 1.35)。Cluster API 会负责安全地编排所需的中间升级步骤,自动计算升级计划并按正确的顺序(先控制面,后工作节点)执行。它还会根据 Kubernetes 版本偏差策略,尽可能优化工作节点的升级路径,可能跳过某些中间版本。
实践
对于集群操作者和 SRE 团队而言,这些新特性直接体现在更新 Kubernetes 资源定义上。
-
原地更新实践:
- 确保你的 Cluster API 版本为 v1.12.0 或更高。
- 对于需要原地更新的特定更改类型(如机器凭证更新),你需要实现或使用已有的更新扩展。
- 当你修改
Machine或KubeadmControlPlane的.spec时,Cluster API 会根据变更内容自动判断。如果变更适合原地更新且存在相应的扩展,它将执行原地更新而非滚动创建。 - 该特性支持在
KubeadmControlPlane和MachineDeployment上使用。
-
链式升级实践:
- 此功能基于
ClusterClass和托管拓扑。 - 在声明集群资源的 YAML 文件中,将
.spec.topology.version字段直接设置为你期望的最终 Kubernetes 版本(例如v1.35.0),无需关心中间版本。 - Cluster API 控制器将自动: a. 计算从当前版本到目标版本的最优升级计划(包括控制面和工作节点的顺序)。 b. 执行控制面升级(可能多次滚动)。 c. 按计划升级工作节点。
- 你可以通过升级计划运行时扩展来定制升级计划的计算逻辑,或通过生命周期钩子在升级的特定阶段(如控制面升级完成后)执行自定义任务,例如升级集群插件。
- 此功能基于
SRE 要点
-
与可靠性的关联:
- 原地更新减少了因滚动更新而导致的不必要 Pod 重调度和节点驱逐,从而降低了升级期间的Pod 中断风险,提升了服务的可用性。
- 链式升级将复杂的多版本升级过程自动化,减少了人工操作步骤和潜在的配置错误,使得大规模集群的版本演进更加安全、可预测。
- 两者共同减少了集群生命周期管理的“操作摩擦”,使 SRE 团队能将精力更多地集中在架构优化和故障根治上。
-
最佳实践与反模式:
-
相关指标 (SLI/SLO/SLA):
- 监控集群升级耗时(从开始到目标版本完全就绪)。
- 监控升级过程中的节点 NotReady 时长和Pod 重调度次数。
- 可以将**“重大版本升级期间的服务错误率”**作为一个 SLI,并设定相应的 SLO,以确保升级过程不会显著影响用户体验。
-
可观测性与事件响应:
- 密切关注 Cluster API 控制器自身的日志和指标,以了解升级计划的制定与执行状态。
- 为升级过程中的关键事件(如控制面升级开始/完成、工作节点批量升级开始)设置告警,便于事件响应和过程审计。