Kubernetes Deployment 滚动更新优化:实现零停机发布

通过合理配置 maxUnavailablemaxSurge 参数,可确保在更新过程中始终保持可用实例处理流量。以下是实现零停机发布的关键策略:

1. 核心参数解析
  • maxUnavailable:滚动更新期间允许不可用的最大 Pod 数量(绝对数或百分比)
  • maxSurge:允许超出期望副本数的最大 Pod 数量(绝对数或百分比)
  • 数学关系:
    $$ \text{可用 Pod 数} \geq (\text{replicas} - \text{maxUnavailable}) $$
2. 零停机推荐配置
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxUnavailable: 0     # 禁止任何Pod不可用
    maxSurge: 25%         # 允许创建25%的额外Pod

3. 工作原理解析

设副本数 $n=4$:

  1. 创建新 Pod:$n \times 25% = 1$ 个新 Pod(总 Pod 数=5)
  2. 新 Pod 就绪后,逐步替换旧 Pod(始终保证 4 个可用)
  3. 更新过程始终保持: $$ \text{可用 Pod 数} = n - \text{maxUnavailable} = 4 - 0 = 4 $$
4. 关键优化措施
  • 就绪探针必需配置
    readinessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 2
    

  • 资源预留:确保集群有足够资源处理 maxSurge 的额外 Pod
  • 渐进式流量切换:结合 Service Mesh 实现流量权重迁移
5. 不同场景配置建议
场景 maxUnavailable maxSurge 特点
关键业务系统 0 20-30% 绝对零中断
资源敏感环境 10% 10% 平衡资源与可用性
快速迭代应用 25% 25% 更新速度优先
6. 完整配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zero-downtime-app
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 25%
  template:
    spec:
      containers:
      - name: app
        image: nginx:1.25
        readinessProbe:
          httpGet:
            path: /ready
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 2

7. 验证命令
kubectl rollout status deployment/zero-downtime-app
kubectl get pods -w

最佳实践:在预发布环境测试不同流量模式下的更新表现,确保就绪探针能准确反映业务真实状态。对于有状态服务,需结合 StatefulSet 和持久化存储方案。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