# 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
    
上次更新: 7/4/2021, 8:22:42 PM