容器編排系統之K8s資源標籤、標籤選擇器、資源註解

1874發表於2020-12-15

  前文我們聊到了使用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上使用標籤,標籤選擇器以及資源註解相關話題的說明;

相關文章