K8S標籤與標籤選擇器

misakivv發表於2024-07-12

目錄
  • 一、標籤
    • 1、簡介
    • 2、為什麼需要標籤
    • 3、標籤命名規範
      • 3.1、標籤名
      • 3.2、標籤的value
    • 4、標籤的基本操作
      • 4.1、建立標籤
        • 4.1.1、資源清單方式
        • 4.1.2、命令列方式
      • 4.2、檢視標籤
        • 4.2.1、檢視剛才打標的兩個pod
        • 4.2.2、透過標籤過濾查詢
        • 4.2.3、將標籤顯示在輸出結果中
      • 4.3、新增標籤
        • 4.3.1、分別給兩個Pod新增上標籤
      • 4.4、更新標籤
        • 4.4.1、將nginx-test的app標籤鍵值修改為nginx-test
      • 4.5、刪除標籤
        • 4.5.1、刪除兩個Pod的environment標籤
  • 二、標籤選擇器
    • 1、簡介
    • 2、表示式
      • 2.1、基於等式的
      • 2.2、基於集合的
    • 3、過濾查詢
      • 3.1、等值過濾
      • 3.2、非等值過濾
      • 3.3、多條件過濾
      • 3.4、多條件取反過濾
    • 4、service資源物件關聯對應標籤的Pod
      • 4.1、建立三個Pod
      • 4.2、建立service物件關聯對應標籤的Pod
        • 4.2.1、建立service資源清單
        • 4.2.2、應用清單
        • 4.2.3、驗證

一、標籤

1、簡介

標籤是附在k8s 資源物件的一組鍵值對,其存在的意義是按照使用者的意圖來組織資源,同時不對資源的核心邏輯產生影響。

標籤的使用我們傾向於能夠表示物件的特殊特點,就是一眼就看出了這個Pod是幹什麼的。

標籤可以用來劃分特定的物件(比如版本,服務型別等),標籤可以在建立一個物件的時候直接定義,也可以在後期隨時修改,每一個物件可以擁有多個標籤,但是,key值必須是唯一的。

建立標籤之後也可以方便我們對資源進行分組管理。如果對pod打標籤,之後就可以使用標籤來檢視、刪除指定的pod。

2、為什麼需要標籤

我們知道使用 pod 控制器建立的 pod,在 pod 故障以後重建後的 pod ip 地址和名稱是變化的,為了解決 pod 訪問問題,我們特此建立了 service,我們訪問 service 的 ip 地址就可以正常訪問到 pod;那麼問題來了,service 是怎樣去關聯 pod 的呢?

在 k8s 上是使用的標籤和標籤選擇器的機制實現資源和資源間相互關聯的。當我們建立一個Service時,會指定一個標籤選擇器,這個選擇器定義了一組鍵值對,用以匹配特定的Pods。Kubernetes的Service Controller會查詢所有帶有與選擇器匹配標籤的Pods,並將這些Pods的IP地址新增到Service的Endpoint中。因此,無論Pod的IP如何變化,只要它的標籤與Service的選擇器相匹配,它就能被Service發現和代理流量。

3、標籤命名規範

3.1、標籤名

  • 標籤名部分是必須的。
  • 不能多餘 63 個字元。
  • 必須由字母、數字開始和結尾。
  • 可以包含字母、數字、減號(-)、下劃線(_)、小數點(.)

3.2、標籤的value

  • 不能多於 63 個字元。
  • 可以為空字串。
  • 如果不為空,則必須由字母、數字開始和結尾。
  • 如果不為空,可以包含字母、數字、減號(-)、下劃線(_)、小數點(.)
apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:		#標籤
    environment: production
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

4、標籤的基本操作

4.1、建立標籤

4.1.1、資源清單方式

1、建立資源清單

cat pod_labels.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
  namespace: dev3
  labels:
    app: nginx
    environment: production
spec:
  containers:
  - name: nginx
    image: nginx
    env:
    - name: HELLO
      value: "hello pod labels test"

2、應用清單

