k8s pod优雅滚动更新实践
k8s优雅滚动更新实践
在Kubernetes中,优雅滚动更新(Graceful Rolling Update)是确保服务不中断的关键策略。以下为实践方法和注意事项:
滚动更新配置
在Deployment中定义strategy
字段,配置滚动更新参数:
spec:strategy:type: RollingUpdaterollingUpdate:maxSurge: 25% # 允许超出副本数的最大比例maxUnavailable: 25% # 更新期间允许不可用的副本比例
优雅终止Pod
-
PreStop Hook
在Pod模板中配置lifecycle.preStop
,确保Pod终止前完成清理:lifecycle:preStop:exec:command: ["/bin/sh", "-c", "sleep 30 && nginx -s quit"]
-
terminationGracePeriodSeconds
设置优雅终止宽限期(默认30秒):terminationGracePeriodSeconds: 60
就绪探针(Readiness Probe)
确保新Pod完全就绪后再接收流量:
readinessProbe:httpGet:path: /healthport: 8080initialDelaySeconds: 5periodSeconds: 5
流量切换策略
-
Service Mesh
通过Istio/Linkerd实现流量镜像或金丝雀发布,逐步验证新版本。 -
Ingress Controller
Nginx/ALB Ingress支持基于权重的流量拆分,例如:annotations:nginx.ingress.kubernetes.io/canary: "true"nginx.ingress.kubernetes.io/canary-weight: "10%"
版本回滚
-
检查更新历史:
kubectl rollout history deployment/<deployment-name>
-
快速回滚到上一版本:
kubectl rollout undo deployment/<deployment-name>
监控与验证
-
观察更新状态:
kubectl rollout status deployment/<deployment-name>
-
监控指标:
- Pod启动/终止日志
- 服务请求成功率(通过Prometheus/Grafana)
- 资源利用率(CPU/Memory)
最佳实践
- 每次更新仅变更一个变量(如镜像版本)。
- 在非高峰时段执行更新。
- 提前测试小规模流量(金丝雀发布)。
- 确保应用支持向后兼容的数据格式。