首頁 > 軟體

Kubernetes特別屬性的標籤Label的強大作用

2022-03-18 19:00:37

前言

Label:對k8s中各種資源進行分類、分組,新增一個具有特別屬性的標籤

Selector:通過一個過濾的語法進行查詢到對應標籤的資源

Label是k8s中一個比較重要的概念。一個Label的一個key=value的鍵值對,可以附加到各種資源上。

現總結後講解

Label的匹配規則:

  • name=nginx:這類是直接匹配
  • name!=nginx:匹配標籤中沒有name=nginx的資源
  • name in (A,B):匹配所有具有name=A和name=B標籤的資源
  • name not in (A):匹配所有不具有標籤A的資源

通過上圖可以看到:frontend通過service服務匹配到backend伺服器,當service的標籤是app=nginx時那麼會匹配到backend的兩組伺服器,但是當service中篩選加上Role=backend-app時,Selector只會篩選到backend伺服器組中包含這兩種標籤的伺服器然後進行匹配。

通過下面這條命令可以看到Pod的標籤:通過–show-labels引數
最後一列LABELS是Pod的標籤

[root@k8s-master01 ~]# kubectl get pod --show-labels 
NAME                        READY   STATUS    RESTARTS       AGE   LABELS
busybox                     1/1     Running   28 (16h ago)   9d    <none>
hpa-nginx-bd88bdd8f-h8vx7   1/1     Running   0              18h   app=hpa-nginx,pod-template-hash=bd88bdd8f

那麼我們就可以嘗試著用kubectl給Pod新增標籤:從上列程式碼中我們是可以看到busybox是沒有標籤,通過下面這條命令在檢視發現已經有標籤app=busybox了。

[root@k8s-master01 ~]# kubectl label pod busybox app=busybox
pod/busybox labeled
[root@k8s-master01 ~]# kubectl get pod --show-labels 
NAME                        READY   STATUS    RESTARTS       AGE   LABELS
busybox                     1/1     Running   28 (16h ago)   9d    app=busybox
hpa-nginx-bd88bdd8f-h8vx7   1/1     Running   0              18h   app=hpa-nginx,pod-template-hash=bd88bdd8f

如果一個叢集中Pod非常多的時候,我們就可以通過用標籤篩選的方式找到想要的Pod;-A引數是檢視所有的Pod,但是加上-l app=busybox後只會找到符合這個條件的Pod。

[root@k8s-master01 ~]# kubectl get pod -A -l app=busybox
NAMESPACE   NAME      READY   STATUS    RESTARTS       AGE
default     busybox   1/1     Running   28 (16h ago)   9d

那麼問題來了,要是我們不想要這個標籤了或者說需要修改這個標籤了怎麼辦?

刪除標籤:

[root@k8s-master01 ~]# kubectl label pod busybox app-
pod/busybox unlabeled
[root@k8s-master01 ~]# kubectl get pod --show-labels 
NAME                        READY   STATUS    RESTARTS       AGE   LABELS
busybox                     1/1     Running   28 (16h ago)   9d    <none>
hpa-nginx-bd88bdd8f-h8vx7   1/1     Running   0              18h   app=hpa-nginx,pod-template-hash=bd88bdd8f

修改標籤:可以看出標籤已經是修改後的了。

[root@k8s-master01 ~]# kubectl get pod --show-labels 
NAME                        READY   STATUS    RESTARTS       AGE   LABELS
busybox                     1/1     Running   28 (16h ago)   9d    app=busybox
hpa-nginx-bd88bdd8f-h8vx7   1/1     Running   0              18h   app=hpa-nginx,pod-template-hash=bd88bdd8f
[root@k8s-master01 ~]# kubectl label pod busybox app=busybox22222 --overwrite 
pod/busybox labeled
[root@k8s-master01 ~]# kubectl get pod --show-labels 
NAME                        READY   STATUS    RESTARTS       AGE   LABELS
busybox                     1/1     Running   28 (16h ago)   9d    app=busybox22222
hpa-nginx-bd88bdd8f-h8vx7   1/1     Running   0              18h   app=hpa-nginx,pod-template-hash=bd88bdd8f

