K8s中滚动更新实战

Kubernetes 滚动更新实战指南:零停机的艺术(生产环境版)

作为云原生时代的核心编排工具,Kubernetes 的滚动更新是保障业务连续性的杀手级功能。本文将从生产环境视角,解析滚动更新的完整流程和进阶配置。(经验值+1,已复盘校验)


一、滚动更新核心流程(含生产级配置)

  1. Deployment 定义(必会配置)

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-prod  # 生产环境命名规范
    spec:
      replicas: 5       # 根据业务负载设置
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxUnavailable: 20%  # 最大不可用比例
          maxSurge: 1          # 最大激增Pod数 
      selector:
        matchLabels:
          app: myapp
      template:
        metadata:
          labels:
            app: myapp
        spec:
          containers:
          - name: myapp
            image: myapp:v1.2.3-prod  # 生产镜像标签规范
            readinessProbe:           # 就绪探针(生产必配)
              httpGet:
                path: /health
                port: 8080
              initialDelaySeconds: 5
              periodSeconds: 3
    

    📌 生产要点:

    • 必须配置 readinessProbe 控制流量接入时机
    • 建议配置 maxSurge/maxUnavailable 平衡更新速度与稳定性
    • 镜像标签避免使用 latest,需明确版本号
  2. 更新触发(两种生产常用方式)

    # 方式1:修改yaml后apply(适合CICD流水线)
    kubectl apply -f deployment.yaml
    
    # 方式2:直接修改镜像版本(适合临时热修复)
    kubectl set image deployment/myapp-prod myapp=myapp:v1.2.4-prod --record
    
  3. 滚动更新过程(底层原理级解析)

    • 创建新 ReplicaSet 并逐步扩容
    • 旧 ReplicaSet 同步缩容
    • 通过就绪探针控制流量切换
    • 分批策略:默认25% Pod 更新(可通过策略调整)
  4. 生产级监控命令

    # 实时查看更新进度
    kubectl rollout status deployment/myapp-prod 
    
    # 查看新旧ReplicaSet版本
    kubectl get replicasets -l app=myapp
    
    # 监控Pod状态变化(生产推荐)
    watch -n 1 "kubectl get pods -l app=myapp | grep -v Terminating"
    
  5. 紧急回滚操作(必须掌握的保命技能)

    # 回退到上一个稳定版本
    kubectl rollout undo deployment/myapp-prod
    
    # 查看历史版本(需--record记录变更)
    kubectl rollout history deployment/myapp-prod
    
    # 回滚到指定版本
    kubectl rollout undo deployment/myapp-prod --to-revision=2
    

二、生产环境进阶技巧

  1. 金丝雀发布策略

    # 先更新1个Pod验证新版本
    kubectl set image deployment/myapp-prod myapp=myapp:v1.2.4-prod && \
    kubectl rollout pause deployment/myapp-prod
    
    # 验证通过后继续更新
    kubectl rollout resume deployment/myapp-prod
    
  2. 资源预留配置(避免节点过载)

    resources:
      requests:
        memory: "256Mi"
        cpu: "100m"
      limits:
        memory: "512Mi" 
        cpu: "500m"
    
  3. 优雅终止配置(防止请求中断)

    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "sleep 30; nginx -s quit"]
    

三、常见踩坑点排查

现象 排查方向 解决方式
滚动更新卡死 检查新Pod就绪状态 调整就绪探针阈值/检查应用健康检测逻辑
旧Pod未及时终止 查看Finalizers配置 检查PDB(PodDisruptionBudget)配置
更新后CPU飙升 对比新旧版本资源限制 完善资源限制/压力测试
服务短暂不可用 调整maxUnavailable值 增加存活探针检查频率

四、最佳实践总结

  1. 更新前在测试环境验证镜像版本
  2. 生产环境必须配置就绪/存活探针
  3. 使用kubectl rollout status监控过程
  4. 通过版本历史记录保留回退能力
  5. 重大更新采用金丝雀发布策略

通过合理配置滚动更新策略,配合完善的监控告警系统,可实现全年无停机的持续交付流水线。注:本文涉及的YAML示例已通过Kubernetes 1.28版本验证,适用于生产环境部署。

posted on 2025-02-28 10:39  Leo-Yide  阅读(149)  评论(0)    收藏  举报