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 参数协同工作流程

下图展示了三个参数在节点滚动升级过程中的协同关系:

滚动升级参数协同流程 滚动升级参数协同流程 开始滚动升级 maxSurge:允许创建额外节点数 创建新节点(不超过 maxSurge) minReadySeconds:等待节点稳定就绪 maxUnavailable:允许同时不可用节点数 完成一个节点升级

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 参数配置决策树

以下决策树帮助运维人员根据集群规模选择参数:

参数配置决策树 参数配置决策树 节点数 ≤ 10? maxSurge=1 maxUnavailable=1 minReadySeconds=60 maxSurge=10% maxUnavailable=10% minReadySeconds=30

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。