標簽和標簽選擇器
標簽
一、介紹
標簽是一種簡單卻功能強大的Kubemetes特性, 不僅可以組織pod, 也可以組織所有其他的Kubemetes資源。 詳細來講, 標簽是可以附加到資源的任意鍵值對,
用以選擇具有該確切標簽的資源(這是通過標答選擇器完成的 )。 只要標簽的key在資源內是唯一的,一個資源便可以擁有多個標簽。 通常在我們創建資源時就會將標
簽附加到資源上, 但之后我們也可以再添加其他標簽, 或者修改現有標簽的值, 而無須重新創建資源。
二、應用場景
對於微服務架構, 部署的微服務數量可以輕松超過20個甚至更多。 這些組件可能是副本(部署同一組件的多個副本)和多個不同的發布版本(stable、beta、canary等)同時運行。 這樣一來可能會導致我們在系統中擁有數百個pod, 如果沒有可以有效組織這些組件的機制, 將會導致產生巨大的混亂。
三、標簽的作用
通過標簽來標識標簽的用途,通過標簽批量對同一標簽的pod 進行操作
四、相關操作
1、創建pod 時創建標簽 vi test.yaml apiVersion: vl kind: Pod metada七a: name: kubia-manual-v2 labels: app-name: pay #兩個標簽被附加到 pod上 env: prd kubectl create -f test.yaml 2、查看pod 帶有的標簽 kubectl get pod --show-labels #標簽單獨一列顯示 kubectl get pod -L app-name,env #列出所有pod ,把app-name,env 兩個標簽key單獨作為兩列顯示 3、修改現有pod的標簽 kubecl label pod pod-name creation method=manual #給已有pod 添加一個標簽 kubecl label pod kubia-manual-v2 env=debug --overwrite #更改已有的標簽
標簽選擇器
標簽選擇器允許我們選擇標記有特定標簽的pod子集, 並對這些 pod執行操作。 可以說標簽選擇器是一種能夠根據是否包含具有特定值的特定標簽來過濾資源的准則。
標簽選擇器根據資源的以下條件來選擇資源:
• 包含(或不包含)使用特定鍵的標簽 • 包含具有特定鍵和值的標簽 • 包含具有特定鍵的標簽, 但其值與我們指定的不同
標簽選擇器的使用
kubectl get pods -l app-name=pay #列出標簽鍵值對為app-name=pay 的pod kubectl get po -1 env #列出標簽key 為env 的pod kubectl get po -1 '!env' #列出標簽key 不是env 的pod,注意只能是單引號 同理, 我們也可以將pod與以下標簽選擇器進行匹配: • creation_rnethod!=rnanual #選擇帶有creation_rnethod標簽, 並且值不等於manual的pod • env in (prod, devel) #選擇帶有env標簽且值為prod或devel的pod • env notin (prod, devel) #選擇帶有env標簽, 但其值不是prod或devel的pod
標簽選擇器不僅幫助我們列出pod, 在對一個子集中的所有pod都執行操作時也具有重要意義。 例如, 在本章的后面我們將看到如何使用標簽選擇器來實現一次刪除多個pod。 此外標簽選擇器不只是被kubectl使用, 它們在內部也被使用過。
使用標簽和選擇器來約束pod調度
由於Kubemetes將集群中的所有節點抽象為一個整體的大型部署平台, 因此對千你的pod 實際調度到哪個節點而言是無關緊要的。某些情況下, 我們希望對將pod調度到何處持一 定發言權, 你的硬件基
礎設施並不是同質便是一個很好的例子。 如果你的某些工作節點使用機械硬盤, 而其他節點使用固態硬盤, 那么你 可能想將一些pod調度到 一組節點。
使用標簽分類工作節點
kubectl label node gke-kubia-node-Orrx gpu=rue
通過節點選擇器為創建的pod 選擇節點
spec: nodeSelector. gpu:true"
注意:
我們不會特別說明pod應該調度到哪個節點上, 因為這將會使應用程序與基礎架構強耦合, 從而違背了Kubemetes對運行在其上的應用程序隱藏實際 的基礎架構的整個構想。 但如果你想對 一個 pod應該調度到哪里擁有發言權, 那就不應該直接指定 一個確切的節點, 而應該用某種方式描述對節點的需求, 使Kubemetes選擇一個符合這些需求的節點。這恰恰可以通過節點標簽和節點標簽選擇器完成。
我們也可以將pod調度到某個確定的節點,由於每個節點都有一個唯 一標簽 , 其中鍵為kuberne七es.io/hostname, 值為該 節點的 實際主機名,因此我們也可以將pod調度到某個確定的節點。但如果節點處於離線狀態,通過hostname 標簽將nodeSelector設置為特定節點可能會導致pod不可調度。我們絕不應該考慮單個節點,而 是應該通過標簽選擇器考慮符合特定標准的邏輯節點組。
注解
除標簽外,pod和其他對象還可以包含庄解。注解也是鍵值對,所以它們本質上與標簽非常相似。但與標簽不同,注解並不是為了保存標識信息而 存在的,它們不能像標簽 一 樣用千對對象進行分組。當我們可以通過標簽選擇器選擇對象時,就不存在注解選擇器這樣的東西。
創建
vi test.yaml ... ... metadata: annotations: kuberne七es.io/created-by: {"kind":"Seria巨zedReference", "apiVersion": "vl", "reference":{"kind":"Rep巨ca巨onController", "namespace": "default",...
添加和修改
kubect1 annotate pod asdf mycompany.com/someannotation="foo bar"
