02 - Deployment 与 ReplicaSet
为什么需要 Deployment?
直接创建 Pod 有严重问题:
- Pod 挂了不会自动重建
- 没有副本管理
- 没有滚动更新
- 没有回滚能力
Deployment 是管理无状态应用的最佳方式。
层级关系
┌──────────────┐
│ Deployment │ ← 你创建和管理的
│ replicas: 3 │
└──────┬───────┘
│ 管理
▼
┌──────────────┐
│ ReplicaSet │ ← Deployment 自动创建
│ replicas: 3 │
└──────┬───────┘
│ 管理
▼
┌─────┐ ┌─────┐ ┌─────┐
│ Pod │ │ Pod │ │ Pod │ ← ReplicaSet 自动创建
└─────┘ └─────┘ └─────┘- Deployment:管理发布策略(滚动更新、回滚)
- ReplicaSet:确保指定数量的 Pod 副本在运行
- Pod:运行应用容器
你几乎不需要直接操作 ReplicaSet,让 Deployment 帮你管。
Deployment YAML
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web-app
spec:
replicas: 3 # 副本数
selector: # 选择器(必须和 template.labels 匹配)
matchLabels:
app: web-app
strategy: # 更新策略
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 更新时最多多出 1 个 Pod
maxUnavailable: 0 # 更新时不允许不可用
template: # Pod 模板
metadata:
labels:
app: web-app
spec:
containers:
- name: web
image: nginx:1.25-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 5滚动更新(Rolling Update)
更新前: [v1] [v1] [v1]
↓ 创建新 Pod
Step 1: [v1] [v1] [v1] [v2] maxSurge=1
↓ 删除旧 Pod
Step 2: [v1] [v1] [v2]
↓ 创建新 Pod
Step 3: [v1] [v1] [v2] [v2]
↓ 删除旧 Pod
Step 4: [v1] [v2] [v2]
↓ ...
最终: [v2] [v2] [v2] 零停机完成bash
# 方式 1:修改 YAML 后 apply
kubectl apply -f deployment.yaml
# 方式 2:直接更新镜像
kubectl set image deployment/web-app web=nginx:1.26-alpine
# 查看更新状态
kubectl rollout status deployment/web-app
# 查看更新历史
kubectl rollout history deployment/web-app
# 回滚到上一版本
kubectl rollout undo deployment/web-app
# 回滚到指定版本
kubectl rollout undo deployment/web-app --to-revision=2
# 暂停/恢复更新
kubectl rollout pause deployment/web-app
kubectl rollout resume deployment/web-app扩缩容
bash
# 手动扩容
kubectl scale deployment/web-app --replicas=5
# 缩容
kubectl scale deployment/web-app --replicas=2
# 查看 Pod 分布
kubectl get pods -o wide常用操作
bash
# 创建 Deployment
kubectl apply -f deployment.yaml
# 查看 Deployment
kubectl get deployments
kubectl describe deployment web-app
# 查看 ReplicaSet(Deployment 自动创建的)
kubectl get rs
# 查看 Pod
kubectl get pods -l app=web-app
# 删除 Deployment(会级联删除 RS 和 Pod)
kubectl delete deployment web-app