1. 程式人生 > 實用技巧 >Kubernetes進階實戰讀書筆記:管理Pod資源物件(標籤選擇器)

Kubernetes進階實戰讀書筆記:管理Pod資源物件(標籤選擇器)

一、標籤概述

1、概述

2、App=MyApp

3、App = MyApp, Role = FE

實踐中、建議鍵名及鍵值能做到到 "見名知義" 且儘可能保持簡單

二、管理資源標籤

1、資源清單

[root@master chapter4]# cat pod-with-labels.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-labels
  labels:
    env: qa
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: http
      containerPort: 80
      protocol: TCP

2、建立顯示物件的標籤資訊

[root@master chapter4]# kubectl apply -f pod-with-labels.yaml 
pod "pod-with-labels" created
[root@master chapter4]# kubectl get pods --show-labels
NAME                        READY     STATUS             RESTARTS   AGE       LABELS
pod-with-labels             1/1       Running            0          27s       env=qa,tier=frontend

3、指定顯示有著特定鍵的標籤資訊

[root@master chapter4]# kubectl get pods -L env,tier
NAME                        READY     STATUS             RESTARTS   AGE       ENV          TIER
httpget                     1/1       Running            4          15d       production   <none>
pod-with-labels             1/1       Running            0          10m       production   frontend

4、為pod新增標籤

[root@master chapter4]# kubectl label pods/httpget env=production
pod "httpget" labeled
[root@master chapter4]# kubectl get pods --show-labels
NAME                        READY     STATUS             RESTARTS   AGE       LABELS
httpget                     1/1       Running            4          14d       env=production
mysql-7dfcv                 1/1       Running            4          11d       app=mysql
myweb-7vjgt                 0/1       ImagePullBackOff   8          16d       app=myweb
nginx                       1/1       Running            0          22h       app=web
pod-with-labels             1/1       Running            0          27s       env=qa,tier=frontend

5、對於已經附帶了指定鍵名的標籤,設定新的鍵值時需要為命令同事使用 "--overwrit" 命令以強制覆蓋原有的鍵值

[root@master chapter4]# kubectl label pods/pod-with-labels env=production
error: 'env' already has a value (qa), and --overwrite is false
[root@master chapter4]# kubectl label pods/pod-with-labels env=production --overwrite
pod "pod-with-labels" labeled

[root@master chapter4]# kubectl get pods --show-labels
NAME                        READY     STATUS             RESTARTS   AGE       LABELS
httpget                     1/1       Running            4          14d       env=production
mysql-7dfcv                 1/1       Running            4          11d       app=mysql
myweb-7vjgt                 0/1       ImagePullBackOff   8          16d       app=myweb
nginx                       1/1       Running            0          22h       app=web
pod-with-labels             1/1       Running            0          27s       env=qa,tier=frontend

使用者若期望對某標籤之下的資源集合執行某類操作、例如、檢視或刪除等,則需要先使用 "標籤選擇器" 挑選出滿足條件的資源物件

三、標籤選擇器

1、支援型別

2、遵循邏輯

3、測試用例

-l 選項能夠制定使用標籤選擇器

1、顯示名為env值不為qa的所有pod物件

[root@master chapter4]# kubectl get pods -l "env!=qa" -L env
NAME READY STATUS RESTARTS AGE ENV
myapp-deploy-5cbd66595b-nzfjz 1/1 Running 0 17h 
myapp-deploy-5cbd66595b-pldfc 1/1 Running 0 17h 
myapp-deploy-5cbd66595b-vmtln 1/1 Running 0 17h 
pod-example 1/1 Running 1 15h production
pod-use-hostnetwork 1/1 Running 0 65m 
pod-with-labels 1/1 Running 0 3m48s testing
pod-with-securitycontext 1/1 Running 0 44m

2、顯示標籤鍵名env的值不為qa、且標籤鍵名tier的值為frontend的所有pod物件

[root@master chapter4]# kubectl get pods -l "env!=qa,tier=frontend" -L env,tier
NAME READY STATUS RESTARTS AGE ENV TIER
pod-with-labels 1/1 Running 0 4m31s testing frontend

3、顯示標籤鍵名env的值為production或env、且不存在鍵名為tier的所有pod物件

[root@master chapter4]# kubectl get pods -l "env in (production,dev)" -L env
NAME READY STATUS RESTARTS AGE ENV
pod-example 1/1 Running 1 15h production

4、顯示標籤鍵名env的值為production或dev的所有pod物件

