k8s 實戰 3----標籤

王若伊_恩赐解脱發表於2024-07-10

如果你對k8s還不瞭解,可以看下前文
k8s 實戰 1 ---- 初識 (https://www.cnblogs.com/jilodream/p/18245222)
k8s 實戰 2 ---- pod 基礎 (https://www.cnblogs.com/jilodream/p/18284282)

什麼是標籤?
標籤也就是Label,是作用在k8s的資源上的,用來記錄的資源的狀態,或後設資料的一組資料。
label本質上就是一組鍵值對。
我們可以將其作用在pod,deployment、node等等資源上。
這一點和java語言中的註解非常像。我們可以透過註解來標記類或者方法或者屬性,這些註解並不會直接改變類或者方法什麼特性。而是由其它的方法
分析這些註解,從而做出符合需要的判斷。
舉個例子,假若我們的pod,由於某種需要,分別需要標記出是由誰在維護當前pod,我們就可以透過標籤來記錄這些資訊。
話不多說,來看程式碼:
1、首先我們按照如下yaml模板,建立一個pod。
注意看metadata 標籤下,新加了labels ,表示要新增的標籤及其值。
我們這裡增加使用者(user)和模組 (module)兩個標籤,yaml檔案如下:

 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: busyb-p
 5   labels: 
 6     user: happy
 7     module: order
 8 spec:
 9   containers: 
10     - image: docker.io/library/kuard-amd64:blue
11       name: bb-c
12       ports: 
13         - containerPort: 8080
14           name: http
15           protocol: TCP

建立好之後,我們可以追加引數的形式,檢視pod中包含的標籤
kubectl get xx --show-labels xx表示資源型別

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
2 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
3 busyb-p                           1/1     Running   0          11s    module=order,user=happy

注意看,LABELS列即為我們新增的標籤:module 和user
我們還可以在pod執行期時,手動的增刪標籤:
kubectl label xx xxx "標籤key=標籤value" xx表示資源型別 xxx表示資源名稱
如先動態新增version標籤,再修改version標籤。注意修改時,需要追加引數( --overwrite),否則會修改不成功

 1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k label pod busyb-p "version=dev"
 2 pod/busyb-p labeled
 3 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
 4 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
 5 busyb-p                           1/1     Running   0          35m    module=order,user=happy,version=dev
 6 
 7 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k label pod busyb-p "version=test" --overwrite
 8 pod/busyb-p labeled
 9 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
10 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
11 busyb-p                           1/1     Running   0          47m    module=order,user=happy,version=test

如果要刪除某個標籤,kubectl label xx xxx "標籤key-",xx表示資源型別,xxx表示對應的資源名稱 ,標籤key 表示我們要刪除的標籤的key, 如下,我們要刪除level標籤:

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k label pod busyb-p "level-"
2 pod/busyb-p unlabeled
3 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods --show-labels
4 NAME                              READY   STATUS    RESTARTS   AGE    LABELS
5 busyb-p                           1/1     Running   0          71m    module=order,user=happy,version=product

在shell介面,如果標籤太多,我們除了可以用管道追加grep的傳統過濾辦法,也可以使用k8s的過濾引數
kubectl get pods --selector="標籤key=標籤value"
也可以用-l 代替--selector

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# kubectl get pods --selector="user=happy,module=order"
2 NAME      READY   STATUS    RESTARTS   AGE
3 busyb-p   1/1     Running   0          74m
4 
5 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# kubectl get pods -l "user=happy,module=order"
6 NAME      READY   STATUS    RESTARTS   AGE
7 busyb-p   1/1     Running   0          76m

如果要顯示某個指定的標籤:
-L "標籤key"

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# kubectl get pods  -L "version" 
2 NAME                              READY   STATUS    RESTARTS   AGE    VERSION
3 busyb-p                           1/1     Running   0          78m    product

以上就是標籤的基本操作,那麼他除了使用者的普通標記還有什麼用呢?
其實標籤的作用非常之大,k8s整體是一個解耦的系統,(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )元件之間是獨立執行的。但是元件之間又互相需要通訊或者是標記來感知狀態。
此時就需要標籤作為媒介,進行資訊的傳輸,比如:
1、我們在啟動pod時,要限制pod在哪些節點上執行,此時就需要在節點上打好標籤。接著在pod的yaml模板中,限制好要啟動節點的標籤。(節點就是k8s叢集中各個機器,也就是node)
2、deployment要固定pod的副本數,此時就需要透過標籤進行過濾,如果篩選出的標籤多了,就刪除,如果少了就建立。(deployment 是一種更高階的資源,也稱之為“部署”,可以簡單的理解為批次對一批pod進行管理和部署,後文會專門介紹)

標籤就相當於是一個粘合劑,把不同的資源元件透過標籤進行關聯。使k8s的資源和各個元件可以完整的整合到一起,形成一套完整的系統。

相關文章