Kubernetes - 匹配标签、选择器的范围



我有以下部署,

apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deploy
spec:
replicas: 10
selector:
matchLabels:
app: hello-world
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-pod
image: nginx:latest
ports:
- containerPort: 80

此选择器是否仅适用于由部署管理的 Pod 或任何具有相同标签的 Pod 的范围 - 我正在尝试了解选择器的范围

此处的部署选择器选择标签为"app: hello-world"的容器,该容器也由您的部署管理。

总的来说,我引用官方文档:

注意:您必须指定适当的选择器和 Pod 模板标签 在部署中(在本例中为 app:hello-world(。不要重叠标签或 具有其他控制器的选择器(包括其他部署和 有状态集(。Kubernetes 不会阻止你重叠,如果 多个控制器具有重叠的选择器,这些控制器 可能会发生冲突并做出意外行为。

第一个注意:pod-template-hash标签由部署控制器添加到部署创建或采用的每个副本集。

此标签可确保部署的子副本集不重叠。它是通过对副本集的 PodTemplate 进行哈希处理并使用生成的哈希作为添加到副本集选择器、Pod 模板标签以及副本集可能具有的任何现有 Pod 中的标签值来生成的。

因此,现在您可以测试选择器在部署中使用时的工作方式,如下所示

首先创建一个带有标签的nginx POD,如下所示。

$ kubectl run nginx-1 --image=nginx --restart=Never --labels=run=nginx
$ kubectl get pods -o wide --show-labels
NAME                         READY   STATUS              RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/nginx-1                  1/1     Running             0          11m   192.168.58.198   k8s-node02   <none>           <none>            run=nginx

现在创建一个部署,例如具有 4 个副本,如下所示,并在创建时传递与上一个 pod 相同的标签。

注意pod-template-hash在以下日志上创建部署时添加为一个额外的标签。

$ kubectl run nginx --image=nginx --labels=run=nginx --replicas=4
$ kubectl get all -o wide --show-labels
NAME                         READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/nginx-1                  1/1     Running   0          9m37s   192.168.58.198   k8s-node02   <none>           <none>            run=nginx
pod/nginx-6db489d4b7-45tvm   1/1     Running   0          5m20s   192.168.85.197   k8s-node01   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-6np5m   1/1     Running   0          5m20s   192.168.85.198   k8s-node01   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-g5spg   1/1     Running   0          5m20s   192.168.58.200   k8s-node02   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-wgm7h   1/1     Running   0          2m52s   192.168.58.202   k8s-node02   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE    SELECTOR   LABELS
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d3h   <none>     component=apiserver,provider=kubernetes
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR    LABELS
deployment.apps/nginx   4/4     4            4           5m20s   nginx        nginx    run=nginx   run=nginx
NAME                               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES   SELECTOR                                 LABELS
replicaset.apps/nginx-6db489d4b7   4         4         4       5m20s   nginx        nginx    pod-template-hash=6db489d4b7,run=nginx   pod-template-hash=6db489d4b7,run=nginx

所以现在我们将有 4 个部署 pod 和另一个名为 nginx-1 的 pod 正在运行。

因此,现在如果我们编辑第一个 POD 以包含相同的 pod-template-hash,您将看到副本集将立即缩小 Pod 的数量以匹配副本集数量 4。

我们编辑 nginx-1 pod 并添加 pod-hash 模板

$ kubectl edit pod nginx-1
pod/nginx-1 edited
$ kubectl get all -o wide --show-labels
NAME                         READY   STATUS        RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/nginx-1                  1/1     Running       0          21m     192.168.58.198   k8s-node02   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-kx6xr   1/1     Running       0          9m31s   192.168.85.200   k8s-node01   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-s47n7   1/1     Running       0          9m31s   192.168.85.199   k8s-node01   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-vv2t4   0/1     Terminating   0          9m31s   192.168.58.204   k8s-node02   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-xmqns   1/1     Running       0          9m31s   192.168.58.203   k8s-node02   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE    SELECTOR   LABELS
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d3h   <none>     component=apiserver,provider=kubernetes
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR    LABELS
deployment.apps/nginx   4/4     4            4           9m31s   nginx        nginx    run=nginx   run=nginx
NAME                               DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES   SELECTOR                                 LABELS
replicaset.apps/nginx-6db489d4b7   4         4         4       9m31s   nginx        nginx    pod-template-hash=6db489d4b7,run=nginx   pod-template-hash=6db489d4b7,run=nginx

因此,您将看到部署已删除其自己的一个 pod,以将副本集编号正确保持在 4

$ kubectl get all -o wide --show-labels
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE         NOMINATED NODE   READINESS GATES   LABELS
pod/nginx-1                  1/1     Running   0          27m   192.168.58.198   k8s-node02   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-kx6xr   1/1     Running   0          16m   192.168.85.200   k8s-node01   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-s47n7   1/1     Running   0          16m   192.168.85.199   k8s-node01   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
pod/nginx-6db489d4b7-xmqns   1/1     Running   0          16m   192.168.58.203   k8s-node02   <none>           <none>            pod-template-hash=6db489d4b7,run=nginx
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE    SELECTOR   LABELS
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   7d3h   <none>     component=apiserver,provider=kubernetes
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES   SELECTOR    LABELS
deployment.apps/nginx   4/4     4            4           16m   nginx        nginx    run=nginx   run=nginx
NAME                               DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES   SELECTOR                                 LABELS
replicaset.apps/nginx-6db489d4b7   4         4         4       16m   nginx        nginx    pod-template-hash=6db489d4b7,run=nginx   pod-template-hash=6db489d4b7,run=nginx

希望此示例能帮助您了解标签和选择器的工作原理以及范围。

最新更新