kubectl apply -f pod_labels.yaml

4.1.2、命令列方式

kubectl  run nginx-labels -n dev4 --image=nginx --labels="app=nginx-labels,environment=production"

4.2、檢視標籤

4.2.1、檢視剛才打標的兩個pod

kubectl get pods -n dev3 --show-labels
kubectl get pods -n dev4 --show-labels

image-20240711225806196

4.2.2、透過標籤過濾查詢

kubectl get pods -A -l environment=production
#列出所有帶有標籤 environment=production 的 Pod

image-20240711225930026

4.2.3、將標籤顯示在輸出結果中

kubectl get pods -A -L app,environment

image-20240711230506814

4.3、新增標籤

4.3.1、分別給兩個Pod新增上標籤

kubectl label pod nginx-test -n dev3 ns=dev3
kubectl label pod nginx-labels -n dev4 ns=dev4

image-20240711231340884

4.4、更新標籤

4.4.1、將nginx-test的app標籤鍵值修改為nginx-test

kubectl label pod nginx-test -n dev3 app=nginx-test --overwrite

image-20240711232020672

--overwirte在針對不存在的標籤作用是新增

在針對存在的標籤作用是更新修改

4.5、刪除標籤

4.5.1、刪除兩個Pod的environment標籤

kubectl label pod nginx-test -n dev3 environment-
kubectl label pod nginx-labels -n dev4 environment-

image-20240711232538271

其實無論是對Pods的標籤基本操作還是對 Nodes、PersistentVolumes (PVs)、PersistentVolumeClaims (PVCs)、Services、Deployments、ReplicaSets、StatefulSets 這些資源物件來說,標籤的基本操作都適用,使用時只需指定對應的資源型別即可

二、標籤選擇器

1、簡介

Lablel附加到Kubernetes叢集中的各種資源物件上,目的就是對這些資源物件進行分組管理,而分組管理的核心就是:Lablel Selector

我們可以透過Label Selector(標籤選擇器)查詢和篩選某些特定Label的資源物件,進而可以對他們進行相應的操作管理,類似於sql語句中where的條件:

select * from where ...

2、表示式

2.1、基於等式的

name = nginx 匹配所有具有標籤 name = nginx 的資源物件
name != nginx 匹配所有不具有標籤 name = nginx 的資源物件

2.2、基於集合的

env in (dev, test) 匹配所有具有標籤 env = dev 或者 env = test 的資源物件
name not in (frontend) 匹配所有不具有標籤 name = frontend 的資源物件

3、過濾查詢

3.1、等值過濾

kubectl get pods -A -l ns=dev3
#過濾出帶有ns=dev3標籤的Pod

image-20240712000207725

3.2、非等值過濾

kubectl get pods -A -l app!=flannel
#過濾出不帶標籤app=flannel的Pod

image-20240712000805226

3.3、多條件過濾

kubectl get pods -A -l "ns in (dev3,dev4)" --show-labels
#過濾出包含ns=dev3或ns=dev4的Pod

image-20240712001226147

3.4、多條件取反過濾

kubectl get pods -A -l "app notin (flannel,nginx-test,nginx-labels)" --show-labels
#過濾出標籤中不包含app=(flannel,nginx-test,nginx-labels)的Pod

image-20240712001721235

4、service資源物件關聯對應標籤的Pod

4.1、建立三個Pod

kubectl run nginx-1 --image=nginx:latest --labels='app=nginx'
kubectl run nginx-2 --image=nginx:latest --labels='app=nginx'
kubectl run nginx-3 --image=nginx:latest --labels='app=nginx'

image-20240712213432876

4.2、建立service物件關聯對應標籤的Pod

4.2.1、建立service資源清單

apiVersion: v1
kind: Service
metadata:
  name: service-test
spec:
  selector:
    app: nginx
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80

4.2.2、應用清單

kubectl apply -f service-test.yaml

4.2.3、驗證

kubectl describe service service-test
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,IP:.status.podIP

image-20240712215045936

相關文章