Labels是很簡單的一個東西,接下來我們看看Selector是怎麼用的

我想過濾出多個條件的pod又該怎麼做呢?

[root@k8s-master01 ~]# kubectl get pod -A --show-labels 
NAMESPACE              NAME                                         READY   STATUS    RESTARTS         AGE   LABELS
default                busybox                                      1/1     Running   29 (3m19s ago)   9d    app=busybox22222
default                hpa-nginx-bd88bdd8f-h8vx7                    1/1     Running   0                18h   app=hpa-nginx,pod-template-hash=bd88bdd8f
kube-system            calico-kube-controllers-5dffd5886b-4blh6     1/1     Running   2 (2d1h ago)     9d    k8s-app=calico-kube-controllers,pod-template-hash=5dffd5886b
kube-system            calico-node-fvbdq                            1/1     Running   2 (2d1h ago)     9d    controller-revision-hash=79878cdc56,k8s-app=calico-node,pod-template-generation=1
kube-system            calico-node-g8nqd                            1/1     Running   0                9d    controller-revision-hash=79878cdc56,k8s-app=calico-node,pod-template-generation=1
kube-system            calico-node-mdps8                            1/1     Running   0                9d    controller-revision-hash=79878cdc56,k8s-app=calico-node,pod-template-generation=1
kube-system            calico-node-nf4nt                            1/1     Running   1 (4d1h ago)     9d    controller-revision-hash=79878cdc56,k8s-app=calico-node,pod-template-generation=1
kube-system            calico-node-sq2ml                            1/1     Running   1 (2d1h ago)     9d    controller-revision-hash=79878cdc56,k8s-app=calico-node,pod-template-generation=1
kube-system            calico-typha-8445487f56-mg6p8                1/1     Running   0                9d    k8s-app=calico-typha,pod-template-hash=8445487f56
kube-system            calico-typha-8445487f56-pxbpj                1/1     Running   1 (2d1h ago)     9d    k8s-app=calico-typha,pod-template-hash=8445487f56
kube-system            calico-typha-8445487f56-tnssl                1/1     Running   0                9d    k8s-app=calico-typha,pod-template-hash=8445487f56
kube-system            coredns-5db5696c7-67h79                      1/1     Running   1 (2d1h ago)     9d    k8s-app=kube-dns,pod-template-hash=5db5696c7
kube-system            metrics-server-6bf7dcd649-5fhrw              1/1     Running   2 (4d1h ago)     9d    k8s-app=metrics-server,pod-template-hash=6bf7dcd649
kubernetes-dashboard   dashboard-metrics-scraper-7fcdff5f4c-9kk86   1/1     Running   1 (2d1h ago)     9d    k8s-app=dashboard-metrics-scraper,pod-template-hash=7fcdff5f4c
kubernetes-dashboard   kubernetes-dashboard-85f59f8ff7-js9j2        1/1     Running   12 (2d1h ago)    9d    k8s-app=kubernetes-dashboard,pod-template-hash=85f59f8ff7

以上就是我們的所有Pod了,我想要找到標籤中包含kubernetes-dashboard和kube-dns的容器:

[root@k8s-master01 ~]# kubectl get pod -A -l 'k8s-app in (kubernetes-dashboard,kube-dns)'
NAMESPACE              NAME                                    READY   STATUS    RESTARTS        AGE
kube-system            coredns-5db5696c7-67h79                 1/1     Running   1 (2d1h ago)    9d
kubernetes-dashboard   kubernetes-dashboard-85f59f8ff7-js9j2   1/1     Running   12 (2d1h ago)   9d

找到了這兩個Pod,說明這兩個Pod中包含這兩個標籤,可以在上面的所有容器列表裡看看這兩個Pod是否含有這兩個標籤。

還有一種情況是比如我有一批Pod的標籤是這樣:

我想檢視其中不包含ABB=X的所有Pod,可以這樣寫:

kubectl get po -l ABB!=X,APC=A

這樣的話只會找到Pod02和Pod03。

總結:這個功能不難但是比較重要,也比較常用,一定要知道。

以上就是Kubernetes特別屬性的標籤Label的強大作用的詳細內容,更多關於Kubernetes屬性Label標籤作用的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com