(一)、概述
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
“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系统中最核心的应用模型,使得对象能够精细分组,同时实现了集群的高可用性。