k8s优雅滚动更新实践

在Kubernetes中,优雅滚动更新(Graceful Rolling Update)是确保服务不中断的关键策略。以下为实践方法和注意事项:


滚动更新配置

在Deployment中定义strategy字段,配置滚动更新参数:

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%        # 允许超出副本数的最大比例
      maxUnavailable: 25%  # 更新期间允许不可用的副本比例

优雅终止Pod

  1. PreStop Hook
    在Pod模板中配置lifecycle.preStop,确保Pod终止前完成清理:

    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "sleep 30 && nginx -s quit"]
    
  2. terminationGracePeriodSeconds
    设置优雅终止宽限期(默认30秒):

    terminationGracePeriodSeconds: 60
    

就绪探针(Readiness Probe)

确保新Pod完全就绪后再接收流量:

readinessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

流量切换策略

  1. Service Mesh
    通过Istio/Linkerd实现流量镜像或金丝雀发布,逐步验证新版本。

  2. Ingress Controller
    Nginx/ALB Ingress支持基于权重的流量拆分,例如:

    annotations:
      nginx.ingress.kubernetes.io/canary: "true"
      nginx.ingress.kubernetes.io/canary-weight: "10%"
    

版本回滚

  1. 检查更新历史:

    kubectl rollout history deployment/<deployment-name>
    
  2. 快速回滚到上一版本:

    kubectl rollout undo deployment/<deployment-name>
    

监控与验证

  1. 观察更新状态:

    kubectl rollout status deployment/<deployment-name>
    
  2. 监控指标:

    • Pod启动/终止日志
    • 服务请求成功率(通过Prometheus/Grafana)
    • 资源利用率(CPU/Memory)

最佳实践

  • 每次更新仅变更一个变量(如镜像版本)。
  • 在非高峰时段执行更新。
  • 提前测试小规模流量(金丝雀发布)。
  • 确保应用支持向后兼容的数据格式。
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