一、关于 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 管理