iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
DevOps

第一次參賽就學 Kubernetes系列 第 20

[Day 20] Label & Selector

  • 分享至 

  • xImage
  •  

突然安插一個 Label 和 Selector 是因為 AWS 那邊還卡了一點 dns 的設定,故這邊回頭來重新看 Label 和 Selector 在 k8s 中還有哪些實用功能。

Labels 是由 key: value 形式標註在物件上,像是 pods,主要是讓使用者可以方便去將管理與篩選一組物件。


Label Selector

目前支援兩種形式的 selector:

  1. Equality-based
  2. Set-based

Equality-base Selector

有三種運算子:

  1. =
  2. ==
  3. !=

以下例子來看看使用方式:

# 選取 key 是 release 且 value 等於 stable 的物件
# 以下兩個是相同的
release = stable
release == stable

# 選取 key 是 environment 且 value 非 dev 的物件
# 以及選取所有不包含 environment key 的物件
environment != dev

Set-base Selector

有三個運算子:

  1. in
  2. notin
  3. 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

組合

逗號代表 AND

# equality-base 與 set-based 混合使用
# 選取 key 是 partition 且 value 是 customerA 「或」customerB 的物件
# 且
# key 有 environment 且 value 非 qa 的物件、所有不包含 environment key 的物件
partition in (customerA, customerB), environment != qa

OR

沒有 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

Config 設定

舊式寫法: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。


參考來源

  1. Kubernetes - Labels and Selectors
  2. What are Kubernetes Labels and Label Selectors?

上一篇
[Day 19] 在 AWS 部署 Kubernetes 叢集 (三) - 使用 kops 在 AWS 上部署叢集 (部署程式)
下一篇
[Day 21] 在 AWS 部署 Kubernetes 叢集 (四) - 部署 AWS EKS
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言