kubernetes中的Label和Selector有什么区别?

The*_*tso 6 kubernetes devops kubernetes-pod

看了kubernetes.io上的官方文档,我还是想知道 Kubernetes 中 label 和 selector 到底有什么区别?

编辑:例如考虑以下 Kubernetes 对象,以下 yaml 文件的 Labels 和 Selectors 有什么区别。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: label-demo
  labels:
    environment: production
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: App1
  template:
    metadata:
      labels:
        environment: production
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.7.9
Run Code Online (Sandbox Code Playgroud)

Str*_*ker 14

标签是我们可以附加到每个项目的属性,例如其类型、种类等。

\n

选择器帮助我们找到这些项目。您可以将选择器视为过滤器。

\n

我们可以根据一些属性来标记 Pod,例如应用程序名称、前端、后端。

\n

要仅选择带有“front-end”标签的 Pod,您可以使用关键字选择器进行过滤。

\n

我们在 kubernetes、pod、节点、服务、复制、部署等中有不同类型的对象。\n随着时间的推移,这些对象会不断增长,我们需要一种方法来按不同类别过滤它们,例如按类型(pod)对它们进行分组或查看按应用程序名称(app1、app2)或其功能(前端、后端等)划分对象。

\n

在此输入图像描述

\n

这些是标签:

\n

在此输入图像描述

\n

在此示例中,一旦创建了 pod,我们就可以使用带有选择器选项的 kubectl 来查看带有这些标签的 pod。

\n

在此输入图像描述

\n

在此输入图像描述

\n

注意:标签是键值对,如图所示(应用程序:App1)

\n

这是如何根据标签(env、bu 代表业务部门,最后是所有对象)选择 pod 的另一个示例

\n
controlplane ~ \xe2\x9e\x9c  kubectl get pods --selector env=dev\nNAME          READY   STATUS    RESTARTS   AGE\ndb-1-d2rmb    1/1     Running   0          33m\napp-1-cxw9j   1/1     Running   0          33m\napp-1-gd9bb   1/1     Running   0          33m\napp-1-rlxdz   1/1     Running   0          33m\ndb-1-5xxlc    1/1     Running   0          33m\ndb-1-gkflt    1/1     Running   0          33m\ndb-1-lpd5d    1/1     Running   0          33m\n\ncontrolplane ~ \xe2\x9e\x9c  \n\ncontrolplane ~ \xe2\x9e\x9c  kubectl get pods --selector bu=finance\nNAME          READY   STATUS    RESTARTS   AGE\ndb-2-kkhkb    1/1     Running   0          34m\napp-1-cxw9j   1/1     Running   0          34m\napp-1-gd9bb   1/1     Running   0          34m\napp-1-zzxdf   1/1     Running   0          34m\napp-1-rlxdz   1/1     Running   0          34m\nauth          1/1     Running   0          34m\n\ncontrolplane ~ \xe2\x9e\x9c  kubectl get all --selector env=prod\nNAME              READY   STATUS    RESTARTS   AGE\npod/db-2-kkhkb    1/1     Running   0          34m\npod/app-1-zzxdf   1/1     Running   0          34m\npod/app-2-ptvcv   1/1     Running   0          34m\npod/auth          1/1     Running   0          34m\n\nNAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE\nservice/app-1   ClusterIP   10.43.28.163   <none>        3306/TCP   34m\n\nNAME                    DESIRED   CURRENT   READY   AGE\nreplicaset.apps/db-2    1         1         1       34m\nreplicaset.apps/app-2   1         1         1       34m\n\ncontrolplane ~ \xe2\x9e\x9c  kubectl get all --selector env=prod,bu=finance,tier=frontend\nNAME              READY   STATUS    RESTARTS   AGE\npod/app-1-zzxdf   1/1     Running   0          34m\n
Run Code Online (Sandbox Code Playgroud)\n


Arg*_*dhu 8

标签是附加到对象(例如 pod)的键/值对。标签旨在用于指定对用户有意义和相关的对象的标识属性,但不直接暗示核心系统的语义。标签可用于组织和选择对象的子集。

通过标签选择器,客户端/用户可以识别一组对象。标签选择器是 Kubernetes 中的核心分组原语。

简而言之,标签选择器依靠标签来选择一组资源,例如 pod。例如,部署通过部署规范中的标签选择器选择一组 pod。

  • @asr9您将得到`部署“label-demo”无效:spec.template.metadata.labels:无效值:map[string]string{“app”:“nginx”,“environment”:“product”}: \`选择器\` 与模板\`标签\` 不匹配。 (3认同)
  • 那么如果应用有问题的 yaml 配置会发生什么?这里“spec.selector”与“spec.template.metadata”不匹配。那么不会创建任何 Pod 吗?导致某种幽灵“复制集”? (2认同)