標籤是K8s用來幫助識別object的功能, 它可以在創建的時候就設好標籤, 也可以隨時依照需求新增或調整。一個object可以貼上多個標籤, 同一個標籤也可以貼在不同的object上面, 之後再由LabelSelector進行檢查來完成挑選,透過Labels和LabelSelector相互配合來建立物件關係。
部署時可以在metadata底下加上 labels 字段來定義要加上去的標籤
範例:
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
env: qa
projec_name: project1
spec:
containers:
- name: nginx-pod
image: nginx:latest
創建出pod之後, 可以使用 kubectl get pods --show-labels
查看labels
或使用kubectl get pods -L <label1>,<label2>
指定顯示指定Label的資訊
另外, 透過kubectl label
可以直接對 label進行修改
K8s標籤選擇器有兩種 等值關係equality-based
和 集合關係set-based
; equality-based
像是 env=qa, env!=test; set-based
像是 env in (qa, test)。
如果同時混用多個選擇器執行邏輯會是交集
;設定空的選擇器表示不設限制,每個object都會被選到。
使用方式為 kubectl get -l
equality-based
範例:
kubectl get -l "env!=production" pods -L env,projec_name
也可以串多個條件
kubectl get -l "env=production,project_name=project1" pods -L env,projec_name
set-based
支持 in
, notin
, exist
三種操作符kubectl get pods -l "env in (qa, test)" -L env,project_name
K8s 的Service, Deployment, ReplicaSet 等object 都要透過 LabelSelector才能關聯到Pod, 他們的spec區塊會使用selector
字段, 透過matchLabels
來指定標籤選擇器, 或是使用matchExpressions
來建構複雜的選擇機制。
matchLabels
: 直接給key-value來指定選擇器matchExpressions
: 使用表達式來定義選擇器。selector:
matchLabels:
component: redis
matchExpressions:
- {key: env, project_name: In, values: [qa]}
pod的Spec區塊可以使用 nodeSelector
字段來定義選擇器, 在部署時事先為部分的工作節點設定好標籤之後,可以實現限制某個Pod只能在特定工作節點上運作或是優先運行在特定的節點上。
K8s-scheduler會依照資源狀況自動調配每個Pod的工作節點, 在某些情況下可能需要限制Pod只能運作特定節點的狀況, 就可以設置節點選擇器。
在生成object時會由生成工具自動附加或是由用戶部署時也可以在metadata底下加上 annotations 字段來定義要加上去的註解, 標籤型態為key-value, 可以隨時新增或修改。
kubectl annotate
kubectl describe
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
env: qa
projec_name: project1
annotation:
kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"env":"qa","projec_name":"project1"},"name":"pod-example","namespac...
spec:
containers:
- name: nginx-pod
image: nginx:latest
在設計標籤的時候要給予有意義且淺顯易懂的字段, 可以讓共同維護的人在查找資料的時候快速理解物件之間的關係,不管是標籤或是註解都是可以隨時更新的, 但是更新時要注意不能隨意拿掉標籤, 一旦標籤拿掉之後object可能就會變成孤兒, 在透過某些controller進行異動時就不會異動到這些object。