为什么在一次部署中三次提到标签

时间:2019-01-30 08:53:49

标签: kubernetes kubernetes-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的出现。

为什么我们每个都需要?我很难从官方文档中了解它。

4 个答案:

答案 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)

正如我们所知,标签用于识别资源,

  • 第一个标签标识部署本身
  • 第三个属于 Pod 模板部分。所以,这是特定于 Pod 的。
  • 第二个,即 matchLabels 用于告诉服务、副本集和其他资源在指定标签条件下对资源进行操作。

虽然第一个和第三个分别是对 Deployment 和 Pods 的标签分配,但第二个是匹配条件表达式而不是分配。

虽然在现实世界的例子中所有 3 个都具有相同的标签,但第一个可能与第二个和第三个不同。但是,第二个和第三个通常与第二个相同的是作用于第三个的条件表达式。