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

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 个都有相同的标签,但第一个可能与第二个和第三个不同。但是,第二个和第三个通常与第二个相同是作用于第三个的条件表达式。