k8s资源之Deployment升级

Kubernetes Deployment升级全攻略:生产环境滚动更新实战手册

Deployment是Kubernetes最核心的部署单元,其升级过程直接影响业务稳定性。本文将揭秘生产环境滚动更新的完整流程,并提供经过千次部署验证的优化方案。


一、升级流程四部曲

滚动更新流程图

  1. 备战阶段

    # 预检清单
    kubectl get deployment <name> -o yaml > backup.yaml  # 配置备份
    kubectl rollout history deployment/<name>            # 查看历史版本
    kubectl get pods -l app=<label> --show-labels        # 标签验证
    
  2. 起航阶段

    • 镜像更新(推荐方式):
      kubectl set image deployment/<name> container=<new-image> --record
      
    • 完整配置更新:
      kubectl apply -f new-deploy.yaml --record
      
  3. 航行控制

    strategy:
      type: RollingUpdate
      rollingUpdate:
        maxSurge: 25%          # 最大激增Pod数 
        maxUnavailable: 20%    # 最大不可用比例
    

    黄金比例公式

    maxSurge + maxUnavailable ≤ 100%
    推荐设置:maxSurge=25%, maxUnavailable=0(零宕机升级)
    
  4. 到港确认

    kubectl rollout status deployment/<name> --timeout=5m
    kubectl get pods -l app=<label> -w  # 实时监控Pod状态
    

二、生产环境进阶配置

健康检查双保险

livenessProbe:
  httpGet:
    path: /healthz
    port: 8080
  initialDelaySeconds: 30  # 必须大于应用启动时间

readinessProbe: 
  exec:
    command: ["/bin/sh", "-c", "check_ready"]
  successThreshold: 3      # 连续3次成功才标记就绪

资源护航策略

resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "200m" 
    memory: "256Mi"

版本追踪神器

kubectl rollout history deployment/nginx --revision=3  # 查看特定版本
kubectl annotate deployment/nginx change-log="2023-08更新安全补丁"  # 添加变更记录

三、高阶运维技巧

  1. 分段式升级(适合大型集群)

    kubectl set image deployment/nginx nginx=nginx:1.19 --partition=3  # 分3批升级
    
  2. 流量染色验证

    template:
      metadata:
        labels:
          version: canary
    
    # 配合Service进行流量导流
    kubectl get svc -o jsonpath='{.spec.selector}' nginx-svc
    
  3. 紧急制动方案

    kubectl rollout pause deployment/nginx    # 暂停升级
    kubectl rollout resume deployment/nginx   # 继续升级
    kubectl rollout undo deployment/nginx     # 快速回滚
    

四、监控与排障指南

实时监控三板斧

watch -n 1 "kubectl get deployment,rs,pod -l app=nginx"
kubectl describe deployment/nginx | grep -A 10 Events
kubectl logs nginx-7dfd6f6c4b-2xh5f --previous  # 查看前一个Pod日志

Prometheus告警规则

- alert: Deployment升级卡顿
  expr: time() - kube_deployment_status_observed_generation > 300
  for: 5m
- alert: Pod启动失败
  expr: sum by (deployment) (kube_pod_container_status_restarts_total) > 3

性能瓶颈排查

kubectl top pods -l app=nginx          # 资源监控
kubectl get pods --sort-by=.status.startTime  # 启动时间排序

五、经典故障案例库

案例1:镜像拉取雪崩

  • 现象:节点网络带宽打满
  • 解决方案:
    strategy:
      rollingUpdate:
        maxSurge: 1      # 限制并行拉取数量
        maxUnavailable: 0
    

案例2:就绪探针误杀

  • 现象:新版本Pod反复重启
  • 根因:readinessProbe超时时间过短
  • 修复:
    readinessProbe:
      timeoutSeconds: 3 → 5
      failureThreshold: 3 → 5
    

案例3:版本兼容故障

  • 现象:升级后数据库报错
  • 根治方案:
    kubectl rollout undo deployment/nginx --to-revision=5  # 回滚到稳定版本
    

六、升级策略扩展

  1. 蓝绿部署模式

    kubectl apply -f blue.yaml    # 旧版本
    kubectl apply -f green.yaml   # 新版本
    kubectl patch svc/nginx -p '{"spec":{"selector":{"version":"green"}}}'
    
  2. 金丝雀发布方案

    # 首批发布10%实例
    strategy:
      canary:
        steps:
        - setWeight: 10
        - pause: {}
    
  3. A/B测试集成

    httpRoutes:
    - matches:
      - headers:
          user-type: 
            exact: "vip"
      filters:
        mirror:
          backendRef:
            name: canary
    

掌握这些升级技巧,您的Kubernetes部署将如同精密的瑞士钟表,在业务连续性与迭代速度间找到完美平衡。记住:每一次成功的滚动更新,都是对系统韧性的最佳检验。

posted on 2025-03-11 14:43  Leo-Yide  阅读(31)  评论(0)    收藏  举报