Label是一个key/value的键值对,可以附加到各种资源对象上。
一个资源对象可以定义任意数量的Label,同一个Label也可以被添加到任意数量的资源对象上去。
通常是在资源对象定义时确定Label,也支持在对象创建后动态添加或删除。
Label和Lable Selector构成了k8s系统中最核心的一个应用模型,可以对被管理对象进行精细分组,以实现整个集群的高可用。
通过给指定的资源对象捆绑一个或多个不同的Label来实现多维度的资源分组管理。一些示例标签如下:
"release" : "stable", "release" : "canary"
"environment" : "dev","environment" : "qa","environment" : "production"
"tier" : "frontend","tier" : "backend","tier" : "cache"
"partition" : "customerA", "partition" : "customerB"
"track" : "daily", "track" : "weekly"
Label Selector可以查询和筛选拥有某些Label的资源对象。
目前支持两种选择器:equality-based(基于平等)和set-based(基于集合)的。前者采用等式的表达式,后者采用集合操作的表达式匹配标签。
标签选择器可以由逗号分隔的多个requirements 组成。在多重需求的情况下,必须满足所有要求,因此逗号分隔符作为AND逻辑运算符。
(1)equality-based示例:
name = redis-slave
env != production
(2)set-based示例:
name in (redis-master, redis-slave)
name not in (frontend)
(3)Label Selector set-based筛选功能仅在以下新出现的管理对象中得到了支持:
Deployment
ReplicaSet
DaemonSet
Job
Label Selector的几个重要使用场景:
kube-controller进程,通过资源对象RC上定义的Label Selector来筛选要监控和管理的Pod副本的数量。
kube-proxy进程,通过Service的Label Selector来选择对应的Pod,建立起每个Service到对应Pod的请求转发路由表,进而实现Service的智能负载均衡机制。
kube-scheduler进程,通过为某些Node定义特定的Label,然后在Pod定义文件中使用NodeSelector进行筛选,进而实现Pod的定向调度功能。