Deployment 和 ReplicaSet 的关系是什么?
在 Kubernetes (K8s) 中,Deployment 和 ReplicaSet 是层级关系。简单来说:Deployment 管理 ReplicaSet,而 ReplicaSet 管理 Pod。
你可以把它们的关系理解为:Deployment 是“老板/项目经理”,ReplicaSet 是“工头/组长”,Pod 是“工人”。
以下是详细的关系解析:
1. 层级结构 (Hierarchy)
Kubernetes 的控制器是通过层级来工作的:
- Deployment (最高层): 定义应用的期望状态(比如版本、副本数)。
- ReplicaSet (中间层): 确保指定数量的 Pod 副本在运行。
- Pod (最底层): 实际运行容器的单元。
2. 核心职责区别
ReplicaSet (RS) 的职责:
- 它的核心任务只有一个:保证 Pod 的数量。
- 如果定义了需要 3 个副本,ReplicaSet 会一直监控。如果有一个 Pod 挂了,它就补一个;如果多了一个,它就杀掉一个。
- 它不具备复杂的版本更新能力。
Deployment 的职责:
- 它是一个更高级的抽象,用于管理应用的生命周期。
- 它不直接管理 Pod,而是通过控制 ReplicaSet 来间接管理 Pod。
- 它的核心能力包括:滚动更新 (Rolling Update)、回滚 (Rollback)、暂停/恢复。
3. 它们是如何协作的?(最关键的点)
Deployment 和 ReplicaSet 的关系在应用更新时体现得淋漓尽致。
假设你有一个应用 App-v1,Deployment 会创建一个 ReplicaSet-v1 来管理 3 个 Pod。
当你把镜像更新为 App-v2 时,Deployment 会这样做:
- Deployment 创建一个新的
ReplicaSet-v2(初始副本数为 0)。 - Deployment 指挥
ReplicaSet-v2增加 1 个 Pod。 - Deployment 指挥
ReplicaSet-v1减少 1 个 Pod。 - 重复这个过程,直到
ReplicaSet-v2达到 3 个 Pod,而ReplicaSet-v1变为 0 个 Pod。
在这个过程中:
- Deployment 负责制定策略(一次替换几个?更新速度多快?)。
- ReplicaSet 负责执行命令(具体的创建和删除 Pod)。
- 旧的
ReplicaSet-v1通常会被保留(虽然副本数为 0),这是为了方便你执行 回滚 (Undo) 操作。如果你发现 v2 有 bug,Deployment 只需要把 v1 的副本数加回去,把 v2 的减掉即可。
4. 通俗类比
- Deployment (项目经理): 负责发布新版本计划。他说:“我们要把所有员工的工作服从蓝色换成红色,为了不影响工作,我们要分批次换。”
- ReplicaSet (工头): 负责具体招人和裁人。
- 旧工头 (RS-v1) 负责管穿蓝衣服的人。
- 新工头 (RS-v2) 负责管穿红衣服的人。
- 过程: 项目经理告诉新工头招 1 个红衣人,告诉旧工头辞退 1 个蓝衣人。最后,所有人都归新工头管,大家都穿红衣服。旧工头虽然手下没人了,但还在公司待命,万一红衣服有问题,项目经理会让他把蓝衣人再招回来。
5. 总结与最佳实践
| 特性 | Deployment | ReplicaSet |
|---|---|---|
| 主要用途 | 无状态应用的部署、更新、回滚 | 确保 Pod 副本数量 |
| 用户操作 | 用户直接操作对象 | 用户通常不直接操作 |
| 更新策略 | 支持滚动更新、重建等 | 不支持(需要手动删除重建) |
| YAML 定义 | kind: Deployment |
kind: ReplicaSet |
结论:
在绝大多数情况下,你只需要编写和操作 Deployment 的 YAML 文件。Kubernetes 会自动为你创建和管理底层的 ReplicaSet。不要手动去修改或删除 ReplicaSet,除非你非常清楚自己在做什么,否则 Deployment 可能会为了恢复期望状态而与你的操作发生冲突。