iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 9
0
Software Development

K8S - 30天從擦槍到提槍上陣學習筆記。系列 第 9

day 9 Pod(2)-Labels, Selector, Annotation

Labels (標籤)

標籤是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
https://ithelp.ithome.com.tw/upload/images/20200913/20129656LKsDOtLC2o.png

或使用kubectl get pods -L <label1>,<label2>指定顯示指定Label的資訊
https://ithelp.ithome.com.tw/upload/images/20200913/20129656x8AP5dktSx.png

另外, 透過kubectl label 可以直接對 label進行修改
https://ithelp.ithome.com.tw/upload/images/20200913/20129656RGUpRhcdCj.png

LabelSelector 標籤選擇器

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]}
    

NodeSelector 節點選擇器

pod的Spec區塊可以使用 nodeSelector字段來定義選擇器, 在部署時事先為部分的工作節點設定好標籤之後,可以實現限制某個Pod只能在特定工作節點上運作或是優先運行在特定的節點上。
K8s-scheduler會依照資源狀況自動調配每個Pod的工作節點, 在某些情況下可能需要限制Pod只能運作特定節點的狀況, 就可以設置節點選擇器。

annotation 資源註解

在生成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。


上一篇
day 8 Pod(1)-設計模式, 容器管理
下一篇
day 10 Pod(3)-生命週期, 容器探測
系列文
K8S - 30天從擦槍到提槍上陣學習筆記。30

尚未有邦友留言

立即登入留言