Deployment 详解:Kubernetes 集群的"应用部署控制器"

This article is extracted from the chat log with AI. Please identify it with caution.

AI 协助说明: 本页由 Codex 协助核验和修复站内链接;正文的技术事实和适用范围未因本次修改而改变,仍以文中来源及当前官方文档为准。

本文边界:本文聚焦 Deployment 的资源模型、期望状态与控制器行为;发布过程的操作语义和 Service/Deployment 的对象选型请阅读配套文章。

推荐深读rollout 与 rolling update 的区别什么时候用 Service,什么时候用 Deployment

什么是 Deployment?#

Deployment 是 Kubernetes 中的一种高级控制器资源,它提供声明式的方式来管理应用的部署和更新。简单来说,Deployment 是 Kubernetes 中确保应用以期望状态运行的核心机制,它控制 ReplicaSet 和 Pod 的创建、更新和回滚过程。

在传统部署中,应用更新通常是一个复杂且容易出错的过程。Deployment 通过自动化和标准化这一过程,实现了无缝的应用发布和扩展,是现代云原生应用交付的核心组件。

Deployment 在 Kubernetes 中的核心角色#

1. 应用状态的"守护者"#

  • 持续监控集群中应用的实际状态
  • 自动修复异常:当 Pod 崩溃或节点故障时,自动创建新 Pod
  • 确保运行的 Pod 数量始终符合期望值

2. 应用更新的"编排器"#

  • 管理滚动更新过程,确保服务不中断
  • 控制更新节奏和策略(如一次更新几个实例)
  • 提供版本控制和回滚能力

3. 应用伸缩的"调节器"#

  • 支持手动和自动水平扩展
  • 与 Horizontal Pod Autoscaler (HPA) 集成实现自动伸缩
  • 平滑处理扩缩容过程,避免服务抖动

Deployment 的核心工作原理#

1. 声明式配置#

Deployment 采用声明式 API 设计,用户只需定义期望状态,控制器负责将实际状态收敛到期望状态:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3  # 期望的 Pod 副本数
  selector:
    matchLabels:
      app: nginx
  template:  # Pod 模板
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

2. 控制器工作流程#

graph LR
A[用户创建 Deployment] --> B[Deployment Controller]
B --> C{监控当前状态}
C -->|检查 ReplicaSet| D[确保 ReplicaSet 数量正确]
D --> E{监控 Pod 状态}
E -->|创建/删除 Pod| F[达到期望副本数]
E -->|健康检查| G[替换不健康 Pod]

当创建 Deployment 后:

  1. Deployment Controller 创建一个 ReplicaSet
  2. ReplicaSet Controller 确保指定数量的 Pod 正在运行
  3. 如果 Pod 失败,ReplicaSet 自动创建替代 Pod
  4. Deployment Controller 持续监控并确保期望状态

3. 版本控制机制#

每次更新 Deployment 都会创建一个新的 ReplicaSet,并保留历史版本:

  • 每个 ReplicaSet 代表一个特定的应用版本
  • Deployment 保留修订历史 (默认保留 10 个版本)
  • 允许快速回滚到任何历史版本
$ kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/nginx-deployment nginx=nginx:1.22
3         kubectl set image deployment/nginx-deployment nginx=nginx:1.23

Deployment 的更新策略#

1. 滚动更新 (RollingUpdate) - 默认策略#

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%  # 更新过程中允许不可用的 Pod 比例
      maxSurge: 25%        # 允许超过期望副本数的 Pod 比例

滚动更新特点:

  • 逐步替换旧 Pod,确保服务不中断
  • 通过 maxUnavailable 和 maxSurge 精细控制更新过程
  • 例如:3 副本应用,maxUnavailable=25% (0.75→1),maxSurge=25% (0.75→1)
    • 先创建 1 个新 Pod (总 Pod=4)
    • 等待新 Pod 就绪后,终止 1 个旧 Pod (总 Pod=3)
    • 重复直至所有 Pod 更新完成

