Kubernetes基本概念之Label
在学习本节内容之前,希望你已经对Pod和ReplicaSet有了基本的了解。具体请参考以下两篇文章:
Label是Kubernetes系统中的一个核心概念。Label以key/value键值对的形式附加到任何对象上,如Pod,Service,Node,RC(ReplicationController)/RS(ReplicaSet)等。Label可以在创建对象时就附加到对象上,也可以在对象创建后通过API进行额外添加或修改。
在为对象定义好Label后,其他对象就可以通过Label来对对象进行引用。Label的最常见的用法便是通过spec.selector来引用对象。下面是文章:Kubernetes对象之ReplicaSet 中新建一个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:nginx
Label的Pod。这样的spec.selector在Kubernetes中被称作Label Selector。
1. 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
。
1.1 常见的Label
一般来说,我们会给一个Pod(或其他对象)定义多个Label,以便于配置,部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监控和分析应用(日志记录,监控,报警等)。通过多个Label的设置,我们就可以多维度的Pod或其他对象进行精细化管理。一些常用的Label示例如下:
relase: stable
release: canary
environment: dev
environemnt: qa
environment: production
tier: frontend
tier: backend
tier: middleware
......
Label是自定义的一些key/value对,你可以随心所欲的设置。
2. Label Selector
带有Label的对象创建好之后,我们就可以通过Label Selector来引用这些对象。
通常我们通过描述文件中的spec.selector字段来指定Label,从而Kubernetes寻找到所有包含你指定Label的对象,进行管理。
Kubernetes目前支持两种类型的Label Selector:
- 基于等式的Selector(Equality-based)
- 基于集合的Selector(Set-based)
RC只支持基于等式的Selector,而RS两种Selector都支持。
2.1 基于等式的Selector
上文中创建RC的例子中的使用的就是基于等式的Selector。基于等式的Selector通过等式类的表达式来进行筛选。例如:
- app=nginx 选择所有Label中key为app,value为nginx的对象。
- env!=dev 选择所有Label中key为env,value不等于dev的对象。
2.2 基于集合的Selector
基于集合的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系统中最核心的应用模型,使得对象能够精细分组,同时实现了集群的高可用性。
参考文章
- Kubernetes权威指南