13

我浏览了以下文档页面: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

4 回答 4

14

一个标签用于部署本身,它为特定部署提供标签。假设您要删除该部署,然后运行以下命令:

kubectl delete deployment -l app=nginx

这将删除整个部署。

第二个标签告诉资源selector: matchLabels(服务等)根据标签匹配 pod。因此,假设您要创建所有 pod 都具有标签的服务,app=nginx那么您提供以下定义:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: LoadBalancer
  ports:
    - port:  80
  selector:
    app: nginx

上述服务将查找 matchLabels 并绑定已app: nginx分配标签的 pod

第三个标签podTemplate标签,template实际上是podTemplate。它描述了它启动的 pod。因此,假设您有两个副本部署,并且 k8s 将启动 2 个具有template: metadata: labels. 这是微妙但重要的区别,因此您可以为部署和该部署生成的 Pod 使用不同的标签。

于 2019-01-30T10:45:09.047 回答
7

第一个标签:

它是部署标签,用于选择部署。您可以使用以下命令使用第一个标签:

kubectl get deployment -l app=nginx

第二个标签:

它不是一个标签。它是标签选择器,用于选择带有标签 nginx 的 pod。它由 ReplicaSet 使用。

第三个标签:

它是标识 pod 的 pod 标签。ReplicaSet 使用它来维护所需的副本数量,并使用该标签选择器。它还用于使用以下命令选择 pod:

kubectl get pods -l app=nginx
于 2019-01-30T09:00:22.130 回答
2

.metadata.labels用于标记deployment对象本身,您不一定需要它,但就像其他答案所说的那样,它可以帮助您组织对象。

.spec.selector告诉deployment(在引擎盖下它是ReplicaSet对象)如何找到要管理的 pod。对于您的示例,它将管理带有标签的 pod app: nginx

但是你如何告诉 ReplicaSet 控制器首先创建带有该标签的 pod?您在 pod 模板中定义它,.spec.template.metadata.labels.

于 2020-07-10T22:42:38.077 回答
1

正如我们所知,标签是用来识别资源的,

  • 第一个标签标识部署本身
  • 第三个属于 Pod 模板部分。所以,这个是特定于 Pod 的。
  • 第二种,即matchLabels,用于告诉Services、ReplicaSet等资源对指定标签条件下的资源进行操作。

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

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

于 2021-08-10T01:27:11.217 回答