1 標簽
1.1 為什么要有標簽?
在微服務架構中,部署的微服務數量很容器達到幾十個,這些組件可能是副本(部署同一組件的多個副本)和多個不同的發布版本(stable、beta、canary等)同時運行。導致K8S系統中會出現多個pod,如果沒有機制去組織這些組件,極容易產生混亂。需要一種能夠基於任意標准將上述pod組織成更小群體的方式,這個時候就產生了標簽,標簽可以組織pod和其他K8S對象。
1.2 標簽介紹
標簽是一種簡單卻功能強大的K8S特性,可以附加到K8S資源的任意鍵值對,可以通過標簽選擇器篩選出需要尋找的確切標簽的資源。在資源內標簽的key需唯一,一個資源可擁有多個標簽。
K8S中的任意API對象都是通過Label進行標識、實質是一系列key/value鍵值對,其中key與value由用戶自己指定。
金絲雀發布:在部署新版本時,先只讓一小部分用戶體驗新版本以觀察新版本的表現,然后再向所有用戶進行推廣,這樣可防止暴露有問題的版本給過多的用戶。
1.3 標簽命令
列出pods的標簽
$ kubectl get po --show-labels
查看具體標簽
$ kubectl get po -L label_key1, label_key2
添加標簽
$ kubectl label po po_name label_key=label_value
其中,po_name表示pod名,label_key表示標簽的名稱,label_value表示標簽的值。
修改標簽
$ kubectl label po po_name label_key=label_new_value --overwrite
其中,po_name表示pod名,label_key表示標簽的名稱,label_new_value表示標簽的新值。
2 標簽選擇器
2.1 標簽選擇器介紹
標簽選擇器允許選擇標記有特定標簽的pod子集,並且對這些pod進行操作,它是一種能夠根據是否包含某個特定值的特定標簽過濾資源。
2.2 標簽選擇器過濾條件
1)包含或不包含使用特定鍵的標簽;
2)包含具有特定鍵和值的標簽;
3)包含具有特定鍵的標簽,但其值與指定的不同;
2.3 標簽選擇器的使用
使用標簽選擇器查看某鍵值的標簽的pod
$ kubectl get po -l label_key=label_value
列出所有包含某標簽的pod
$ kubectl get po -l label_key
列出所有沒有某標簽的pod
$ kubectl get po -l '!label_key'
2.4 標簽選擇器約束pod調度
大部分創建的pod都是隨機調度到工作節點上,在某些特殊情況下,如果需要將pod調度到指定類型的節點上,如硬件基礎設施不是同質,某些工作節點需要使用機械硬盤,某些節點使用固態硬盤,此時需要通過節點標簽和節點標簽選擇器完成。
如需要將pod調度到GPU計算的節點上。
給節點添加標簽
$ kubectl label node node_name gpu=true
將pod調度到特定節點
spec.nodeSelector.gpu=true,屆時創建pod后,K8S會通過標簽和標簽選擇器從只包含gpu=true的節點上選擇並調度。
3 注解
3.1 注解簡介
注解是鍵值對,類似於標簽,主要作用是保存標識信息,不可以用於對對象分組。與標簽相比而言,注解包含數據更多一些,總共不超過256KB。
3.2 注解命令
添加注解
$ kubectl annotate pod pod_name annotate_key="annotate_value"
其中,pod_name為pod名稱,annotate_key為注解鍵,annotate_value為注解值;
查看注解
$ kubectl describe pod pod_name
查看Annotations字段值