4、滚动升级策略:maxSurge、maxUnavailable、minReadySeconds 参数配置
Kubernetes 节点滚动升级的核心控制参数包括 maxSurge、maxUnavailable 和 minReadySeconds。这三个参数共同决定了升级的速率、可用性容忍度以及新节点的健康准入条件。在 Policy as Code 场景中,这些参数是策略引擎(如 OPA/Gatekeeper)重点校验的字段,用于确保集群升级行为符合运维规范。
4.1 参数定义与作用
| 参数 | 类型 | 默认值 | 作用域 | 核心作用 |
|---|---|---|---|---|
| maxSurge | int / 百分比 | 25% | 节点池 / MachineDeployment | 允许超出期望副本数的最大额外节点数,控制升级并行度 |
| maxUnavailable | int / 百分比 | 25% | 节点池 / MachineDeployment | 升级过程中允许不可用节点的最大数量,保障业务容量 |
| minReadySeconds | int | 0 | 节点池 / MachineDeployment | 新节点就绪后需等待的秒数,防止快速波动导致误判 |
策略要点:在 Policy as Code 中,
maxSurge 和 maxUnavailable 通常被约束为不超过 33%(或 1 个节点),以平衡升级速度与集群稳定性。minReadySeconds 建议至少设置为 30 秒,避免节点刚就绪就被纳入流量。
4.2 参数协同工作流程
下图展示了三个参数在节点滚动升级过程中的协同关系:
4.3 参数配置示例
以下是一个典型的节点池滚动升级配置(以 Cluster API 的 MachineDeployment 为例):
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
name: worker-pool-v1
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多允许额外创建 1 个节点
maxUnavailable: 1 # 最多允许 1 个节点不可用
template:
spec:
version: v1.27.3
minReadySeconds: 60 # 新节点就绪后等待 60 秒再继续升级
参数计算示例:假设集群有 5 个节点,
maxSurge=1,maxUnavailable=1。升级过程中最多同时存在 6 个节点(5+1),且最多只有 1 个节点处于不可用状态。这意味着升级期间至少有 4 个节点保持可用,业务容量不低于 80%。
4.4 参数组合策略对比
| 策略类型 | maxSurge | maxUnavailable | minReadySeconds | 适用场景 |
|---|---|---|---|---|
| 保守型 | 0 | 1 | 120 | 生产核心业务,严格保障容量 |
| 均衡型 | 1 | 1 | 60 | 大多数生产环境,兼顾速度与安全 |
| 快速型 | 25% | 25% | 30 | 开发测试环境,追求升级效率 |
| 批量型 | 3 | 2 | 10 | 非关键业务,快速完成大规模升级 |
策略风险提示:当
maxSurge 和 maxUnavailable 同时设置为较大值时(如 33%),升级过程中可能出现节点数量剧烈波动,导致 DNS 缓存、负载均衡器后端频繁变更,引发间歇性访问失败。建议在 Policy as Code 中限制两者之和不超过 50%。
4.5 Policy as Code 校验规则
在 OPA/Gatekeeper 策略中,通常对这三个参数做如下约束:
# 约束 maxSurge 和 maxUnavailable 不超过 1 或 33%
deny[msg] {
input.spec.strategy.rollingUpdate.maxSurge > 1
input.spec.strategy.rollingUpdate.maxSurge != "25%"
msg := "maxSurge 必须 ≤ 1 或 ≤ 25%"
}
deny[msg] {
input.spec.strategy.rollingUpdate.maxUnavailable > 1
input.spec.strategy.rollingUpdate.maxUnavailable != "25%"
msg := "maxUnavailable 必须 ≤ 1 或 ≤ 25%"
}
# 约束 minReadySeconds 至少 30 秒
deny[msg] {
input.spec.template.spec.minReadySeconds < 30
msg := "minReadySeconds 必须 ≥ 30 秒"
}
4.6 参数配置决策树
以下决策树帮助运维人员根据集群规模选择参数:
4.7 常见配置错误与避坑
- maxSurge 与 maxUnavailable 同时为 0:导致升级无法启动,因为既不能创建新节点也不能删除旧节点。
- minReadySeconds 设置过短(<10 秒):节点可能尚未完成 CNI 插件初始化就被标记为就绪,导致 Pod 调度到未完全准备好的节点。
- 百分比计算向下取整:当节点数较少时(如 3 个节点,25% 向下取整为 0),可能导致升级阻塞。建议小集群使用值。
- 忽略节点池扩缩容冲突:如果同时配置了自动扩缩容(Cluster Autoscaler),滚动升级期间的节点数量变化可能触发不必要的扩容或缩容。
最佳实践:在 Policy as Code 中,建议将
maxSurge 和 maxUnavailable 的百分比上限统一设置为 25%,并强制 minReadySeconds ≥ 30。对于生产集群,额外增加一条规则:当节点数 ≤ 5 时,maxSurge 和 maxUnavailable 必须使用值 1。