我已经浏览了以下建议页面: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
的出现。
为什么我们每个都需要?我很难从官方文档中了解它。
答案 0 :(得分:5)
第一个标签用于部署本身,它为该特定部署提供标签。假设您要删除该部署,然后运行以下命令:
kubectl delete deployment -l app=nginx
这将删除整个部署。
第二个标签是selector: matchLabels
,它告诉资源(服务等)根据标签来匹配广告连播。因此,可以说如果您要创建所有标签都为app=nginx
的Pod的服务,请提供以下定义:
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
type: LoadBalancer
ports:
- port: 80
selector:
app: nginx
以上服务将查找matchLabel并绑定为其分配标签app: nginx
的吊舱
第三标签是podTemplate
标签,template
实际上是podTemplate
。它描述了启动的容器。因此,假设您有两个副本部署,并且k8s将启动两个template: metadata: labels
中指定标签的容器。这是细微但重要的区别,因此您可以为部署和由该部署生成的Pod设置不同的标签。
答案 1 :(得分:2)
第一个标签:
它是用于选择部署的部署标签。您可以使用以下命令使用第一个标签:
kubectl get deployment -l app=nginx
第二个标签:
它不是标签。标签选择器用于选择带有标签nginx的容器。它由ReplicaSet使用。
第三标签:
它是用于识别豆荚的豆荚标签。 ReplicaSet使用它来维护所需的副本数,并使用该标签选择器。 还可用于通过以下命令选择广告连播:
kubectl get pods -l app=nginx
答案 2 :(得分:2)
.metadata.labels
用于标记deployment
对象本身,您不一定需要它,但是像其他答案所说的那样,它可以帮助您组织对象。
.spec.selector
告诉deployment
(实际上是ReplicaSet
对象)如何找到要管理的Pod。对于您的示例,它将管理标签为app: nginx
的广告连播。
但是您如何告诉ReplicaSet控制器首先创建带有该标签的容器?您可以在窗格模板.spec.template.metadata.labels
中对其进行定义。
答案 3 :(得分:1)
正如我们所知,标签用于识别资源,
虽然第一个和第三个分别是对 Deployment 和 Pods 的标签分配,但第二个是匹配条件表达式而不是分配。
虽然在现实世界的例子中所有 3 个都具有相同的标签,但第一个可能与第二个和第三个不同。但是,第二个和第三个通常与第二个相同的是作用于第三个的条件表达式。