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: ......