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

  前文咱們聊到了使用k8s資源配置清單定義資源的相關話題,回顧請參考http://www.javashuo.com/article/p-xxdvpext-ny.html;今天咱們來聊下資源標籤,標籤選擇器以及資源註解相關話題;html

  一、標籤和標籤選擇器nginx

  對於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上是使用的標籤和標籤選擇器的機制實現資源和資源見相互關聯的;web

  什麼是標籤?它的做用是幹嗎用的?shell

  所謂標籤就是指一個鍵值數據,在k8s上任何資源均可以擁有標籤;咱們能夠在建立資源時在配置清單中指定,也能夠建立好資源之後再使用命令添加標籤;有了標籤之後,咱們後續就能夠根據標籤來管理對應的資源;一個資源能夠擁有多個標籤,同時一個標籤也能夠附加給多個資源;咱們能夠理解爲標籤就是用來邏輯的對資源進行分組,擁有相同標籤的資源爲一組;標籤的做用是方便用戶管理資源;好比在k8s上運行了幾百個pod,咱們想要管理功能相同的pod,就能夠把具備類似功能的pod附加同一個標籤,而後要管理這些pod的時,直接指定擁有指定標籤的pod便可;標籤中的健名稱一般由鍵前綴和鍵名組成,鍵前綴和鍵名用「/」分割,鍵前綴能夠省略,鍵名最多隻能使用63個字符,可以使用字母,數字,鏈接號(-),下劃線,點號等字符,而且只能以數字或字母開頭和結尾;鍵前綴必須爲dns子域名格式且不能超過253個字符,省略前綴時,健將視爲用戶的私有數據;有前綴能夠視爲k8s第三方組件能夠應用的資源;不過kubernetes.io這個前綴是預留給k8s核心組件使用,因此咱們在定義鍵前綴時,不能使用「kubernetes.io」;api

  標籤選擇器bash

  所謂標籤選擇器是指一組表達式,主要用來表達標籤查詢條件或選擇標準;在k8s上支持兩種類型的標籤選擇器,一種是基於等值關係的選擇器,一種是基於集合關係的選擇器;基於等值關係的選擇器,一般能夠用=、==或!=這些操做符來表示關係;前兩個表示同一個意思相等,後面的!=表示不等;基於集合關係的選擇器能夠用in,notin和exists這三個操做符;in表示指定鍵名的值在給定的列表中就表示知足條件;notin和in相反;exists表示是否存在對應的鍵名,好比key表示全部存在此鍵名標籤的資源;!key表示全部不存在此鍵名標籤的資源;此外在使用標籤選擇器時遵循如下邏輯,第一若是同時指定多個選擇器時,選擇器之間是邏輯與的關係,表示指定的選擇器都要同時知足;第二使用空值的標籤選擇器意味着每一個資源都被選中;第三空的標籤選擇器將沒法選出任何資源;空值和空的選擇器是兩會事,一個是有鍵名但其值爲空,另外一個是連鍵名都沒有;app

  示例:在資源清單中定義標籤this

[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字段來定義標籤,該字段的值是一個字符型字典;鍵名和值是用戶自定義的;spa

  應用資源配置清單htm

[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時須要用單引號強應用;

  二、資源註解

  在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上使用標籤,標籤選擇器以及資源註解相關話題的說明;

相關文章
相關標籤/搜索