ReplicaSet 是什么
ReplicaSet 是副本守恒器:它保证指定数量的同质 Pod 同时在运行,少了创建、多了删除,自身不具备版本概念与发布能力。日常不会直接维护它,因为 Deployment 把它当作执行层使用:改一次 Pod 模板,Deployment 就新建一个 ReplicaSet,由新旧两代副本数的加减完成滚动更新。看懂这层结构,才能解释清楚副本数为什么会自己变回去、旧对象为什么还留着。
基本信息
| 关键字段 | replicas 副本数、selector 匹配哪些 Pod、template 生成 Pod 的模板 |
|---|---|
| 归属关系 | 由 Deployment 创建,通过 ownerReferences 标记从属 |
| 命名规则 | Deployment 名 + 模板哈希 + 随机后缀,哈希变了就是换了模板 |
| 历史保留 | 受 Deployment 的 revisionHistoryLimit 控制,默认 10 代 |
| 回滚 | rollout undo 把副本还给旧 ReplicaSet,不需要重建对象 |
| 查看 | kubectl get rs 的 DESIRED/CURRENT/READY 三列最直观 |
典型使用场景
- 看懂 Deployment 三层结构:Deployment 管版本、ReplicaSet 管数量、Pod 跑负载
- 滚动更新期间确认新旧两代是否按预期加减副本
- 排查“副本数被莫名改回”,确认是控制器对账而非人为操作
- 确认旧 ReplicaSet 保留 0 副本的用途,避免误删影响回滚
- 清理历史对象释放 etcd 空间:调整 revisionHistoryLimit
查看层级
查看层级
kubectl get deploy,rs,pods -l app=web # 一次看清三层结构
kubectl get rs -l app=web -o wide # 看新旧两代的期望与实际副本
kubectl describe rs web-7f9d8c5b4 | head -20 # 看事件与从属关系
kubectl get rs web-7f9d8c5b4 -o jsonpath='{.metadata.ownerReferences[0].name}' # 确认父对象
kubectl rollout undo deploy/web --to-revision=2 # 回滚=把副本还给旧 ReplicaSet输出逐列读法
| 列 | 含义 | 正常/异常 |
|---|---|---|
| DESIRED | 期望副本数 | 与 CURRENT 长期不一致且无事件,说明调度受阻 |
| CURRENT | 实际存在的副本数 | 高于 DESIRED 通常是在缩容过程中 |
| READY | 通过就绪探针的数量 | 长期低于 CURRENT,去查探针与容器日志 |
| AGE | 对象存活时长 | 出现很新的对象说明刚发布过或刚扩过容 |
手工改 ReplicaSet 的副本数没有意义:Deployment 下一轮对账就会改回去,应该改 Deployment。
判断发布是否成功看 Deployment 的可用副本与 rollout status,而不是看 ReplicaSet 的 READY:ReplicaSet 只代表副本存在。
旧 ReplicaSet 保留 0 副本不是垃圾:它携带旧版 Pod 模板,rollout undo 时把副本还给它即可完成回滚,删掉就等于放弃这一代回滚点。