K8S 滚动更新策略揭秘:从理论到案例

533 阅读3分钟

Kubernetes的滚动更新(Rolling Update)是一种在不中断服务的情况下逐步替换Pod的部署策略,通过分批替换旧版本实例实现平滑升级。


一、滚动更新基本原理

滚动更新的核心在于渐进式替换,通过Deployment控制器协调新旧ReplicaSet的交替更新,确保服务连续性:

  1. 分批替换:逐个或按比例替换旧Pod,而非一次性全量更新。
  2. 新旧共存:更新期间新旧Pod短暂共存,流量逐步迁移到新Pod。
  3. 健康检查:新Pod必须通过readinessProbelivenessProbe检测才会继续替换,否则暂停更新。若不配置健康检查,则默认启动就是健康。

二、关键配置参数

滚动更新通过以下参数控制更新速度和稳定性:

  1. maxSurge
    • 定义允许超过期望副本数的最大Pod数量(绝对值或百分比)。 • 作用:加速更新,允许同时创建更多新Pod。 • 示例:若replicas=5maxSurge=20%,则最多可同时运行6个Pod(5+1)。

  2. maxUnavailable
    • 定义允许不可用的旧Pod数量(绝对值或百分比)。 • 作用:限制更新期间服务可用性的下限。 • 示例:若replicas=5maxUnavailable=20%,则至少保持4个Pod可用。


三、滚动更新策略类型

根据参数组合,常见策略分为三类:

策略类型参数配置特点
默认策略maxSurge=25%, maxUnavailable=25%或者maxSurge=1, maxUnavailable=1平衡速度与稳定性,适用于大多数场景(如电商、金融)。
激进策略maxSurge=50%, maxUnavailable=50%快速更新,适用于非核心业务或测试环境,但可能短暂影响服务可用性。
保守策略maxSurge=0, maxUnavailable=1严格限制不可用Pod数量,适用于对稳定性要求极高的场景(如支付系统)。

四、案例说明

maxSurge为1,maxUnavailable为1的配置如下

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1          # 允许新增1个Pod
      maxUnavailable: 1    # 允许1个旧Pod不可用

过程说明

步骤 1:创建第1个新Pod,并终止第1个旧Pod
  • 创建新Pod:Kubernetes立即创建 1个新Pod(利用maxSurge=1的额度)。

  • 终止旧Pod同时终止1个旧Pod(利用maxUnavailable=1的额度)。

  • 当前状态

    • 运行中的Pod总数:4(原副本) + 1(新增) - 1(终止) = 4
    • Pod分布:3个旧Pod + 1个新Pod
步骤 2:创建第2个新Pod,并终止第2个旧Pod
  • 创建新Pod:当新Pod就绪后,再创建 1个新Pod(再次利用maxSurge=1的额度)。

  • 终止旧Pod:同时终止 1个旧Pod

  • 当前状态

    • 运行中的Pod总数:3旧 + 1新 + 1新(新增) - 1旧(终止) = 4
    • Pod分布:2个旧Pod + 2个新Pod
步骤 3:重复替换,直至完成
  • 每次循环中,创建 1个新Pod 并终止 1个旧Pod
  • 最终所有旧Pod被替换为新Pod。

总结

Kubernetes滚动更新通过Deployment控制器和健康检查机制实现了平滑升级,是保障服务高可用的核心工具。合理配置maxSurgemaxUnavailable、结合优雅停机与监控告警,能有效平衡更新速度与稳定性。实际应用中需根据业务场景选择策略,例如金融系统采用保守参数,而内部工具可偏向激进策略。