在學習本節(jié)內容之前,希望你已經對Pod和ReplicaSet有了基本的了解。具體請參考以下兩篇文章:
Label是Kubernetes系統(tǒng)中的一個核心概念。Label以key/value鍵值對的形式附加到任何對象上,如Pod,Service,Node,RC(ReplicationController)/RS(ReplicaSet)等。Label可以在創(chuàng)建對象時就附加到對象上,也可以在對象創(chuàng)建后通過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:nginxLabel的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,以便于配置,部署等管理工作。例如:部署不同版本的應用到不同的環(huán)境中;或者監(jiān)控和分析應用(日志記錄,監(jiān)控,報警等)。通過多個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的對象創(chuàng)建好之后,我們就可以通過Label Selector來引用這些對象。
通常我們通過描述文件中的spec.selector字段來指定Label,從而Kubernetes尋找到所有包含你指定Label的對象,進行管理。
Kubernetes目前支持兩種類型的Label Selector:
- 基于等式的Selector(Equality-based)
- 基于集合的Selector(Set-based)
RC只支持基于等式的Selector,而RS兩種Selector都支持。
2.1 基于等式的Selector
上文中創(chuàng)建RC的例子中的使用的就是基于等式的Selector?;诘仁降腟elector通過等式類的表達式來進行篩選。例如:
- 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可以給對象創(chuàng)建一組或多組標簽,Service,RC/RS等組件則通過Label Selector來定位需要管理的對象,Label和Label Selector共同構成了Kubernetes系統(tǒng)中最核心的應用模型,使得對象能夠精細分組,同時實現(xiàn)了集群的高可用性。
參考文章
- Kubernetes權威指南