Kubernetes 核心概念之1 label、Select

官方文档:https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/

Lable、Selector

当 Kubernetes 对系统中任何 API 对象(如 Pod 和节点)进行 “分组” 时,会为其添加 Label(键值对格式 key=value)用以精准的选择对应的 API 对象。而 Selector 则是针对匹配对象的查询方法。总结起来二者的分工就是:

  • Label 用于给某个资源定义标识
  • Label Selector 用于查询和筛选拥有某些标签的资源对象

Label(标签) 概述

Label 是 Kubernetes 的一个核心概念。一个 Label 就是一个 key:value 的键值对被关联到对象上,其中 key 与 value 由用户自己指定。

1
2
3
4
"labels": {
"key1": "value1",
"key2": "value2"
}

标签的使用使得我们能标识出对象的一些特殊特点,比如说标识了某个 Pod,那么用户就可以一眼看出这个 Pod 是干什么的。

标签可以用来划分特定组的对象,可以在创建一个对象的时候直接给与,也可以在后期动态添加或删除,每一个对象可以拥有多个标签,但是 key 值必须是唯一的

label 有如下的一些特点:

  • label 可以被附加到各种资源对象上
  • 一个资源对象可以定义任意数量的 label
  • 同一个 label 可以被添加到任意数量的资源对象上

Label 语法规则

语法格式:key: value(键值对)

Key:

  • 不超过 63 个字符
  • 支持使用前缀,前缀必须是 DNS 子域,不超过253个字符。
  • 系统化组件创建的 label 必须指定前缀。kubernetes.io 和 k8s.io 由 kubernetes 保留
  • 格式:[A-Za-z0-9][A-Za-z0-9_-.]

value:

  • 不超过 63 个字符
  • 格式:[A-Za-z0-9][A-Za-z0-9_-.]

Label 的定义

Label 最常见的用法是使用 metadata.labels 字段来为对象定义 Label,使用 spec.selector 字段来引用对象。如下:

1
2
3
4
5
6
7
# 添加Label
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: new_nginx # 定义Label
1
2
3
4
5
6
7
8
9
# 引用label
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
replicas: 1
selector:
app: new_nginx # 引用刚刚定义的Label

Label 附加到 Kubernetes 集群中的各种资源对象上,目的就是对这些资源对象进行 分组管理,而分组管理的核心正是 Label Selector。需要知道 Label 与 Label Selector 都不能单独定义,必须附加在一些资源对象的定义文件上,一般是附加在 RC 和 Service 的资源定义文件中的。

Label 常用命令

  • 查看标签

    1
    kubectl get pod nginx -n dev --show-labels
  • 为 Pod 资源打标签

    1
    2
    # 为名为nginx的pod添加label aaa=bbb
    kubectl label pod nginx aaa=bbb -n dev
  • 为 Pod 资源更新标签

    1
    2
    # 将名为nginx的pod的label修改为ccc=ddd,且覆盖现有的value
    kubectl label pod nginx ccc=ddd -n dev --overwrite
  • 筛选标签

    1
    kubectl get pod -n dev -l eee=fff --show-labels
  • 删除标签

    1
    2
    # 删除nginx中名为aaa的label
    kubectl label pod nginx aaa- -n dev

selector(标签选择器)

当我们给一组对象,比如有 10 个 pod,打上了不同的标签之后,当我们要选择其中的部分,或者全部作为使用目标的时候,就可以使用 label selector 来实现这个操作,标签选择器中指定具体的过滤的条件,然后,就能在10个pod中过滤出满足我们要求的这些pod

selector 有几种方式可以使用,比如在命令行中使用,或者在资源对象的定义文件中使用

命令行方式使用

1
2
3
4
5
6
7
8
9
10
11
12
13
# 过滤出所有包含,env=dev 的 pod
[root@nccztsjb-node-23 ~]# kubectl get pod -l env=dev --show-labels


# 过滤出来,包含env=prod,app=nginx的pod
[root@nccztsjb-node-23 ~]# kubectl get pod -l 'env=prod,app=nginx' --show-labels


# 过滤出来不包含app=nginx01和app=nginx03的pod
[root@nccztsjb-node-23 ~]# kubectl get pod -l 'app notin (nginx,nginx03)' --show-labels

# 过滤出来不是env=dev的pod
[root@nccztsjb-node-23 ~]# kubectl get pod -l 'env != dev' --show-labels

文件中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: Service
metadata:
name: service-label
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
env: prod
app: nginx # 两个条件需要同时满足

job,deployment,replicaset,daemonset 不仅仅支持基于等式的匹配,也支持基于集合的匹配。

matchlabels 用于匹配一组的标签,与直接在 selector 中的作用相同

在 yaml 中使用基于集合的方式的标签的匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-label05
spec:
selector:
matchLabels:
app: nginx05
env: online
replicas: 1
template:
metadata:
labels:
app: nginx05
env: online
release: stable
spec:
containers:
- image: 172.20.58.152/middleware/nginx:1.21.4
name: nginx

另外,在集合的方式里,matchExpression 也可以作为匹配的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: apps/v1
kind: Deployment
metadata:
name: pod-label06
spec:
selector:
matchLabels:
app: nginx06
env: online
matchExpressions:
- {key: release, operator: In, values: [stable] }
- {key: app,operator: NotIn, values: [nginx02,nginx03] }
replicas: 1
template:
metadata:
labels:
app: nginx06
env: online
release: stable
spec:
containers:
- image: 172.20.58.152/middleware/nginx:1.21.4
name: nginx

matchLabels 用于定义一组Label,与直接写在 Selector 中作用相同。matchExpression 用于定义一组基于集合的筛选条件,可用的条件运算符包括:In、NotIn、Exists和DoesNotExist。

如果同时设置了 matchLabels 和 matchExpression,则两组条件为“AND”关系,即所有条件需要满足才能完成 Selector 的筛选。


Kubernetes 核心概念之1 label、Select
https://flepeng.github.io/042-云原生-02-kubernetes-31-核心概念-Kubernetes-核心概念之1-label、Select/
作者
Lepeng
发布于
2023年3月1日
许可协议