Kubernetes Deployment 详解
Kubernetes Deployment 是一种用于管理无状态应用的工作负载资源,通过声明式方式控制 Pod 和 ReplicaSet。它支持滚动更新、回滚、扩缩容等核心功能,确保应用持续可用。Deployment 控制器会创建并管理 ReplicaSet,而 ReplicaSet 则维护指定数量的 Pod 副本。典型操作包括通过 YAML 定义应用、使用 kubectl 进行部署更新(如镜像版
Kubernetes Deployment 详解

文章目录
1. 什么是 Deployment?
Deployment 是 Kubernetes 中最常用的工作负载资源之一,用于声明式地管理 Pod 和 ReplicaSet。它描述了一个期望状态(比如运行几个副本、使用哪个容器镜像等),并由 Kubernetes 控制器逐渐将实际状态调整为期望状态。
简单来说,Deployment 让你可以轻松地:
- 部署一个应用
- 更新应用(滚动更新)
- 回滚到之前的版本
- 扩缩容应用的副本数
- 暂停/恢复更新
它是管理无状态应用的理想选择(例如 Web 服务器、API 服务等)。
2. 核心概念:Pod、ReplicaSet 与 Deployment 的关系

- Pod:Kubernetes 中最小的部署单元,包含一个或多个容器。
- ReplicaSet:确保指定数量的 Pod 副本始终运行。如果 Pod 意外删除,ReplicaSet 会创建新的 Pod 来维持副本数。
- Deployment:在 ReplicaSet 之上提供了更高级的功能,如滚动更新、回滚、版本记录等。Deployment 管理 ReplicaSet,而 ReplicaSet 管理 Pod。
关系图:
Deployment → 管理 → ReplicaSet (v1) → 管理 → Pod (3个副本)
↘ 管理 → ReplicaSet (v2) → 管理 → Pod (3个副本)
当更新 Deployment 时,会创建一个新的 ReplicaSet,并逐步替换旧的 ReplicaSet。
3. Deployment 的主要功能
3.1 声明式部署与更新
你只需在 YAML 文件中定义应用的期望状态(镜像、副本数、环境变量等),然后 kubectl apply 即可。Kubernetes 会确保实际状态与期望状态一致。
3.2 滚动更新
更新镜像或配置时,Deployment 会逐步替换旧 Pod,而不是一次性全部停止。这样可以保证服务在更新过程中不中断。
3.3 回滚
如果新版本出现问题,可以快速回滚到之前的稳定版本。Deployment 保留了历史版本记录(ReplicaSet)。
3.4 扩缩容
手动或自动调整副本数量,以应对负载变化。
3.5 暂停/恢复更新
在更新过程中可以暂停,以便进行多次修改(如调整环境变量),然后恢复更新,避免不必要的滚动。
3.6 自愈
当 Pod 或节点故障时,Deployment 会自动重新调度 Pod,确保副本数符合期望。
4. Deployment 的工作原理
Deployment 控制器通过控制循环不断对比期望状态(Deployment 对象中定义的)和实际状态(集群中运行的 Pod/ReplicaSet)。步骤如下:
- 用户创建或更新一个 Deployment 对象(通过 API Server)。
- Deployment 控制器监听到变化,根据期望副本数创建对应的 ReplicaSet。
- ReplicaSet 控制器负责创建/删除 Pod,使 Pod 数量达到期望值。
- 如果更新 Deployment(如修改镜像),控制器会创建新的 ReplicaSet,并按照滚动更新策略逐步缩减旧 ReplicaSet 的副本,同时增加新 ReplicaSet 的副本。
- 滚动过程中,旧的 ReplicaSet 不会被立即删除,而是保留下来(可配置保留数量),以便回滚。
5. Deployment 的 YAML 定义示例
下面是一个典型的 Deployment YAML 文件,部署一个 Nginx 服务:
apiVersion: apps/v1 # 使用的 Kubernetes API 版本,apps/v1 是 Deployment 的稳定版本
kind: Deployment # 资源类型,表示这是一个 Deployment 控制器
metadata: # 元数据部分,用于标识该 Deployment
name: nginx-deployment # Deployment 的名称,在整个命名空间中唯一
labels: # 为该 Deployment 添加标签,便于筛选和管理
app: nginx # 标签键值对,此处表示该 Deployment 属于 nginx 应用
spec: # 期望的状态描述,定义 Deployment 的详细配置
replicas: 3 # 期望运行的 Pod 副本数量,确保有 3 个 Pod 运行
selector: # 标签选择器,用于确定哪些 Pod 归该 Deployment 管理
matchLabels: # 基于标签匹配的规则,必须与 Pod 模板的标签一致
app: nginx # 选择标签为 app=nginx 的 Pod
template: # Pod 模板,定义了要创建的 Pod 的规范
metadata: # Pod 的元数据
labels: # 为 Pod 添加标签,必须与 selector 匹配
app: nginx # Pod 的标签,标识该 Pod 属于 nginx 应用
spec: # Pod 的规格定义
containers: # 容器列表,可以包含多个容器
- name: nginx # 容器名称,在 Pod 内唯一
image: nginx:1.21 # 容器使用的镜像及版本标签
ports: # 容器端口声明
- containerPort: 80 # 容器监听的端口号,此处为 80(HTTP 默认端口)
strategy: # 更新策略,定义如何升级 Pod(可选字段)
type: RollingUpdate # 更新类型为滚动更新,逐步替换旧版本 Pod
rollingUpdate: # 滚动更新的具体配置
maxSurge: 1 # 更新期间允许超出期望副本数的最大 Pod 数(可以是绝对数或百分比)
maxUnavailable: 1 # 更新期间允许不可用 Pod 的最大数量(可以是绝对数或百分比)
revisionHistoryLimit: 10 # 保留的历史版本(旧 ReplicaSet)数量,用于回滚操作
6. 常用操作命令(kubectl)
6.1 创建 Deployment
kubectl create -f nginx-deployment.yaml
# 或者直接使用命令创建(不推荐用于复杂配置)
kubectl create deployment nginx --image=nginx:1.21 --replicas=3
6.2 查看 Deployment 状态
kubectl get deployments
kubectl describe deployment nginx-deployment
6.3 更新 Deployment(如修改镜像版本)
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
# 或者编辑 YAML 文件后 apply
kubectl edit deployment nginx-deployment
6.4 查看滚动更新状态
kubectl rollout status deployment/nginx-deployment
6.5 扩缩容
kubectl scale deployment/nginx-deployment --replicas=5
6.6 回滚
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deployment
# 回滚到指定版本(先查看历史版本)
kubectl rollout history deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment --to-revision=2
6.7 暂停和恢复滚动更新
# 暂停
kubectl rollout pause deployment/nginx-deployment
# 进行多次修改(如更新镜像、添加环境变量)
kubectl set image deployment/nginx-deployment nginx=nginx:1.23
kubectl set env deployment/nginx-deployment DEBUG=true
# 恢复更新
kubectl rollout resume deployment/nginx-deployment
6.8 查看历史版本详情
kubectl rollout history deployment/nginx-deployment --revision=2
6.9 删除 Deployment
kubectl delete deployment nginx-deployment
7. 滚动更新策略详解
滚动更新通过 strategy.rollingUpdate 下的两个参数控制:
maxSurge:在更新过程中,允许超出期望副本数的最大 Pod 数量。可以是绝对数字(如 1)或百分比(如 25%)。例如,副本数为 3,maxSurge=1表示更新过程中最多可以有 4 个 Pod 同时运行。maxUnavailable:更新过程中允许不可用的最大 Pod 数量。同样可以是数字或百分比。例如,副本数为 3,maxUnavailable=1表示最多允许 1 个 Pod 不可用,因此至少有 2 个 Pod 提供服务。
这两个参数共同决定了滚动更新的速度与可用性。默认值分别是 25% 和 25%。
滚动更新过程示例:
假设副本数为 3,maxSurge=1, maxUnavailable=1:
- 新 ReplicaSet 创建 1 个新 Pod(maxSurge=1),此时总 Pod 数变为 4。
- 旧 ReplicaSet 销毁 1 个旧 Pod,使得不可用 Pod 数 = 1(maxUnavailable=1)。
- 新 ReplicaSet 再创建 1 个新 Pod,总 Pod 数又变为 4。
- 旧 ReplicaSet 再销毁 1 个旧 Pod,如此反复,直到所有 Pod 都是新版本。
8. 回滚机制
Deployment 每次更新(如修改模板)都会生成一个新的 ReplicaSet,并保留旧的 ReplicaSet(默认保留 10 个历史版本)。回滚时,只需将目标 ReplicaSet 的副本数调回期望值,同时缩减当前 ReplicaSet 即可。
重要:
- 只有更新 Deployment 的
spec.template(Pod 模板)才会触发版本记录。扩缩容等操作不会增加版本。 - 可以通过
revisionHistoryLimit设置保留的历史版本数量。
9. 使用场景
- 无状态应用部署:如 Web 服务、API 后端、微服务等。
- 快速迭代发布:通过滚动更新实现零停机发布。
- 弹性伸缩:结合 HPA(Horizontal Pod Autoscaler)自动扩缩容。
- 蓝绿部署/金丝雀发布:通过控制新旧 ReplicaSet 的副本比例实现(需要更精细的控制时,可借助 Service 的标签选择器)。
10. 最佳实践与注意事项
- 不要在 Pod 模板中使用固定标签:Deployment 的 selector 是固定的,如果修改了 Pod 模板的标签,可能导致新的 ReplicaSet 无法匹配 selector,从而更新失败。
- 合理设置滚动更新参数:根据业务容忍度调整
maxSurge和maxUnavailable。对可用性要求高的服务,建议设置maxUnavailable=0,并配合maxSurge控制更新速度。 - 保留历史版本:
revisionHistoryLimit默认值为 10,对于频繁更新的服务,可适当增大,但不要过大以免 etcd 存储压力。 - 使用声明式配置:尽量用 YAML 文件而非命令式命令管理 Deployment,便于版本控制和自动化。
- 监控滚动更新状态:使用
kubectl rollout status或 CI/CD 集成,确保更新成功。 - 避免直接修改由 Deployment 管理的 ReplicaSet 或 Pod:所有变更都应通过 Deployment 进行,否则会被控制器覆盖。
- 资源请求和限制:为容器设置资源请求(requests)和限制(limits),有助于调度和稳定性。
- 就绪探针(readinessProbe):配置就绪探针可以确保新 Pod 真正准备好服务后才切换流量,避免更新期间服务中断。
- 优雅终止:容器应正确处理 SIGTERM (Unix/Linux 软件终止信号)信号,并留出足够时间完成正在处理的请求(通过
terminationGracePeriodSeconds)。
11. 总结
Deployment 是 Kubernetes 中管理无状态应用的核心资源。它通过 ReplicaSet 确保 Pod 数量符合期望,并提供了声明式更新、滚动升级、回滚、扩缩容等高级功能。理解 Deployment 的工作原理和配置选项,能够帮助你高效、可靠地在 Kubernetes 上部署和运维应用。
更多推荐

所有评论(0)