我有以下部署,
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
希望此示例能帮助您了解标签和选择器的工作原理以及范围。