Skip to content

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

下一步

03 - Service 服务发现与负载均衡