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