- 一、標籤
- 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標籤
- 4.1、建立標籤
- 二、標籤選擇器
- 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
4.2.2、透過標籤過濾查詢
kubectl get pods -A -l environment=production
#列出所有帶有標籤 environment=production 的 Pod
4.2.3、將標籤顯示在輸出結果中
kubectl get pods -A -L app,environment
4.3、新增標籤
4.3.1、分別給兩個Pod新增上標籤
kubectl label pod nginx-test -n dev3 ns=dev3
kubectl label pod nginx-labels -n dev4 ns=dev4
4.4、更新標籤
4.4.1、將nginx-test的app標籤鍵值修改為nginx-test
kubectl label pod nginx-test -n dev3 app=nginx-test --overwrite
--overwirte在針對不存在的標籤作用是新增
在針對存在的標籤作用是更新修改
4.5、刪除標籤
4.5.1、刪除兩個Pod的environment標籤
kubectl label pod nginx-test -n dev3 environment-
kubectl label pod nginx-labels -n dev4 environment-
其實無論是對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
3.2、非等值過濾
kubectl get pods -A -l app!=flannel
#過濾出不帶標籤app=flannel的Pod
3.3、多條件過濾
kubectl get pods -A -l "ns in (dev3,dev4)" --show-labels
#過濾出包含ns=dev3或ns=dev4的Pod
3.4、多條件取反過濾
kubectl get pods -A -l "app notin (flannel,nginx-test,nginx-labels)" --show-labels
#過濾出標籤中不包含app=(flannel,nginx-test,nginx-labels)的Pod
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'
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