[root@master chapter4]# kubectl get pods -l "env in (production,dev),!tier" -L env,tier
-bash: !tier": event not found
[root@master chapter4]# kubectl get pods -l 'env in (production,dev),!tier' -L env,tier
NAME READY STATUS RESTARTS AGE ENV TIER
pod-example 1/1 Running 1 15h production

為了避免shell直譯器解析歎號(!),必須要為此類表示式使用單引號

4、小結

四、生產最佳實踐(多維度標籤使用)

五、Pod結點選擇器nodeSelector

1、資源配置清單

[root@master chapter4]# cat pod-with-nodeselector.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-nodeselector
  labels: 
    env: testing
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:     
    - name: http
      containerPort: 80
      protocol: TCP
  nodeSelector:
    disktype: ssd1

2、給node1、node2節點設定disktype=ssd master節點設定disktype=ssd1

[root@master chapter4]# kubectl label nodes node1 disktype=ssd
node/node1 labeled
[root@master chapter4]# kubectl label nodes node2 disktype=ssd
node/node2 labeled
[root@master chapter4]# kubectl label nodes master disktype=ssd1
node/master labeled

3、檢視具有ssd1的標籤node資源

[root@master chapter4]# kubectl get nodes -l 'disktype' -L disktype
NAME STATUS ROLES AGE VERSION DISKTYPE
master Ready master 2d12h v1.18.6 ssd1
node1 Ready <none> 2d12h v1.18.6 ssd
node2 Ready <none> 2d12h v1.18.6 ssd

4、建立資源清單

[root@master chapter4]# kubectl apply -f pod-with-nodeselector.yaml 
pod/pod-with-nodeselector created

5、驗證排程結果

[root@master chapter4]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
......
pod-with-nodeselector 1/1 Running 0 2m7s 10.244.0.2 master <none> <none>

6、檢視master節點標籤

[root@master chapter4]# kubectl describe node master
Name:               master
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    disktype=ssd1
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=master
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=

7、檢視node1節點標籤

[root@master chapter4]# kubectl describe node node1
Name:               node1
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    disktype=ssd
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=node1
                    kubernetes.io/os=linux

六、資源註解

1、什麼是註解?

註解與標籤類似、註解也是"鍵值" 型別的資料,不過他不能用於標籤及挑選Kubernetes物件、僅用於為資源提供"元資料" 資訊

另外、註解中的元資料不受字元數量的限制、它可大可小、可以為結構化或非結構化形式、也支援使用在標籤中進位制使用的其他字元

2、應用場景

在Kubernetes的新版本中為某資源引入新欄位時、常以註解的方式提供、以避免其增刪等變動對使用者帶來困擾、一旦確定支援使用他們、這些新欄位就將引入到資源中並淘汰相關的註解另外、為資源添加註解也可讓其他使用者快速瞭解資源的相關資訊、例如建立者的身份等、以下為常用的場景案例

1、由宣告式配置層(如apply命令)管理的欄位:將這些欄位定義為註解有助於識別由伺服器或客戶端設定的預設值、系統自動生成的欄位以及自由自動伸縮系統生成的欄位

2、構建、發行或映象相關的資訊:例如:時間戳、髮型ID、git分支、PR號碼、映象雜湊及倉庫地址等

3、指向日誌、監控、分析或審計倉庫的指標

4、由客戶端庫或工具程式生成的用於除錯目的資訊:如名稱、版本、構建資訊等

5、使用者或工具程式的來源地資訊:例如來自其他生態系統元件的相關物件的url

6、輕量化滾動升級工具的元資料:如config及chechpoints

7、相關人員的電話號碼等聯絡資訊:或者執行類似資訊的可定址的目錄條目、如網站站點

3、檢視註解

[root@master chapter4]# kubectl describe pods pod-example 
Name: pod-example
Namespace: default
Priority: 0
Node: node2/192.168.118.20
Start Time: Wed, 05 Aug 2020 17:40:40 +0800
Labels: env=production
Annotations: Status: Running
......

4、管理資源註解

1、Annotations可在資源建立是使用 metadata.annotations 欄位制定
2、也可隨時按需在活動的資源上使用kubectl annotate命令進行附加

[root@master chapter4]# kubectl annotate pods pod-example ilinux.io/created-by="cluster admin"
pod/pod-example annotated

檢視生成的註解資訊

[root@master chapter4]# kubectl describe pods pod-example |grep "Annotations"
Annotations: ilinux.io/created-by: cluster admin

3、如果需要在資源建立時的清單中制定,那麼使用類似如下的方式即可

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  namespace: default
  annotations:  ilinux.io/created-by: cluster admin
spec:
......