# Label
Label 是 Kubernetes 的一个重要概念。它的作用就是在资源上添加标识,用来对它们进行区分和选择。
Label 的特点:
- 一个 Label 会以 key/value 键值对的形式附加到各种对象上,如 Node、Pod、Service 等。
- 一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源对象上去。
- Label 通常在资源对象定义时确定,当然也可以在对象创建后动态的添加或删除。
可以通过 Label 实现资源的多纬度分组,以便灵活、方便地进行资源分配、调度、配置和部署等管理工作。
一些常用的 Label 标签示例如下:
- 版本标签:“version”:”release”, ”version”:”stable”...
- 环境标签:“environment”:”dev”, “environment”:”test”, “environment”:”pro”...
- 架构标签:“tier”:”frontend”, ”tier”:”backend”...
标签定义完毕之后,还要考虑到标签的选择,这就要用到 Label Selector,即:
- Label 用于给某个资源对象定义标识。
- Label Selector 用于查询和筛选拥有某些标签的资源对象。
当前有两种 Label Selector:
基于等式的 Label Selector
- name=slave:选择所有包含 Label 中的 key=“name” 并且 value=“slave” 的对象。
- env!=production:选择所有包含 Label 中的 key=“name” 并且 value!=“production” 的对象。
基于集合的 Label Selector
- name in (master,slave):选择所有包含 Label 中的 key=“name” 并且 value=“master” 或 value=“slave” 的对象。
- name not in (master,slave):选择所有包含 Label 中的 key=“name” 并且 value!=“master” 和 value!=“slave” 的对象。
标签的选择条件可以使用多个,此时将多个 Label Selector 进行组合,使用逗号(,)进行分隔即可。
- name=salve,env!=production。
- name not in (master,slave),env!=production。
# 一、创建 Label
语法:为资源打标签
kubectl label 资源类型 资源名称 key=value [-n 命名空间]
示例:为 Nginx 的 Pod 打标签
# 查看有什么 Pod [root@k8s-master ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-55f8fd7cfc-g78sc 1/1 Running 0 47h # 为 Nginx 打上 version=1.0 的标签 [root@k8s-master ~]# kubectl label pod nginx-55f8fd7cfc-g78sc version=1.0 pod/nginx-55f8fd7cfc-g78sc labeled # 查看 Label [root@k8s-master ~]# kubectl describe pods Name: nginx-55f8fd7cfc-g78sc Namespace: default Priority: 0 Node: k8s-node2/172.16.58.202 Start Time: Thu, 01 Jul 2021 20:52:16 -0700 Labels: app=nginx pod-template-hash=55f8fd7cfc version=1.0 # 刚刚打的标签就在这里 ←←←
也可以在「使用配置文件」创建各种资源的时候,在配置文件的
labels
标签中设置资源的 Label。
# 二、更新 Label
语法:更新资源的标签
kubectl label 资源类型 资源名称 key=value [-n 命名空间] --overwrite
示例:为 Nginx 的 Pod 更新标签,将上述 version 更新为 2.0:
# 更新 [root@k8s-master ~]# kubectl label pod nginx-55f8fd7cfc-g78sc version=2.0 --overwrite pod/nginx-55f8fd7cfc-g78sc labeled # 检查更新 [root@k8s-master ~]# kubectl describe pods Name: nginx-55f8fd7cfc-g78sc Namespace: default Priority: 0 Node: k8s-node2/172.16.58.202 Start Time: Thu, 01 Jul 2021 20:52:16 -0700 Labels: app=nginx pod-template-hash=55f8fd7cfc version=2.0 # version 已经从 1.0 更新到 2.0 了
# 三、查看 Label
除了上述通过 describe
在资源的详细信息中查到资源拥有的 Label,我们还可以通过 --show-labels
选项直接查看资源拥有的 Label。
如下:
[root@k8s-master ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-55f8fd7cfc-g78sc 1/1 Running 0 47h app=nginx,pod-template-hash=55f8fd7cfc,version=2.0
# 四、筛选 Label
语法:
kubectl get 资源类型 -l Label条件 [-n 命名空间]
举例:
[root@k8s-master ~]# kubectl get pods -l version=2.0 --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-55f8fd7cfc-g78sc 1/1 Running 0 47h app=nginx,pod-template-hash=55f8fd7cfc,version=2.0
# 五、删除 Label
# 1. 命令行删除
语法:删除标签
kubectl label 资源类型 资源名称 key- [-n 命名空间]
举例:删除 Nginx Pod 的 version 标签
# 删除 version 标签 [root@k8s-master ~]# kubectl label pod nginx-55f8fd7cfc-g78sc version- pod/nginx-55f8fd7cfc-g78sc labeled # 检查是否删除成功 [root@k8s-master ~]# kubectl get pods --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-55f8fd7cfc-g78sc 1/1 Running 0 47h app=nginx,pod-template-hash=55f8fd7cfc