学习笔记:k8s的标签和标签选择器
標簽可以附加在kubernetes任何資源對象之上的鍵值型數據,常用于標簽選擇器的匹配度檢查,從而完成資源篩選。
一、標簽
- 當Kubernetes對系統的任何API對象如Pod和節點進行“分組”時,會對其添加Label(key=value形式的“鍵-值對”)用以精準地選擇對應的API對象。
- 標簽中的鍵名稱通常由“鍵前綴”和“鍵名”組成,其格式形如“KEY_PREFIX/KEY_NAME”
- 而鍵前綴必須為DNS子域名格式,且不能超過253個字符。例如Node對象上常用的kubernetes.io/os、kubernetes.io/arch和kubernetes.io/hostname等。鍵前綴為可選部分,省略鍵前綴時,鍵將被視為用戶的私有數據。
- 鍵名至多能使用63個字符,支持字母、數字、連接號(-)、下劃線(_)、點號(.)等字符,且只能以字母或數字開頭。
- 標簽的鍵值必須不能多于63個字符,它要么為空,要么是以字母或數字開頭及結尾,且中間僅使用了字母、數字、連接號(-)、下劃線(_)或點號(.)等字符的數據。
1、添加單個標簽
為node2節點添加標簽hello=world
[root@ln03 ~]# kubectl label node ln03 hello=world node/ln03 labeled在Deployment或其他控制器中指定將Pod部署到該節點,配置nodeSelector標簽選擇器中增加region: subnet1,如下:
containers:...... dnsPolicy: ClusterFirst nodeSelector:hello: world restartPolicy: Always ......2、添加多個標簽
例如為ln02節點添加hello=world和tang=test兩個標簽:
[root@ln03 ~]# kubectl label node ln02 hello=world tang=test node/ln02 labeled3、查看標簽
# 查看所有節點的所有標簽 [root@ln03 ~]# kubectl get node --show-labels# 查看具有制定標簽的節點 [root@ln03 ~]# kubectl get node -l tang=test NAME STATUS ROLES AGE VERSION ln02 Ready <none> 5d5h v2.0.2-tos-final-build-20200728# 查看配置了有tang標簽的節點 [root@ln03 ~]# kubectl get node -l tang NAME STATUS ROLES AGE VERSION ln02 Ready <none> 5d5h v2.0.2-tos-final-build-20200728# 查看配置了tang標簽指定值test或world的節點 [root@ln03 ~]# kubectl get node -l 'tang in (test,world)' NAME STATUS ROLES AGE VERSION ln02 Ready <none> 5d5h v2.0.2-tos-final-build-20200728二、標簽選擇器
標簽選擇器用于表達標簽的查詢條件或選擇標準,Kubernetes API目前支持兩個選擇器:基于等值關系(equality-based)的標簽選項器以及基于集合關系(set-based)的標簽選擇器。同時指定多個選擇器時需要以逗號將其分隔,各選擇器之間遵循“與”邏輯,即必須要滿足所有條件,而且空值的選擇器將不選擇任何對象。
- 基于等值關系的標簽選項器:
基于等值關系的標簽選擇器的可用操作符有=、==和!=三種,其中前兩個意義相同,都表示“等值”關系,最后一個表示“不等”。例如env=dev和env!=prod都是基于等值關系的選擇器
- 基于集合關系的標簽選擇器
基于集合關系的標簽選擇器則根據標簽名的一組值進行篩選,它支持in、notin、和exists三種操作符,例如tier in (frontend,backend)表示所有包含tier標簽且值為frontend或backend的資源對象:
KEY in (VALUE1,VALUE2,…) :指定的鍵名的值存在于給定的列表中即滿足條件;
KEY notin (VALUE1,VALUE2,…) :指定的鍵名的值不存在于給定列表中即滿足條件;
KEY:所有存在此鍵名標簽的資源;
!KEY:所有不存在此鍵名標簽的資源
1、選擇標簽
選擇app為reviews或者productpage的svc:
[root@k8s-master01 ~]# kubectl get svc -l 'app in (details, productpage)' --show-labels NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS details ClusterIP 10.99.9.178 <none> 9080/TCP 45h app=details nginx ClusterIP 10.106.194.137 <none> 80/TCP 2d21h app=productpage,version=v1 productpage ClusterIP 10.105.229.52 <none> 9080/TCP 45h app=productpage,tier=frontend選擇label key名為app的svc
[root@k8s-master01 ~]# kubectl get svc -l app --show-labels NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS details ClusterIP 10.99.9.178 <none> 9080/TCP 45h app=details nginx ClusterIP 10.106.194.137 <none> 80/TCP 2d21h app=productpage,version=v1 productpage ClusterIP 10.105.229.52 <none> 9080/TCP 45h app=productpage,tier=frontend ratings ClusterIP 10.96.104.95 <none> 9080/TCP 45h app=ratings reviews ClusterIP 10.102.188.143 <none> 9080/TCP 45h app=reviews選擇app為productpage或details但不包括version=v1的svc
[root@k8s-master01 ~]# kubectl get svc -l version!=v1,'app in (details, productpage)' --show-labels NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS details ClusterIP 10.99.9.178 <none> 9080/TCP 45h app=details productpage ClusterIP 10.105.229.52 <none> 9080/TCP 45h app=productpage,tier=frontend2、修改標簽
在實際使用中,Label的更改是經常發生的事情,可以使用overwrite參數修改標簽。比如將hello=test改為hello=test1
[root@ln03 ~]# kubectl get node -l hello=test NAME STATUS ROLES AGE VERSION ln03 Ready <none> 5d5h v2.0.2-tos-final-build-20200728 [root@ln03 ~]# kubectl label node ln03 hello=test1 --overwrite node/ln03 labeled [root@ln03 ~]# kubectl get node -l hello=test No resources found in default namespace. [root@ln03 ~]# kubectl get node -l hello=test1 NAME STATUS ROLES AGE VERSION ln03 Ready <none> 5d5h v2.0.2-tos-final-build-202007283、刪除標簽
刪除標簽,比如刪除hello
[root@ln03 ~]# kubectl label node ln03 hello- node/ln03 labeled總結
以上是生活随笔為你收集整理的学习笔记:k8s的标签和标签选择器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android手机之-------64位
- 下一篇: 2小组第一次会议