部署策略
学习目标
- 理解不同的部署策略
- 掌握 RollingUpdate 策略配置
- 理解 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:设计部署策略
回答以下问题:
- Web 应用应该用什么策略?为什么?
- 数据库应该用什么策略?为什么?
- 如何实现 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 |
| minReadySeconds | Pod 就绪后等待时间 |
| 金丝雀发布 | 使用两个 Deployment 实现 |
练习编辑器
bash
Loading...