Kubernetes基本概念之Label
系列目錄
在為物件定義好Label後,其他物件就可以通過Label來對物件進行引用。Label的最常見的用法便是通過spec.selector來引用物件。
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.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。
注: label為任意鍵值對,只要selector在選擇的時候匹配即可
1.1.1. 常見的Label
一般來說,我們會給一個Pod(或其他物件)定義多個Label
relase: stable
release: canary
environment: dev
environemnt: qa
environment: production
tier: frontend
tier: backend
tier: middleware
......
上面說過,Label是自定義的一些key/value對,你可以隨心所欲的設定,但是強烈建議按照一定的慣例或者組織內部規則,以便維護管理
1.2. Label Selector
帶有Label的物件建立好之後,我們就可以通過Label Selector來引用這些物件。
通常我們通過描述檔案中的spec.selector
欄位來指定Label,從而Kubernetes尋找到所有包含你指定Label的物件,進行管理。
Kubernetes目前支援兩種型別的Label Selector:
- 基於等式的Selector(Equality-based)
- 基於集合的Selector(Set-based)
RC只支援基於等式的Selector,而RS兩種Selector都支援。而RC是很早版本就建議棄用的特徵,因此實際專案中強烈建議使用
Deployment
來代替Repliation Controller (RC)
1.2.1. 基於等式的Selector
上文中建立RC的例子中的使用的就是基於等式的Selector。基於等式的Selector通過等式類的表示式來進行篩選。例如:
- app=nginx 選擇所有Label中key為app,value為nginx的物件。
- env!=dev 選擇所有Label中key為env,value不等於dev的物件。
1.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,ReplicationController ReplicaSet,Deployment等元件則通過Label Selector來定位需要管理的物件,Label和Label Selector共同構成了Kubernetes系統中最核心的應用模型,使得物件能夠精細分組,同時實現了叢集的高可用性。