在學(xué)習(xí)本節(jié)內(nèi)容之前,希望你已經(jīng)對Pod和ReplicaSet有了基本的了解船庇。具體請參考以下兩篇文章:
Label是Kubernetes系統(tǒng)中的一個(gè)核心概念。Label以key/value鍵值對的形式附加到任何對象上,如Pod撤蚊,Service,Node帜平,RC(ReplicationController)/RS(ReplicaSet)等。Label可以在創(chuàng)建對象時(shí)就附加到對象上梅鹦,也可以在對象創(chuàng)建后通過API進(jìn)行額外添加或修改裆甩。
在為對象定義好Label后,其他對象就可以通過Label來對對象進(jìn)行引用帘瞭。Label的最常見的用法便是通過spec.selector來引用對象淑掌。下面是文章:Kubernetes對象之ReplicaSet 中新建一個(gè)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
關(guān)于Label的用法重點(diǎn)在于這兩步:
- 通過template.metadata.labels字段為即將新建的Pod附加Label。在上面的例子中蝶念,新建了一個(gè)名稱為nginx的Pod抛腕,它擁有一個(gè)鍵值對為
app:nginx
的Label。 - 通過spec.selector字段來指定這個(gè)RC管理哪些Pod媒殉。在上面的例子中担敌,新建的RC會管理所有擁有
app:nginx
Label的Pod。這樣的spec.selector在Kubernetes中被稱作Label Selector廷蓉。
1. Label的定義
我們通常使用metadata.labels字段全封,來為對象添加Label。Label可以為多個(gè)桃犬。一個(gè)簡單的例子如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
release: stable
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
上面的描述文件為名為nginx的Pod添加了兩個(gè)Label刹悴,分別為app: nginx
和release: stable
。
1.1 常見的Label
一般來說攒暇,我們會給一個(gè)Pod(或其他對象)定義多個(gè)Label土匀,以便于配置,部署等管理工作形用。例如:部署不同版本的應(yīng)用到不同的環(huán)境中就轧;或者監(jiān)控和分析應(yīng)用(日志記錄证杭,監(jiān)控,報(bào)警等)妒御。通過多個(gè)Label的設(shè)置解愤,我們就可以多維度的Pod或其他對象進(jìn)行精細(xì)化管理。一些常用的Label示例如下:
relase: stable
release: canary
environment: dev
environemnt: qa
environment: production
tier: frontend
tier: backend
tier: middleware
......
Label是自定義的一些key/value對乎莉,你可以隨心所欲的設(shè)置送讲。
2. Label Selector
帶有Label的對象創(chuàng)建好之后,我們就可以通過Label Selector來引用這些對象梦鉴。
通常我們通過描述文件中的spec.selector字段來指定Label李茫,從而Kubernetes尋找到所有包含你指定Label的對象揭保,進(jìn)行管理肥橙。
Kubernetes目前支持兩種類型的Label Selector:
- 基于等式的Selector(Equality-based)
- 基于集合的Selector(Set-based)
RC只支持基于等式的Selector,而RS兩種Selector都支持秸侣。
2.1 基于等式的Selector
上文中創(chuàng)建RC的例子中的使用的就是基于等式的Selector存筏。基于等式的Selector通過等式類的表達(dá)式來進(jìn)行篩選味榛。例如:
- app=nginx 選擇所有Label中key為app椭坚,value為nginx的對象。
- env!=dev 選擇所有Label中key為env搏色,value不等于dev的對象善茎。
2.2 基于集合的Selector
基于集合的Selector通過集合操作的表達(dá)式來進(jìn)行篩選。例如:
- 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)建一組或多組標(biāo)簽耕赘,Service,RC/RS等組件則通過Label Selector來定位需要管理的對象膳殷,Label和Label Selector共同構(gòu)成了Kubernetes系統(tǒng)中最核心的應(yīng)用模型操骡,使得對象能夠精細(xì)分組,同時(shí)實(shí)現(xiàn)了集群的高可用性赚窃。
參考文章
- Kubernetes權(quán)威指南