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