Skip to content

Deployment 滚动更新深度解析

Deployment 核心功能

Deployment 是最常用的工作负载资源,提供:

  • 声明式更新:描述期望状态,自动滚动更新
  • 版本回滚:保留历史 ReplicaSet,支持快速回滚
  • 弹性伸缩:随时调整副本数
  • 暂停/恢复:批量修改后一次性发布

完整配置示例

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: production
  labels:
    app: my-app
  annotations:
    kubernetes.io/change-cause: "升级到 v2.0,新增用户认证功能"
spec:
  replicas: 3

  selector:
    matchLabels:
      app: my-app

  # 滚动更新策略
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # 最多额外创建 1 个 Pod(可以是百分比:25%)
      maxUnavailable: 0  # 最多 0 个不可用(保证服务不中断)

  # 历史版本保留数量
  revisionHistoryLimit: 10

  # Pod 就绪后等待时间(防止假就绪)
  minReadySeconds: 10

  # 更新超时时间
  progressDeadlineSeconds: 600

  template:
    metadata:
      labels:
        app: my-app
        version: v2.0
    spec:
      containers:
      - name: app
        image: my-app:v2.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        lifecycle:
          preStop:
            exec:
              command: ["/bin/sh", "-c", "sleep 10"]  # 优雅退出
      terminationGracePeriodSeconds: 30

滚动更新流程

初始状态:RS-v1 (3 pods)

更新镜像后:
Step 1: RS-v2 创建 1 个 Pod(maxSurge=1,总数=4)
Step 2: RS-v2 Pod Ready 后,RS-v1 缩减 1 个(总数=3)
Step 3: 重复直到 RS-v2 = 3,RS-v1 = 0

最终:RS-v2 (3 pods),RS-v1 (0 pods,保留用于回滚)

常用操作

bash
# 查看 Deployment 状态
kubectl get deployment my-app
kubectl rollout status deployment/my-app

# 更新镜像(触发滚动更新)
kubectl set image deployment/my-app app=my-app:v2.1

# 查看更新历史
kubectl rollout history deployment/my-app
kubectl rollout history deployment/my-app --revision=2

# 回滚到上一版本
kubectl rollout undo deployment/my-app

# 回滚到指定版本
kubectl rollout undo deployment/my-app --to-revision=2

# 暂停更新(批量修改时使用)
kubectl rollout pause deployment/my-app
kubectl set image deployment/my-app app=my-app:v2.2
kubectl set resources deployment/my-app -c app --limits=cpu=1
kubectl rollout resume deployment/my-app  # 一次性发布所有修改

# 扩缩容
kubectl scale deployment/my-app --replicas=5

# 强制重启所有 Pod(不改变镜像)
kubectl rollout restart deployment/my-app

蓝绿部署

yaml
# 蓝色版本(当前生产)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-blue
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: my-app
        slot: blue
    spec:
      containers:
      - name: app
        image: my-app:v1.0
---
# 绿色版本(新版本)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-green
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: my-app
        slot: green
    spec:
      containers:
      - name: app
        image: my-app:v2.0
---
# Service 切换流量(修改 selector)
apiVersion: v1
kind: Service
metadata:
  name: my-app
spec:
  selector:
    app: my-app
    slot: green  # 从 blue 改为 green 即完成切换

金丝雀发布

yaml
# 稳定版本(90% 流量)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-stable
spec:
  replicas: 9
  template:
    metadata:
      labels:
        app: my-app
        track: stable
---
# 金丝雀版本(10% 流量)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-canary
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: my-app
        track: canary
---
# Service 同时选中两个 Deployment
apiVersion: v1
kind: Service
spec:
  selector:
    app: my-app  # 不区分 track,按副本数比例分流

HPA 自动伸缩

yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 400Mi
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Pods
        value: 4
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300

本站内容由 褚成志 整理编写,仅供学习参考