Kubernetes 发布管理实战:模拟生产环境发布流程

核心概念

在 Kubernetes 中,发布管理需保证服务零中断,常用策略:

  1. 蓝绿部署:$新版本(蓝色)$与$旧版本(绿色)$同时运行,流量切换瞬间完成
  2. 金丝雀发布:$流量比例控制$,逐步将用户导流到新版本
  3. 滚动更新:$Pod逐批替换$,默认策略但存在版本共存的过渡期

实战步骤:金丝雀发布模拟
1. 初始环境准备
# 创建v1版本部署
kubectl create deployment myapp --image=myapp:v1 --replicas=3
kubectl expose deployment myapp --port=80 --type=ClusterIP

2. 部署v2版本(金丝雀)
# canary-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-v2-canary
spec:
  replicas: 1  # 初始仅1个副本
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: app
        image: myapp:v2
        readinessProbe:
          httpGet:
            path: /health
            port: 80

3. 配置流量分割(Nginx Ingress示例)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10" # 10%流量到v2
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          service:
            name: myapp
            port: 
              number: 80

4. 监控关键指标
watch -n 2 "kubectl get pods -l app=myapp && \
          kubectl get svc myapp && \
          kubectl describe ingress myapp-ingress | grep 'Canary'"

监控重点:

  • $错误率 < 0.5%$
  • $P99延迟 < 200ms$
  • $CPU使用率 < 70%$
5. 渐进式流量调整
# 分阶段调整流量权重
kubectl annotate ingress myapp-ingress \
  nginx.ingress.kubernetes.io/canary-weight="25%" --overwrite

kubectl annotate ingress myapp-ingress \
  nginx.ingress.kubernetes.io/canary-weight="50%" --overwrite

# 最终全量切换
kubectl scale deployment myapp-v2-canary --replicas=3
kubectl delete deployment myapp  # 下线旧版本


生产环境最佳实践
  1. 自动回滚机制

    # deployment.yaml
    spec:
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 0
        type: RollingUpdate
    

  2. 健康检查强化

    livenessProbe:
      httpGet:
        path: /live
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 3
    readinessProbe:
      httpGet:
        path: /ready
        port: 80
      initialDelaySeconds: 10
      periodSeconds: 5
    

  3. 流量染色追踪

    # 通过Header区分版本
    annotations:
      nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
    


验证流程
  1. 使用测试工具模拟流量:
    hey -z 5m -c 50 -H "X-Canary: true" http://myapp.example.com
    

  2. 日志追踪:
    kubectl logs -l version=v2 --tail=100 | grep "ERROR"
    

  3. 最终验证:
    curl -I http://myapp.example.com/version | grep "v2"
    

关键提示:生产发布需遵循$变更窗口期$,建议在低峰时段操作,并准备$回滚预案$。通过逐步流量切换,可将$故障影响半径$控制在最小范围。

更多推荐