Kubernetes 滚动更新
零停机部署,滚动更新策略和就绪探针。
容器进阶
为什么
滚动更新逐个替换 pod,确保零停机。就绪探针使新 pod 就绪才收流量。maxSurge 和 maxUnavailable 控速度。
何时使用
无状态服务用滚动更新。风险变更用蓝绿或金丝雀。
如何做
1. 策略 — RollingUpdate(默认)
2. maxSurge — 更新时额外 pod(如 25%)
3. maxUnavailable — 更新时下线 pod(如 25%)
4. readinessProbe — 门控流量到就绪 pod
5. progressDeadlineSeconds — 卡住则失败
6. 暂停 — kubectl rollout pause
7. 撤销 — kubectl rollout undo
示例
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata: { name: myapp }
spec:
replicas: 6
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 2 # 更新时 2 额外 pod
maxUnavailable: 1 # 最多 1 pod 下线
template:
spec:
containers:
- name: app
image: myapp:v2
readinessProbe:
httpGet: { path: /health, port: 3000 }
initialDelaySeconds: 5
periodSeconds: 5
# 命令
kubectl set image deployment/myapp app=myapp:v2
kubectl rollout status deployment/myapp
kubectl rollout undo deployment/myapp # 回滚
常见问题
- ⚠部署卡 — 就绪探针失败,新 pod 永未就绪
- ⚠停机 — 无就绪探针,流量到未就绪 pod
- ⚠环境间配置漂移 — 使用基础设施即代码(Terraform/Pulumi)保持 dev/staging/prod 一致
最佳实践
- ✓始终设 readinessProbe — 门控流量,零停机
- ✓严格零停机设 maxUnavailable: 0 — 永不减可用 pod
- ✓设置健康检查和优雅关闭 — 处理 SIGTERM 以在退出前排空进行中的请求