K8s Deployment 滚动更新优化:配置 maxUnavailable 与 maxSurge 实现零 downtime 发布
在预发布环境测试不同流量模式下的更新表现,确保就绪探针能准确反映业务真实状态。对于有状态服务,需结合 StatefulSet 和持久化存储方案。参数,可确保在更新过程中始终保持可用实例处理流量。
·
Kubernetes Deployment 滚动更新优化:实现零停机发布
通过合理配置 maxUnavailable 和 maxSurge 参数,可确保在更新过程中始终保持可用实例处理流量。以下是实现零停机发布的关键策略:
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$:
- 创建新 Pod:$n \times 25% = 1$ 个新 Pod(总 Pod 数=5)
- 新 Pod 就绪后,逐步替换旧 Pod(始终保证 4 个可用)
- 更新过程始终保持: $$ \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 和持久化存储方案。
更多推荐


所有评论(0)