一、关于 ReplicaSet 的 matchLabels
- 一个 ReplicaSet 必须在
spec.selector中显式声明匹配标签(matchLabels),否则 API 会拒绝部署这个资源。其行为与spec.template.metadata.labels必须一致,否则也会被拒绝。 matchLabels表示所有定义的标签都必须匹配(逻辑 AND 操作)才能被管理。
二、ReplicationController 的选择器行为
- ReplicationController 允许省略
spec.selector字段。如果未指定,Kubernetes 会默认使用 Pod 模板中定义的标签作为选择条件 。 - 而 ReplicaSet 则必须显式声明
selector,且其与模板标签需严格匹配,否则部署失败。
三、修改 Pod 标签后 ReplicaSet 不再管理的情况
- 当你移除 Pod 的某个关键标签,使其不再符合
matchLabels匹配条件时,ReplicaSet 会立刻认为该 Pod 不属于其管理范围,从而创建一个新的 Pod 来补足所需副本数量。 - 而原有 Pod 会脱离 ReplicaSet 的控制,不会被自动删除,成为独立的实例。若恢复缺失的标签,这个 Pod 会重新被 ReplicaSet 识别并控制 。
这也是常用的 “临时让 Pod 脱离控制进行调试,然后恢复标签让其回归” 的安全操作方式。
总结对照:
| 项目 | 行为说明 |
|---|---|
| ReplicaSet 未声明 selector | 部署失败 |
| ReplicaSet selector 与模板标签不一致 | 部署失败 |
| RC 未声明 selector | 使用模板标签作为默认 selector,部署成功 |
| ReplicaSet 必须显式声明 selector | 包含所有标签必须匹配(逻辑 AND) |
| 移除 Pod 标签导致其不被管理 | ReplicaSet 会立即补充新 Pod,原 Pod 脱控制、不被删除 |
| 恢复标签使 Pod 回归管理 | 再次符合 selector,就被 ReplicaSet 管理 |