(一)、概述

Label是Kubernetes系统中的一个核心概念。Label以key/value键值对的形式附加到任何对象上,如Pod,Service,Node,RC(ReplicationController)/RS(ReplicaSet)等。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改。
在为对象定义好Label后,其他对象就可以通过Label来对对象进行引用。Label的最常见的用法便是通过spec.selector来引用对象。下面是一个RC的例子:

apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80

关于Label的用法在于这两步

  • 通过template.metadata.labels字段为即将新建的Pod附加Label。在上面的例子中,新建了一个名称为nginx的Pod,它拥有一个键值对为app:nginx的Label。
  • 通过spec.selector字段来指定这个RC管理哪些Pod。在上面的例子中,新建的RC会管理所有拥有app:nginxLabel的Pod。这样的spec.selector在Kubernetes中被称作Label Selector。

    (二)、Label的定义

    通常使用metadata.labels字段,来为对象添加label,label可以为多个,如:

    
    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx
    labels:
    app: nginx
    release: stable
    spec:
    containers:
  • name: nginx
    image: nginx
    ports:
  • containerPort: 80
    上述的描述文件中为Nginx的pod添加了两个label,分别为:app: nginx和release: stable
    ### 2.1、常见的Label
    一般来说,都会给pod或其它的资源定义多个lable以便于配置、部署等管理工作,通过多个label的设置,我们可以多维度的对pod或其它资源对象进行精细化管理,一些常用的label
    ```python
    “release” : “stable”, “release” : “canary”, …
    “environment” : “dev”, “environment” : “qa”, “environment” : “production”
    “tier” : “frontend”, “tier” : “backend”, “tier” : “middleware”
    “partition” : “customerA”, “partition” : “customerB”, …
    “track” : “daily”, “track” : “weekly”

    label是自定义一些key/value对,可以根据需求进行设置

    2.2、Label Selector(标签选择器)

    带有label的对象创建好后,可以通过label selector来引用这些对象。
    通常通过描述文件中的spec.selector字段来指定Label,从而为K8S寻找所有包含指定label的对象进行关联管理。
    K8S目前支持两种类型的label selector标签选择器:

  • 基于等式的Selector(Equality-based)
  • 基于集合的Selector(Set-based)
    RC只支持等式的selector,而RS两种都支持

    2.2.1、基于等式的Selector(Equality-based)

    上文中创建RC的例子中的使用的就是基于等式的Selector。基于等式的Selector通过等式类的表达式来进行筛选。例如:

  • app=nginx 选择所有Label中key为app,value为nginx的对象。
  • env!=dev 选择所有Label中key为env,value不等于dev的对象。

    2.2.2、基于集合的Selector(Set-based)

    基于集合的Selector通过集合操作的表达式来进行筛选。例如:

  • name in (redis-master, redis-slave) 选择所有Label中key为name,并且value为redis-master或redis-slave的对象。
  • env not in (dev) 选择所有Label中key为env,并且value不为dev的对象。
    使用Label可以给对象创建一组或多组标签,Service,RC/RS等组件则通过Label Selector来定位需要管理的对象,Label和Label Selector共同构成了Kubernetes系统中最核心的应用模型,使得对象能够精细分组,同时实现了集群的高可用性。