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.selector
与spec.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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章