随笔 - 378  文章 - 0  评论 - 5  阅读 - 6085

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   Leo-Yide  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示