我看了下面的docomentation页面: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
被提及的三个不同时间。
为什么我们需要他们每一个人?我很难从官方文件中理解。
5条答案
按热度按时间1l5u6lss1#
第一个标签是部署本身的标签,它为该特定部署提供标签。假设您要删除该部署,然后运行以下命令:
这将删除整个展开。
第二个标签是
selector: matchLabels
,它告诉资源(服务等)根据标签匹配pod。所以假设你想创建一个所有pod都有app=nginx
标签的服务,那么你需要提供以下定义:上面的服务将查找分配了标签
app: nginx
的matchLabels和bind pod第三个标签是
podTemplate
标签,template
实际上是podTemplate
。它描述了它启动的pod。所以假设您有两个副本部署,k8s将使用template: metadata: labels
中指定的标签启动2个pod。这是微妙但重要的区别,因此您可以为部署和由该部署生成的pod使用不同的标签。8fq7wneg2#
第一个标签:
是用于选择部署的部署标签,使用第一个标签可以使用以下命令:
第二个标签:
不是标签,是标签选择器,用于选择带标签nginx的pod,ReplicaSet使用。
第三个标签:
pod label用于标识pod。ReplicaSet使用它来维护所需的副本数量,并为此使用标签选择器。它还用于通过以下命令选择pod:
8nuwlpux3#
正如我们所知,标签是用来识别资源的,
第一个和第三个分别是对Deployment和Pod的标签分配,第二个是匹配条件表达式而不是分配。
虽然在真实的世界的例子中,所有3个都有相同的标签,但第一个可以不同于第二个和第三个。但是,第二个和第三个通常与第二个相同的是作用于第三个的条件表达式。
zrfyljdw4#
.metadata.labels
用于标记deployment
对象本身,你不一定需要它,但就像其他答案所说的那样,它可以帮助你组织对象。.spec.selector
告诉deployment
(在后台它是ReplicaSet
对象)如何找到要管理的pod。对于您的示例,它将管理标签为app: nginx
的pod。但是如何告诉ReplicaSet控制器首先创建带有该标签的pod呢?在pod模板
.spec.template.metadata.labels
中定义。3duebb1j5#
TL;DR
第一个标签(
.metadata.labels
):Deployments
的标签第二个标签(
.spec.selector.matchLabels
):告诉ReplicaSets
要管理哪些pod。第3个标签(
.spec.template..metadata.labels
):Pod
的标签,以便ReplicaSets
可以找到它。