副本集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时,其中一个会忽略另一个创建的pod。
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
据我从文档中了解,如果有足够多的pod与复制集的选择器相匹配,它就不应该创建新的pod。为什么会发生这种事?是否使用所有者引用?
他们似乎在使用所有者引用。如果是这样,它就不符合记录在案的行为。
公关: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
这是因为两个副本集有两个不同的.metadata.name值,因此它们都有自己的独立资源。即使使用部署集,也可以使用相同的行为。假设您用不同的值命名这两个,那么这两个部署集也会产生具有相同标签的隔离pod。
标签是附加到对象(如pod、部署等)的键/值对。标签用于识别和分组kubernetes资源。
根据kubernetes的官方文件,
不同的是,名称和UUID标签不提供唯一性。一般来说,我们期望许多对象带有相同的标签。
标签不是为了唯一性,标签用于标识以某种方式相关的对象组,以便您可以列出或查看这些对象。
让我们举一个你在问题中提到的例子,它有两个复制集,每个复制集有3个复制集。两个复制品都表示标签app: nginx
和version:1.7.9
或version:1.7.1
现在,如果您想识别所有带有标签app=nginx
的pod,您可以运行以下命令:
kubectl get pods -l app=nginx
它将向您展示所有6个吊舱。
现在,如果你想识别具有app=nginx
的pod以及该nginx的特定版本,那么你需要运行以下命令:
kubectl get pods -l app=nginx,version=1.7.1
现在,它将只向您显示三个同时具有这两个标签的吊舱。
欲了解更多信息,请阅读此处标签上的官方文档