前文我們聊到了使用k8s資源配置清單定義資源的相關話題,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/14132890.html;今天我們來聊下資源標簽,標簽選擇器以及資源注解相關話題;
1、標簽和標簽選擇器
對于pod來講,我們知道使用pod控制器創建的pod在pod故障以后,重建后的pod它的ip地址和名稱是變化的,為了解決pod訪問問題,我們特此創建了service,我們訪問service的ip地址就可以正常訪問到pod;那么問題來了,service是怎樣去關聯pod的呢?我們知道在k8s上如果pod使用pod控制創建的pod,在pod發生故障以后,對應pod會被對應的控制器重啟或重建,一個pod重建以后,對應的ip地址和名稱都是會發生變化的,所以靠ip地址和名稱關聯pod是不行的;那靠什么關聯pod呢?在k8s上是使用的標簽和標簽選擇器的機制實作資源和資源見相互關聯的;
什么是標簽?它的作用是干嘛用的?
所謂標簽就是指一個鍵值資料,在k8s上任何資源都可以擁有標簽;我們可以在創建資源時在配置清單中指定,也可以創建好資源以后再使用命令添加標簽;有了標簽以后,我們后續就可以根據標簽來管理對應的資源;一個資源可以擁有多個標簽,同時一個標簽也可以附加給多個資源;我們可以理解為標簽就是用來邏輯的對資源進行分組,擁有相同標簽的資源為一組;標簽的作用是方便用戶管理資源;比如在k8s上運行了幾百個pod,我們想要管理功能相同的pod,就可以把具有相似功能的pod附加同一個標簽,然后要管理這些pod的時,直接指定擁有指定標簽的pod即可;標簽中的健名稱通常由鍵前綴和鍵名組成,鍵前綴和鍵名用“/”分割,鍵前綴可以省略,鍵名最多只能使用63個字符,可使用字母,數字,連接號(-),下劃線,點號等字符,并且只能以數字或字母開頭和結尾;鍵前綴必須為dns子域名格式且不能超過253個字符,省略前綴時,健將視為用戶的私有資料;有前綴可以視為k8s第三方組件可以應用的資源;不過kubernetes.io這個前綴是預留給k8s核心組件使用,所以我們在定義鍵前綴時,不能使用“kubernetes.io”;
標簽選擇器
所謂標簽選擇器是指一組運算式,主要用來表達標簽查詢條件或選擇標準;在k8s上支持兩種型別的標簽選擇器,一種是基于等值關系的選擇器,一種是基于集合關系的選擇器;基于等值關系的選擇器,通常可以用=、==或!=這些運算子來表示關系;前兩個表示同一個意思相等,后面的!=表示不等;基于集合關系的選擇器可以用in,notin和exists這三個運算子;in表示指定鍵名的值在給定的串列中就表示滿足條件;notin和in相反;exists表示是否存在對應的鍵名,比如key表示所有存在此鍵名標簽的資源;!key表示所有不存在此鍵名標簽的資源;此外在使用標簽選擇器時遵循以下邏輯,第一如果同時指定多個選擇器時,選擇器之間是邏輯與的關系,表示指定的選擇器都要同時滿足;第二使用空值的標簽選擇器意味著每個資源都被選中;第三空的標簽選擇器將無法選出任何資源;空值和空的選擇器是兩會事,一個是有鍵名但其值為空,另一個是連鍵名都沒有;
示例:在資源清單中定義標簽
[root@master01 ~]# cat pod-demo5.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-demo5
namespace: testing
labels:
app: nginx
env: testing
spec:
containers:
- image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
hostPort: 8080
name: web
protocol: TCP
[root@master01 ~]#
提示:在資源清單中使用labels欄位來定義標簽,該欄位的值是一個字符型字典;鍵名和值是用戶自定義的;
應用資源配置清單
[root@master01 ~]# kubectl apply -f pod-demo5.yaml pod/nginx-pod-demo5 created [root@master01 ~]# kubectl get pod -n testing NAME READY STATUS RESTARTS AGE nginx-pod-demo 1/1 Running 1 6d23h nginx-pod-demo5 1/1 Running 0 12s [root@master01 ~]#
查看pod是類出顯示標簽
[root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h <none> nginx-pod-demo5 1/1 Running 0 78s app=nginx,env=testing [root@master01 ~]#
提示:查看pod時可以使用--show-labels選項來顯示對應pod的標簽;標簽較多時,也可以使用-L來指定顯示那些標簽;
顯示指定標簽
[root@master01 ~]# kubectl get pod -n testing -L app NAME READY STATUS RESTARTS AGE APP nginx-pod-demo 1/1 Running 1 6d23h nginx-pod-demo5 1/1 Running 0 3m2s nginx [root@master01 ~]# kubectl get pod -n testing -L app,env NAME READY STATUS RESTARTS AGE APP ENV nginx-pod-demo 1/1 Running 1 6d23h nginx-pod-demo5 1/1 Running 0 3m10s nginx testing [root@master01 ~]#
使用命令管理標簽
修改標簽
[root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h <none> nginx-pod-demo5 1/1 Running 0 8m42s app=nginx,env=testing [root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo5 app=ngx error: 'app' already has a value (nginx), and --overwrite is false [root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo5 app=ngx --overwrite pod/nginx-pod-demo5 labeled [root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h <none> nginx-pod-demo5 1/1 Running 0 9m1s app=ngx,env=testing [root@master01 ~]#
提示:使用kubectl label命令修改標簽時必須添加--overwrite選項來指定強制覆寫原有標簽的值;
添加新標簽
[root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h <none> nginx-pod-demo5 1/1 Running 0 11m app=ngx,env=testing [root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo app=ngx env=testing pod/nginx-pod-demo labeled [root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h app=ngx,env=testing nginx-pod-demo5 1/1 Running 0 12m app=ngx,env=testing [root@master01 ~]#
洗掉標簽
[root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h app=ngx,env=testing nginx-pod-demo5 1/1 Running 0 12m app=ngx,env=testing [root@master01 ~]# kubectl label -n testing pod/nginx-pod-demo app- pod/nginx-pod-demo labeled [root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h env=testing nginx-pod-demo5 1/1 Running 0 14m app=ngx,env=testing [root@master01 ~]#
提示:洗掉標簽只需要在要洗掉的標簽鍵名后面加上“-”號即可;
示例:使用標簽選擇器過濾出標簽為app=ngx-dep的資源
[root@master01 ~]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS myapp-dep-5bc4d8cc74-cvkbc 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74 myapp-dep-5bc4d8cc74-gmt7w 1/1 Running 2 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74 myapp-dep-5bc4d8cc74-gqhh5 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74 ngx-dep-5c8d96d457-w6nss 1/1 Running 1 7d3h app=ngx-dep,pod-template-hash=5c8d96d457 [root@master01 ~]# kubectl get pod -l "app=ngx-dep" -L app NAME READY STATUS RESTARTS AGE APP ngx-dep-5c8d96d457-w6nss 1/1 Running 1 7d3h ngx-dep [root@master01 ~]#
提示:使用標簽選擇器來過濾資源,需要用-l選項來指定標簽選擇器;
查看app!=ngx-dep的pod
[root@master01 ~]# kubectl get pod --show-labels NAME READY STATUS RESTARTS AGE LABELS myapp-dep-5bc4d8cc74-cvkbc 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74 myapp-dep-5bc4d8cc74-gmt7w 1/1 Running 2 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74 myapp-dep-5bc4d8cc74-gqhh5 1/1 Running 1 7d2h app=myapp-dep,pod-template-hash=5bc4d8cc74 ngx-dep-5c8d96d457-w6nss 1/1 Running 1 7d3h app=ngx-dep,pod-template-hash=5c8d96d457 [root@master01 ~]# kubectl get pod -l "app!=ngx-dep" -L app NAME READY STATUS RESTARTS AGE APP myapp-dep-5bc4d8cc74-cvkbc 1/1 Running 1 7d2h myapp-dep myapp-dep-5bc4d8cc74-gmt7w 1/1 Running 2 7d2h myapp-dep myapp-dep-5bc4d8cc74-gqhh5 1/1 Running 1 7d2h myapp-dep [root@master01 ~]#
指定多個標簽選擇器過濾資源
[root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 6d23h env=testing nginx-pod-demo3 1/1 Running 0 3m24s app=nginx,env=test,rel=stable nginx-pod-demo4 1/1 Running 0 3m48s app=nginx,env=testing,rel=stable nginx-pod-demo5 1/1 Running 0 31m app=ngx,env=testing [root@master01 ~]# kubectl get pod -n testing -l "app=nginx,env=testing" NAME READY STATUS RESTARTS AGE nginx-pod-demo4 1/1 Running 0 4m21s [root@master01 ~]# kubectl get pod -n testing -l "app=nginx,env!=testing" NAME READY STATUS RESTARTS AGE nginx-pod-demo3 1/1 Running 0 4m30s [root@master01 ~]#
使用基于集合關系的標簽選擇器
[root@master01 ~]# kubectl get pod -n testing --show-labels NAME READY STATUS RESTARTS AGE LABELS nginx-pod-demo 1/1 Running 1 7d env=testing nginx-pod-demo3 1/1 Running 0 5m33s app=nginx,env=test,rel=stable nginx-pod-demo4 1/1 Running 0 5m57s app=nginx,env=testing,rel=stable nginx-pod-demo5 1/1 Running 0 33m app=ngx,env=testing [root@master01 ~]# kubectl get pod -n testing -l "app in (ngx,nginx)" NAME READY STATUS RESTARTS AGE nginx-pod-demo3 1/1 Running 0 6m20s nginx-pod-demo4 1/1 Running 0 6m44s nginx-pod-demo5 1/1 Running 0 34m [root@master01 ~]# kubectl get pod -n testing -l "app notin (ngx,nginx)" NAME READY STATUS RESTARTS AGE nginx-pod-demo 1/1 Running 1 7d [root@master01 ~]# kubectl get pod -n testing -l "app" NAME READY STATUS RESTARTS AGE nginx-pod-demo3 1/1 Running 0 6m56s nginx-pod-demo4 1/1 Running 0 7m20s nginx-pod-demo5 1/1 Running 0 34m [root@master01 ~]# kubectl get pod -n testing -l '!app' NAME READY STATUS RESTARTS AGE nginx-pod-demo 1/1 Running 1 7d [root@master01 ~]#
提示:!在shell環境中有特殊的意義,所以在指定!key時需要用單引號強應用;
2、資源注解
在k8s上除了可以使用標簽來給資源附加自定義元資料外,也可以使用注解給資源附加自定義元資料;標簽和注解兩者不同的是,標簽可以用于標簽選擇器,而注解不能,它只是為方便用戶在給對應資源添加自定義元資料提供一個介面,其次在標簽中,標簽的的鍵名和值都不能超過63個字符,而在資源注解中不受字符大小的限定,它可大可小,值可以為結構化資料或非結構化資料;對于在標簽中禁止使用的字符,在資源注解中都不受限制;
查看注解

提示:查看注解可以使用describe子命令來查看,對應Annotations欄位就是用來標注對應資源的注解資訊;也可以使用kubectl get 使用-o選項輸出為yaml格式的資訊;找到對應的Annotations欄位資訊即可;
使用命令添加注解
[root@master01 ~]# kubectl annotate pod/ngx-dep-5c8d96d457-w6nss description="this is nginx pod " pod/ngx-dep-5c8d96d457-w6nss annotated [root@master01 ~]# kubectl describe pod ngx-dep-5c8d96d457-w6nss|grep "Annotations" Annotations: description: this is nginx pod [root@master01 ~]#
使用資源配置清單添加注解
[root@master01 ~]# cat pod-demo5.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod-demo5
namespace: testing
labels:
app: nginx
env: testing
annotations:
descriptions: "this is test pod "
spec:
containers:
- image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
hostPort: 8080
name: web
protocol: TCP
[root@master01 ~]#
提示:使用資源配置清單定義注解資訊需要用到annotations欄位,該欄位的值為一個字符型字典;
應用配置清單
[root@master01 ~]# kubectl apply -f pod-demo5.yaml pod/nginx-pod-demo5 configured [root@master01 ~]#
查看對應資源的注解
[root@master01 ~]# kubectl get pods -n testing NAME READY STATUS RESTARTS AGE nginx-pod-demo 1/1 Running 1 7d nginx-pod-demo3 1/1 Running 0 45m nginx-pod-demo4 1/1 Running 0 45m nginx-pod-demo5 1/1 Running 0 73m [root@master01 ~]# kubectl describe -n testing pod/nginx-pod-demo5|grep "Annotations" Annotations: descriptions: this is test pod [root@master01 ~]#
以上就是在k8s上使用標簽,標簽選擇器以及資源注解相關話題的說明;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/235167.html
標籤:Linux
上一篇:[Linux] ls命令的幾個常用引數實作按時間/檔案大小排序
下一篇:不同型別資料運算的總結
