突然安插一個 Label 和 Selector 是因為 AWS 那邊還卡了一點 dns 的設定,故這邊回頭來重新看 Label 和 Selector 在 k8s 中還有哪些實用功能。
Labels 是由 key: value
形式標註在物件上,像是 pods,主要是讓使用者可以方便去將管理與篩選一組物件。
目前支援兩種形式的 selector:
有三種運算子:
=
==
!=
以下例子來看看使用方式:
# 選取 key 是 release 且 value 等於 stable 的物件
# 以下兩個是相同的
release = stable
release == stable
# 選取 key 是 environment 且 value 非 dev 的物件
# 以及選取所有不包含 environment key 的物件
environment != dev
有三個運算子:
in
notin
exists
以下例子來看看使用方式:
# 選取 key 是 environment 且 value 是 production「或」qa 的物件
environment in (production, qa)
# 選取 key 是 tier 且 value 非 frontend「或」backend 的物件
# 以及選取所有不包含 tier key 的物件
tier notin (frontend, backend)
# 選取所有有 key 是 partition 的物件,不管 value 為何
partition
# 選取所有沒有 key 是 partition 的物件,不管 value 為何
!partition
# equality-base 與 set-based 混合使用
# 選取 key 是 partition 且 value 是 customerA 「或」customerB 的物件
# 且
# key 有 environment 且 value 非 qa 的物件、所有不包含 environment key 的物件
partition in (customerA, customerB), environment != qa
沒有 OR 的運算子,可以使用 set-based 的 in
運算子
partition in (customerA, customerB)
在使用 kubectl get
查詢時,label selector 可以作為查詢參數來篩選想找的物件。
# --show-labels 顯示所有物件的 labels
kubectl get pods --show-labels
# 篩選 environment label 且 value 為 production 的 pods
# 並且該 pods 有 tier label 且 value 為 frontend
kubectl get pods -l environment=production,tier=frontend
# 與上面意思相同,但如果以 set-based 來篩選時必須以單引號(')圍起
kubectl get pods -l 'environment in (production),tier in (frontend)'
# -L 與 -l 的差異在於,-L 只需要寫 key 的 value;-l 必須寫出整個 key-pair
# 以下是篩選有 env 與 versions key 的 pods,不論 value 為何
kubectl get pods -L env,versions
使用 kubectl delete
刪除 pods 時。
# 刪除 environment label 其 value 為 qa 的 pods
kubectl delete pods -l environment=qa
使用 kubectl label
為 pods 加上新的標籤。
# 將 label app 為 myapp 的 pods 加上 environment 的 label、值為 qa
kubectl label pods -l app=myapp environment=qa
舊式寫法:Service、Replication Controller 使用方式。
...
spec:
selector:
app: myapp
tier: frontend # 等同於 app = myapp, tier: frontend
...
現在(新式)寫法:
...
selector:
matchLables:
app: myapp
matchExpressions:
- { key: tier, operator: In, value: [frontend] }
...
matchLabel
:這邊跟舊式一樣。matchExpressions
:支援 set-based 的寫法,key 是 tier 且 value 為 frontend。還有一些範例:
matchExpression:
- { key: environment, operator: Exists } # 選取有 environment label
matchExpression:
- { key: partition, operator: DoesNotExists } # 選取沒有 partition label
目前支援新式寫法的有 Job、Deployment、RelicaSet 及 DaemonSet。