为什么两个具有相同选择器的 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: nginx
和 version:1.7.9
或 version: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。如果是这样,它不符合记录的行为。
副本集 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: nginx
和 version:1.7.9
或 version: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。如果是这样,它不符合记录的行为。