为什么两个具有相同选择器的 Kubernetes ReplicaSets 不会相互冲突?

Why don't two Kubernetes ReplicaSets with same selector conflict with each other?

副本集 1

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: nginx
  name: rs-1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        version: 1.7.1
    spec:
      containers:
      - image: nginx:1.7.1
        name: nginx-1
      restartPolicy: Always

副本集 2

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  labels:
    app: nginx
  name: rs-2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        version: 1.7.9
    spec:
      containers:
      - image: nginx:1.7.9
        name: nginx-1
      restartPolicy: Always

当我创建这两个 ReplicaSet 时,一个忽略另一个创建的 pods。

C02T30K2GTFM:ask erkanerol$ kubectl get pods --show-labels
NAME         READY   STATUS    RESTARTS   AGE     LABELS
rs-1-996cz   1/1     Running   0          5m13s   app=nginx,version=1.7.1
rs-1-ktv9z   1/1     Running   0          5m13s   app=nginx,version=1.7.1
rs-1-w7sbg   1/1     Running   0          5m13s   app=nginx,version=1.7.1
rs-2-2z8rb   1/1     Running   0          4m26s   app=nginx,version=1.7.9
rs-2-5c56s   1/1     Running   0          4m26s   app=nginx,version=1.7.9
rs-2-hls9p   1/1     Running   0          4m26s   app=nginx,version=1.7.9

据我从文档中了解到,如果有足够的 pods 匹配副本集的选择器,则不应创建新的 pods。为什么会这样?是否使用 ownerReferences?

标签是 key/value 对附加到对象,例如 pods、部署等。标签用于识别和分组 kubernetes 资源。

根据kubernetes官方文档,

Unlike names and UUID labels do not provide uniqueness. In general, we expect many objects to carry the same labels.

标签不具有唯一性,标签用于标识以某种方式相关的对象组,以便您可以列出或查看这些对象。

让我们以您在问题中提到的示例为例,它有两个副本集,每个副本集有 3 个副本。两个副本都代表标签 app: nginxversion:1.7.9version:1.7.1

现在,如果您想要识别所有具有标签 app=nginx 的 pods,您可以 运行 以下命令:

kubectl get pods -l app=nginx

它将向您显示全部 6 pods。

现在,如果你想识别 pods 其中有 app=nginx 以及那个 nginx 的特定版本,那么你需要 运行 以下命令:

kubectl get pods -l app=nginx,version=1.7.1

现在它只会显示三个 pods 具有两个标签。

有关更多信息,请阅读有关标签的官方文档 here

那是因为两个副本集有两个不同的 .metadata.name 值,因此它们都有自己独立的资源。即使使用部署集,也可以使用相同的行为。假设您用不同的值命名这两个,这两个部署集也会以相同的标签旋转起来隔离 pods。

他们似乎在使用 ownerReferences。如果是这样,它不符合记录的行为。

公关:https://github.com/kubernetes/kubernetes/pull/27600

代码:https://github.com/kubernetes/kubernetes/blob/0048d2da400b8c48ae83acc6a223a65f3551674a/pkg/controller/controller_ref_manager.go#L69-L72

问题:https://github.com/kubernetes/website/issues/12205