Kubernetes 中的 Label 和 Selector 有啥区别?

Posted

技术标签:

【中文标题】Kubernetes 中的 Label 和 Selector 有啥区别?【英文标题】:What is the difference between Label and Selector in kubernetes?Kubernetes 中的 Label 和 Selector 有什么区别? 【发布时间】:2020-05-18 11:49:27 【问题描述】:

看了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

【问题讨论】:

请参考kubernetes.io/docs/concepts/overview/working-with-objects/… 【参考方案1】:

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

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

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

【讨论】:

那么如果应用有问题的 yaml 配置会发生什么?这里spec.selectorspec.template.metadata 不匹配。所以不会创建豆荚?导致某种幽灵replicaset @asr9 你会得到The Deployment "label-demo" is invalid: spec.template.metadata.labels: Invalid value: map[string]string"app":"nginx", "environment":"production": `selector` does not match template `labels`【参考方案2】:

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

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

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

要仅选择带有“前端”标签的 pod,您可以使用关键字选择器进行过滤。

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

这些是标签:

在这个例子中,一旦我们创建了 pod,我们可以使用 kubectl 和 selector 选项来查看带有这些标签的 pod。

注意:如图所示,标签是键值对(app:App1)

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

controlplane ~ ➜  kubectl get pods --selector env=dev
NAME          READY   STATUS    RESTARTS   AGE
db-1-d2rmb    1/1     Running   0          33m
app-1-cxw9j   1/1     Running   0          33m
app-1-gd9bb   1/1     Running   0          33m
app-1-rlxdz   1/1     Running   0          33m
db-1-5xxlc    1/1     Running   0          33m
db-1-gkflt    1/1     Running   0          33m
db-1-lpd5d    1/1     Running   0          33m

controlplane ~ ➜  

controlplane ~ ➜  kubectl get pods --selector bu=finance
NAME          READY   STATUS    RESTARTS   AGE
db-2-kkhkb    1/1     Running   0          34m
app-1-cxw9j   1/1     Running   0          34m
app-1-gd9bb   1/1     Running   0          34m
app-1-zzxdf   1/1     Running   0          34m
app-1-rlxdz   1/1     Running   0          34m
auth          1/1     Running   0          34m

controlplane ~ ➜  kubectl get all --selector env=prod
NAME              READY   STATUS    RESTARTS   AGE
pod/db-2-kkhkb    1/1     Running   0          34m
pod/app-1-zzxdf   1/1     Running   0          34m
pod/app-2-ptvcv   1/1     Running   0          34m
pod/auth          1/1     Running   0          34m

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/app-1   ClusterIP   10.43.28.163   <none>        3306/TCP   34m

NAME                    DESIRED   CURRENT   READY   AGE
replicaset.apps/db-2    1         1         1       34m
replicaset.apps/app-2   1         1         1       34m

controlplane ~ ➜  kubectl get all --selector env=prod,bu=finance,tier=frontend
NAME              READY   STATUS    RESTARTS   AGE
pod/app-1-zzxdf   1/1     Running   0          34m

【讨论】:

Sooo,我们只在 yaml 文件中添加标签,然后使用 --selector 参数搜索/过滤这些标签? @KostasDemiris 您可以在 yaml 文件或命令行中添加标签。两者都有效。

以上是关于Kubernetes 中的 Label 和 Selector 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

kubernetes集群之Label管理

了解 Diesel 中的特征绑定错误

Label与Label Selector (8)

K8s 基础资源讲解(Namespace, Pod, Label, Deployment, Service)

Kubernetes概述(一篇教你认识k8s)

Kubernetes概述(一篇教你认识k8s)