2. 重建策略 (Recreate)#

spec:
  strategy:
    type: Recreate  # 先终止所有旧 Pod,再创建新 Pod

重建策略特点:

  • 简单直接,但会导致服务中断
  • 适用于无法并行运行不同版本的有状态应用
  • 通常在无停机要求的开发/测试环境中使用

3. 蓝绿部署与金丝雀发布#

虽然 Deployment 本身不直接支持蓝绿部署,但可以通过组合多个 Deployment 和 Service 实现:

金丝雀发布配置

# 主要版本 (90% 流量)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-v1
spec:
  replicas: 9
  # ...

# 金丝雀版本 (10% 流量)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend-v2
spec:
  replicas: 1
  # ...

然后通过 Service 或 Ingress 的权重配置分发流量。

Deployment 的高级配置#

1. 就绪与存活探针#

spec:
  template:
    spec:
      containers:
      - name: app
        image: my-app:1.0
        readinessProbe:  # 就绪探针,决定是否接收流量
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:  # 存活探针,决定是否重启容器
          tcpSocket:
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20

2. 资源请求与限制#

spec:
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:  # 确保调度到有足够资源的节点
            memory: "64Mi"
            cpu: "250m"
          limits:   # 防止单个容器消耗过多资源
            memory: "128Mi"
            cpu: "500m"

3. 多容器 Pod 配置#

spec:
  template:
    spec:
      containers:
      - name: app
        image: my-app:1.0
        # 应用容器配置
      - name: sidecar
        image: logging-agent:1.0
        # 边车容器,提供辅助功能
      - name: init-container
        image: init-db:1.0
        # 初始化容器,应用启动前执行

Deployment 与其它资源的关系#

1. Deployment 与 Service#

graph LR
A[Deployment] -->|创建和管理| B[ReplicaSet]
B -->|确保运行| C[Pods]
D[Service] -->|通过标签选择器发现| C
E[Ingress] -->|路由流量到| D
  • Deployment 管理应用生命周期
  • Service 提供网络访问端点
  • 两者通过标签(label)和选择器(selector)关联

2. Deployment 与 ConfigMap/Secret#

spec:
  template:
    spec:
      containers:
      - name: app
        env:
        - name: DATABASE_URL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: database_url
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
      - name: config-volume
        configMap:
          name: app-config
  • Deployment 通过 ConfigMap 和 Secret 注入配置
  • 无需重建镜像即可更新应用配置
  • 实现配置与代码分离

3. Deployment 与 Horizontal Pod Autoscaler (HPA)#

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: 50
  • HPA 根据指标自动调整 Deployment 的 replicas 值
  • 实现基于负载的动态伸缩
  • 与 Deployment 无缝集成

Deployment 的生命周期管理#

1. 部署和更新#

# 创建 Deployment
kubectl create -f deployment.yaml

# 更新镜像版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.22

# 或使用 apply 更新完整配置
kubectl apply -f updated-deployment.yaml

# 暂停/恢复 Deployment (用于多步骤更新)
kubectl rollout pause deployment/nginx-deployment
kubectl rollout resume deployment/nginx-deployment

2. 回滚操作#

# 查看历史版本
kubectl rollout history deployment/nginx-deployment

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

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

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

3. 伸缩操作#

# 手动伸缩
kubectl scale deployment/nginx-deployment --replicas=5

# 或通过修改配置
kubectl patch deployment/nginx-deployment -p '{"spec":{"replicas":5}}'

Deployment 的监控与故障排除#

1. 关键监控指标#

指标说明健康阈值
期望副本数 vs 可用副本数当前运行的 Pod 数与期望值的差异差值为0
更新状态滚动更新进度无卡住状态
Pod 重启次数容器意外重启次数<5/小时
部署频率应用更新频率根据业务需求
回滚频率部署失败导致回滚的频率<10%

2. 常用诊断命令#

# 查看 Deployment 状态
kubectl get deployment nginx-deployment -o wide

