Deployment #

一、Deployment概述 #

Deployment是Kubernetes中最常用的工作负载资源,用于管理无状态应用的部署和更新。

1.1 Deployment功能 #

text
Deployment功能
    │
    ├── 副本管理
    │   └── 维护指定数量的Pod副本
    │
    ├── 滚动更新
    │   ├── 无缝升级
    │   └── 可配置更新策略
    │
    ├── 回滚
    │   ├── 版本历史
    │   └── 一键回滚
    │
    └── 扩缩容
        ├── 手动扩缩容
        └── 自动扩缩容

1.2 Deployment关系 #

text
Deployment关系图
    │
    └── Deployment
            │
            └── ReplicaSet (管理副本)
                    │
                    └── Pod (运行容器)

二、创建Deployment #

2.1 命令行创建 #

bash
# 创建Deployment
kubectl create deployment nginx --image=nginx:1.25

# 指定副本数
kubectl create deployment nginx --image=nginx:1.25 --replicas=3

# 查看Deployment
kubectl get deployments

# 查看ReplicaSet
kubectl get rs

# 查看Pod
kubectl get pods

2.2 YAML创建 #

yaml
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 200m
            memory: 256Mi
bash
# 应用配置
kubectl apply -f nginx-deployment.yaml

# 查看状态
kubectl get deployment nginx-deployment

2.3 查看Deployment #

bash
# 查看Deployment详情
kubectl describe deployment nginx-deployment

# 查看Deployment YAML
kubectl get deployment nginx-deployment -o yaml

# 查看关联资源
kubectl get all -l app=nginx

三、更新策略 #

3.1 滚动更新 #

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25

3.2 更新参数说明 #

参数 说明 默认值
maxSurge 最多可超出副本数 25%
maxUnavailable 最多不可用副本数 25%
text
滚动更新过程(replicas=3, maxSurge=1, maxUnavailable=0)
    │
    ├── 初始状态: 3个旧版本Pod
    │
    ├── 创建1个新Pod(maxSurge=1)
    │   └── 4个Pod运行中
    │
    ├── 新Pod就绪后,删除1个旧Pod
    │   └── 3个Pod运行中
    │
    ├── 重复上述过程
    │
    └── 最终状态: 3个新版本Pod

3.3 重建更新 #

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nginx
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.25

四、更新Deployment #

4.1 更新镜像 #

bash
# 更新镜像
kubectl set image deployment/nginx-deployment nginx=nginx:1.26

# 查看更新状态
kubectl rollout status deployment/nginx-deployment

# 查看更新历史
kubectl rollout history deployment/nginx-deployment

4.2 编辑配置 #

bash
# 编辑Deployment
kubectl edit deployment nginx-deployment

# 更新环境变量
kubectl set env deployment/nginx-deployment ENV=production

# 更新资源限制
kubectl set resources deployment/nginx-deployment \
  --limits=cpu=200m,memory=256Mi \
  --requests=cpu=100m,memory=128Mi

4.3 应用更新 #

bash
# 修改YAML文件后应用
kubectl apply -f nginx-deployment.yaml

# 使用kustomize
kubectl apply -k ./overlays/production/

4.4 暂停和恢复 #

bash
# 暂停滚动更新
kubectl rollout pause deployment/nginx-deployment

# 进行多次修改
kubectl set image deployment/nginx-deployment nginx=nginx:1.26
kubectl set env deployment/nginx-deployment ENV=production

# 恢复滚动更新
kubectl rollout resume deployment/nginx-deployment

五、回滚Deployment #

5.1 查看历史 #

bash
# 查看更新历史
kubectl rollout history deployment/nginx-deployment

# 输出示例
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/nginx-deployment nginx=nginx:1.26

# 查看特定版本详情
kubectl rollout history deployment/nginx-deployment --revision=2

5.2 回滚操作 #

bash
# 回滚到上一版本
kubectl rollout undo deployment/nginx-deployment

# 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1

# 查看回滚状态
kubectl rollout status deployment/nginx-deployment

5.3 记录变更原因 #

bash
# 创建时记录原因
kubectl apply -f nginx-deployment.yaml --record

# 更新时记录原因
kubectl set image deployment/nginx-deployment nginx=nginx:1.26 --record

# 查看历史原因
kubectl rollout history deployment/nginx-deployment

六、扩缩容 #

6.1 手动扩缩容 #

bash
# 扩容到5个副本
kubectl scale deployment/nginx-deployment --replicas=5

# 缩容到2个副本
kubectl scale deployment/nginx-deployment --replicas=2

# 基于条件扩容
kubectl scale deployment/nginx-deployment --current-replicas=3 --replicas=5

6.2 自动扩缩容 #

bash
# 创建HPA
kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=80

# 查看HPA
kubectl get hpa

# 查看HPA详情
kubectl describe hpa nginx-deployment

6.3 HPA配置示例 #

yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

七、Deployment状态 #

7.1 状态字段 #

bash
# 查看状态
kubectl get deployment nginx-deployment -o jsonpath='{.status}'

# 状态字段说明
字段 说明
replicas 期望副本数
updatedReplicas 已更新副本数
readyReplicas 就绪副本数
availableReplicas 可用副本数
unavailableReplicas 不可用副本数

7.2 条件状态 #

bash
# 查看条件
kubectl get deployment nginx-deployment -o jsonpath='{.status.conditions}'
条件类型 说明
Progressing 更新进行中
Available Deployment可用
ReplicaFailure 副本创建失败

八、完整配置示例 #

8.1 生产级Deployment #

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: web
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: web
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "8080"
    spec:
      containers:
      - name: web
        image: nginx:1.25
        ports:
        - containerPort: 80
        env:
        - name: ENV
          value: production
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 512Mi
        livenessProbe:
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 5
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: config
        configMap:
          name: nginx-config
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchLabels:
                  app: web
              topologyKey: kubernetes.io/hostname

8.2 配置说明 #

配置项 说明
revisionHistoryLimit 保留历史版本数
strategy 更新策略
resources 资源限制
livenessProbe 存活探针
readinessProbe 就绪探针
affinity 亲和性配置

九、故障排查 #

9.1 常见问题 #

bash
# 查看Deployment事件
kubectl describe deployment nginx-deployment

# 查看Pod状态
kubectl get pods -l app=nginx

# 查看Pod事件
kubectl describe pod <pod-name>

# 查看Pod日志
kubectl logs <pod-name>

9.2 常见状态 #

状态 原因 解决方案
ImagePullBackOff 镜像拉取失败 检查镜像名称和权限
CrashLoopBackOff 容器崩溃 检查日志和配置
Pending 资源不足 增加资源或节点
Running但Not Ready 健康检查失败 检查探针配置

十、最佳实践 #

10.1 资源配置 #

yaml
resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 500m
    memory: 512Mi

10.2 健康检查 #

yaml
livenessProbe:
  httpGet:
    path: /health
    port: 80
  initialDelaySeconds: 10
  periodSeconds: 10
readinessProbe:
  httpGet:
    path: /ready
    port: 80
  initialDelaySeconds: 5
  periodSeconds: 5

10.3 更新策略 #

yaml
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 0

十一、总结 #

11.1 核心命令 #

操作 命令
创建 kubectl create deployment
更新 kubectl set image
扩缩容 kubectl scale
回滚 kubectl rollout undo
查看状态 kubectl rollout status
查看历史 kubectl rollout history

11.2 下一步 #

掌握了Deployment后,让我们学习 ReplicaSet,深入理解副本控制机制。

最后更新:2026-03-28