为什么标签在一次部署中被提及三次
Why labels are mentioned three times in a single deployment
我浏览了以下文档页面:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
示例部署yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
我们可以在这里看到标签 app: nginx
被提及的三个不同时间。
为什么我们需要它们中的每一个?我很难从官方文档中理解它。
第一个标签:
部署标签,用于select部署。您可以使用第一个标签使用以下命令:
kubectl get deployment -l app=nginx
第二个标签:
这不是标签。它是带有标签 nginx 的标签 select 或 select pod。它被 ReplicaSet 使用。
第三个标签:
识别的是pod标签pods。 ReplicaSet 使用它来维护所需的副本数,并为该标签使用 selector。
它还用于使用以下命令 selects pod:
kubectl get pods -l app=nginx
第一个标签 用于部署本身,它为该特定部署提供标签。假设您想删除该部署,那么您 运行 以下命令:
kubectl delete deployment -l app=nginx
这将删除整个部署。
第二个标签是selector: matchLabels
,它告诉资源(服务等)根据标签匹配pod。因此,假设您要创建具有所有 pods 标签 app=nginx
的服务,那么您提供以下定义:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
上述服务将查找 matchLabels 并绑定 pods,其中分配了标签 app: nginx
第三个标签是podTemplate
个标签,template
实际上是podTemplate
。它描述了它被启动的 pod。因此,假设您有两个副本部署,k8s 将启动 2 个 pods,标签在 template: metadata: labels
中指定。这是一个细微但重要的区别,因此您可以为部署使用不同的标签,并且 pods 由该部署生成。
.metadata.labels
用于标记 deployment
对象本身,您不一定需要它,但就像其他答案所说的那样,它可以帮助您组织对象。
.spec.selector
告诉 deployment
(底层是 ReplicaSet
对象)如何找到要管理的 pods。对于您的示例,它将使用标签 app: nginx
.
管理 pods
但是您如何告诉 ReplicaSet 控制器首先使用该标签创建 pods?您在广告连播模板中定义 .spec.template.metadata.labels
.
众所周知,标签是用来标识资源的,
- 第一个标签标识 Deployment 本身
- 第三个属于 Pod 模板部分。所以,这个是特定于 Pod 的。
- 第二个,即matchLabels,用于告诉Services、ReplicaSet等资源在指定的标签条件下对资源进行操作。
第一个和第三个分别是对Deployment和Pods的标签赋值,第二个是匹配条件表达式而不是赋值
虽然在现实世界的例子中所有 3 个都有相同的标签,但第一个可能与第二个和第三个不同。但是,第二个和第三个通常与第二个相同是作用于第三个的条件表达式。
我浏览了以下文档页面:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
示例部署yaml如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
我们可以在这里看到标签 app: nginx
被提及的三个不同时间。
为什么我们需要它们中的每一个?我很难从官方文档中理解它。
第一个标签:
部署标签,用于select部署。您可以使用第一个标签使用以下命令:
kubectl get deployment -l app=nginx
第二个标签:
这不是标签。它是带有标签 nginx 的标签 select 或 select pod。它被 ReplicaSet 使用。
第三个标签:
识别的是pod标签pods。 ReplicaSet 使用它来维护所需的副本数,并为该标签使用 selector。 它还用于使用以下命令 selects pod:
kubectl get pods -l app=nginx
第一个标签 用于部署本身,它为该特定部署提供标签。假设您想删除该部署,那么您 运行 以下命令:
kubectl delete deployment -l app=nginx
这将删除整个部署。
第二个标签是selector: matchLabels
,它告诉资源(服务等)根据标签匹配pod。因此,假设您要创建具有所有 pods 标签 app=nginx
的服务,那么您提供以下定义:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
上述服务将查找 matchLabels 并绑定 pods,其中分配了标签 app: nginx
第三个标签是podTemplate
个标签,template
实际上是podTemplate
。它描述了它被启动的 pod。因此,假设您有两个副本部署,k8s 将启动 2 个 pods,标签在 template: metadata: labels
中指定。这是一个细微但重要的区别,因此您可以为部署使用不同的标签,并且 pods 由该部署生成。
.metadata.labels
用于标记 deployment
对象本身,您不一定需要它,但就像其他答案所说的那样,它可以帮助您组织对象。
.spec.selector
告诉 deployment
(底层是 ReplicaSet
对象)如何找到要管理的 pods。对于您的示例,它将使用标签 app: nginx
.
但是您如何告诉 ReplicaSet 控制器首先使用该标签创建 pods?您在广告连播模板中定义 .spec.template.metadata.labels
.
众所周知,标签是用来标识资源的,
- 第一个标签标识 Deployment 本身
- 第三个属于 Pod 模板部分。所以,这个是特定于 Pod 的。
- 第二个,即matchLabels,用于告诉Services、ReplicaSet等资源在指定的标签条件下对资源进行操作。
第一个和第三个分别是对Deployment和Pods的标签赋值,第二个是匹配条件表达式而不是赋值
虽然在现实世界的例子中所有 3 个都有相同的标签,但第一个可能与第二个和第三个不同。但是,第二个和第三个通常与第二个相同是作用于第三个的条件表达式。