标记k8s资源,然后在同一k8s资源的规范中对标签应用选择器有什么重要性?

时间:2019-12-10 05:37:56

标签: kubernetes

以下是我在k8s网站上遇到的示例。

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx

选择器:     运行:my-nginx 无法弄清楚在规范中对其进行标记,然后在规范定义中应用相同的选择器的原因是什么。找到了很多示例,但没有解释。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: load-balancer-example
  replicas: 2
  template:
    metadata:
      labels:
        run: load-balancer-example
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/node-hello:1.0
          ports:
            - containerPort: 8080
              protocol: TCP

**  选择器:

matchLabels:

  run: load-balancer-example**

2 个答案:

答案 0 :(得分:3)

这是Kubernetes的基本设计概念之一:

资源通过labels and selectors链接。

必须引用其他资源的资源(例如服务或部署)具有选择器,它定义了一组标签。这些资源选择具有标签与该选择器匹配的所有(特定类型的)资源。

例如,带有选择器a=b的Deployment指的是恰好具有标签a=b的所有Pod。

这就是为什么在您的Deployment规范中,必须在Pod模板(run=load-balancer-example部分)中定义与Deployment选择器中相同的标签(template)。因为您希望部署管理这些 Pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      run: load-balancer-example    # <<<<<----- must match
  replicas: 2
  template:  # <- you define a template for the Pods that will be created here
    metadata:
      labels:
        run: load-balancer-example  # <<<<------ must match
    spec:
      containers:
        - name: hello-world
          image: gcr.io/google-samples/node-hello:1.0
          ports:
            - containerPort: 8080
              protocol: TCP

如果您还有其他带有run=load-balancer-example的Pod,则Deployment也将对其进行管理。另一方面,如果Deployment规范的Pod模板中的标签与选择器不同,则Deployment将不会管理这些Pod,因为它们的标签与Deployment的选择器不匹配。

在您的第一个示例中,服务规范中的标签定义是不相关的。第一个(labels)是服务的标签(如果需要,可以省略它),第二个(selector)是服务的选择器:

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
  labels:
    run: my-nginx  # <<<<<---- unrelated to the other 'run: my-nginx'
spec:
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: my-nginx  # <<<<<---- unrelated to the other 'run: my-nginx'

但是,选择器 与任何Pod的标签有关。特别是,此服务将适用于所有带有run=my-nginx标签的Pod。

答案 1 :(得分:0)

标签可用于对资源进行分组。标签选择器可以将这些分组资源作为目标。

根据资源的不同,标签可用于一种或多种目的。 Deployments使用标签来知道哪些子节点是它们的Pod(此处不涉及标签选择器),Services使用标签将流量转发到后端(Pods)。网络策略使用标签来允许或拒绝流量等。

为什么要使用标签?最明显的例子是服务。豆荚一直死掉。重新创建它们时,它们具有不同的IP地址。您不能依赖Pod的IP地址,因为它随时可能更改。因此,您可以创建服务并根据其标签定位一组pod。服务不会消失,除非您将其删除。用不同的IP地址重新创建的Pod具有相同的标签,因此该服务将Pod的新IP地址作为可能的端点获取,并且流量仍然可以流动。