# 详细查看 Deployment 信息
kubectl describe deployment nginx-deployment

# 查看 ReplicaSet 历史
kubectl get replicaset -l app=nginx

# 实时监控滚动更新过程
kubectl rollout status deployment/nginx-deployment --watch

# 查看特定版本的配置详情
kubectl rollout history deployment/nginx-deployment --revision=3

3. 常见问题解决#

问题现象可能原因诊断命令解决方案
Pod 无法启动镜像拉取失败、资源不足kubectl describe pod <pod-name>检查镜像名称,增加资源限制
滚动更新卡住就绪探针失败、资源不足kubectl rollout history deployment/<name>检查探针配置,临时增加 maxSurge
应用频繁重启应用崩溃、存活探针太敏感kubectl logs <pod-name> --previous优化应用稳定性,调整探针参数
无法扩展节点资源不足、配额限制kubectl describe nodes添加节点,调整资源请求
配置更新未生效配置未挂载到容器kubectl exec <pod-name> -- cat /etc/config/app.conf检查 volumeMounts 配置

最佳实践#

  1. 版本控制与可追溯性

    • 使用 --record 参数记录每次变更原因
    • 通过注解(annotations)添加部署信息
    metadata:
      annotations:
        deployment.kubernetes.io/change-cause: "Update to version 1.2 for security patch"
  2. 渐进式交付

    • 关键应用采用金丝雀发布策略
    • 先在小流量验证,再全量发布
    • 结合监控指标自动决策是否继续发布
  3. 资源管理

    • 始终设置资源请求(requests)和限制(limits)
    • 根据实际使用情况定期调整
    • 避免过度分配导致集群资源浪费
  4. 健康检查优化

    • 为每个容器配置适当的就绪和存活探针
    • 合理设置 initialDelaySeconds 避免过早失败
    • 就绪探针和存活探针使用不同端点/参数
  5. 安全实践

    • 使用非 root 用户运行容器
    • 限制容器能力(capabilities)
    • 定期更新基础镜像修复安全漏洞
    securityContext:
      runAsUser: 1000
      runAsNonRoot: true
      capabilities:
        drop: ["ALL"]
  6. 自动化与 GitOps

    • 将 Deployment 配置纳入版本控制系统
    • 使用 CI/CD 管道自动部署
    • 采用 GitOps 模式,将 Git 作为唯一真相源

一个简单类比#

想象 Kubernetes 集群是一个现代化的汽车制造工厂:

  • Deployment 是工厂的生产控制中心,定义了汽车的型号、数量和生产流程
  • ReplicaSet生产线主管,确保特定型号的汽车按计划生产
  • Pod单个汽车,正在生产线上组装
  • 容器 是汽车的各个部件(引擎、车身、电子系统等)
  • 滚动更新 就像工厂在生产过程中逐步升级制造工艺,不影响整体产量
  • 回滚机制 类似于当新工艺出现问题时,快速切换回旧工艺,确保生产不中断
  • 水平扩展 就像根据市场需求,增加或减少生产线数量

当市场需求变化(比如需要生产新款车型):

  1. 工厂管理层(用户)提交新的生产计划(更新 Deployment)
  2. 生产控制中心(Deployment Controller)分析变更影响
  3. 逐步调整生产线(滚动更新):
    • 先建立一条新车型生产线(创建新 ReplicaSet)
    • 逐步将工人和设备从旧线转移到新线
    • 确保总产量不下降(服务不中断)
  4. 如果新车型出现问题,可以快速切换回旧车型生产线(回滚)

Deployment 作为 Kubernetes 应用管理的核心控制器,实现了云原生应用的声明式部署、自动修复和无缝更新。它不仅是技术组件,更是现代软件交付理念的体现:通过自动化、可观测性和弹性设计,实现高效可靠的应用交付。掌握 Deployment 的工作原理和最佳实践,是构建生产级 Kubernetes 应用的关键一步。

本文共 3134 字,创建于 Dec 31, 2025

相关标签: Kubernetes, ByAI