27·Deployment进阶

部署策略

kubernetesdeploymentstrategy

部署策略

学习目标

  1. 理解不同的部署策略
  2. 掌握 RollingUpdate 策略配置
  3. 理解 Recreate 策略的使用场景

核心概念

两种内置策略

策略说明适用场景
RollingUpdate滚动更新(默认)大多数场景
Recreate先删后建不能有两个版本同时运行

RollingUpdate 策略

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%    # 最多几个 Pod 不可用
      maxSurge: 25%          # 最多多出几个 Pod
RollingUpdate 过程(replicas=4, maxUnavailable=1, maxSurge=1):

初始状态:
[ v1 ] [ v1 ] [ v1 ] [ v1 ]

步骤 1: 创建新 Pod
[ v1 ] [ v1 ] [ v1 ] [ v1 ] [ v2 ]   # maxSurge=1,最多 5 个

步骤 2: 新 Pod 就绪,删除旧 Pod
[ v1 ] [ v1 ] [ v1 ] [ v2 ]           # maxUnavailable=1

步骤 3: 继续
[ v1 ] [ v1 ] [ v2 ] [ v2 ]

步骤 4: 继续
[ v1 ] [ v2 ] [ v2 ] [ v2 ]

步骤 5: 完成
[ v2 ] [ v2 ] [ v2 ] [ v2 ]

maxUnavailable 和 maxSurge 配置

# 快速更新(资源充足)
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 0      # 始终保持所有旧 Pod 可用
      maxSurge: 3            # 同时创建 3 个新 Pod

# 保守更新(资源有限)
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 1      # 最多 1 个不可用
      maxSurge: 0            # 不额外创建 Pod

# 百分比配置
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 50%    # 50% 不可用
      maxSurge: 50%          # 50% 额外 Pod

Recreate 策略

spec:
  strategy:
    type: Recreate
Recreate 过程:

初始状态:
[ v1 ] [ v1 ] [ v1 ]

步骤 1: 删除所有旧 Pod
[ ] [ ] [ ]

步骤 2: 创建所有新 Pod
[ v2 ] [ v2 ] [ v2 ]

缺点:有停机时间
优点:新旧版本不会同时运行

Recreate 适用场景

1. 应用不支持多版本同时运行
   - 数据库 schema 变更
   - 全局锁
   - 单例模式

2. 需要确保完全切换
   - 不允许新旧版本混用

3. 开发/测试环境
   - 停机时间可以接受

RollingUpdate vs Recreate

RollingUpdate:
✅ 零停机
✅ 逐步验证
✅ 可随时回滚
❌ 需要应用支持多版本共存
❌ 更新较慢

Recreate:
✅ 简单直接
✅ 不需要多版本支持
❌ 有停机时间
❌ 无法逐步验证

配置示例

# 生产环境:保守的滚动更新
apiVersion: apps/v1
kind: Deployment
metadata:
  name: production-app
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  minReadySeconds: 30
  template:
    # ...

---
# 数据库:Recreate 策略
apiVersion: apps/v1
kind: Deployment
metadata:
  name: database
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    # ...

金丝雀发布(手动实现)

# 使用两个 Deployment 实现金丝雀发布

# v1 - 主版本(90% 流量)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v1
spec:
  replicas: 9
  selector:
    matchLabels:
      app: my-app
      version: v1
  template:
    metadata:
      labels:
        app: my-app
        version: v1
    spec:
      containers:
      - name: app
        image: my-app:v1

---
# v2 - 金丝雀版本(10% 流量)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
      version: v2
  template:
    metadata:
      labels:
        app: my-app
        version: v2
    spec:
      containers:
      - name: app
        image: my-app:v2

实践练习

练习 1:比较两种策略

# 1. 创建 Recreate 策略的 Deployment
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: recreate-demo
spec:
  replicas: 3
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: recreate-demo
  template:
    metadata:
      labels:
        app: recreate-demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.24
EOF

# 2. 更新并观察
$ kubectl set image deployment/recreate-demo nginx=nginx:1.25

# 3. 对比 RollingUpdate
$ kubectl create deployment rolling-demo --image=nginx:1.24 --replicas=3
$ kubectl set image deployment/rolling-demo nginx=nginx:1.25

练习 2:配置 maxSurge 和 maxUnavailable

# 编写 Deployment,配置:
# - replicas: 5
# - maxUnavailable: 2
# - maxSurge: 3
# - minReadySeconds: 10

练习 3:设计部署策略

回答以下问题:

  1. Web 应用应该用什么策略?为什么?
  2. 数据库应该用什么策略?为什么?
  3. 如何实现 10% 的金丝雀发布?

常见问题

1. RollingUpdate 更新太慢

# 增加并发度
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 50%
      maxSurge: 50%

2. Recreate 停机时间太长

# 考虑使用 RollingUpdate
# 或者优化启动时间
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 1

3. 需要蓝绿部署

# 使用两个 Deployment + Service 切换
# 或者使用 Ingress/Service Mesh

小结

要点说明
RollingUpdate滚动更新,零停机(默认)
Recreate先删后建,有停机时间
maxUnavailable最多几个 Pod 不可用
maxSurge最多多出几个 Pod
minReadySecondsPod 就绪后等待时间
金丝雀发布使用两个 Deployment 实现

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「暂停部署」 以巩固所学知识。