當大家都完成第一步往k8s部署
,第二步就是要來好好管理這些container,k8s提供了一個簡單又好記的東西,方便大家管理container,那就是label
。
沒有透過label管理的pod長的像下圖
圖片來源
透過定義label的方式來管理pod就像下圖
圖片來源
使用label看起來是不是比較潮呢
label主要是對pod提供一個可識別的資料,而label是採用key-value的方式儲存,在一個pod上面定義的label的key值是要唯一的喔,ex
#正確
"metadata": {
"labels": {
"key1" : "value1",
"key2" : "value2"
}
}
#錯誤
"metadata": {
"labels": {
"key" : "value1",
"key" : "value2"
}
}
-
、_
與.
因為label的key值不是唯一值(同個pod底下是唯一值),所以多個pod可能會有相同的label,所以就可以使用selector把相同label的pod撈出來,如果有寫過jquery的話,跟jquery selector 87分像的東西。
Label selector有二種類型
=
、==
(都是同於)、!=
(不等於)in
、notin
和 exists
部署二個redis,一個是for前端用,一個是for後端用
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-redis-backend
labels:
app.kubernetes.io/name: my-redis
env: dev
user: backend
spec:
serviceName: my-redis-backend
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: my-redis
template:
metadata:
labels:
app.kubernetes.io/name: my-redis
env: dev
user: backend
spec:
containers:
- name: my-redis-backend
image: "redis:latest"
imagePullPolicy: IfNotPresent
args: ["--appendonly", "yes", "--save", "600", "1"]
ports:
- name: redis
containerPort: 6379
protocol: TCP
volumeMounts:
- name: data
mountPath: /data
resources: {}
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-redis-frontend
labels:
app.kubernetes.io/name: my-redis
env: dev
user: frontend
spec:
serviceName: my-redis-frontend
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: my-redis
template:
metadata:
labels:
app.kubernetes.io/name: my-redis
env: dev
user: frontend
spec:
containers:
- name: my-redis-frontend
image: "redis:latest"
imagePullPolicy: IfNotPresent
args: ["--appendonly", "yes", "--save", "600", "1"]
ports:
- name: redis
containerPort: 6379
protocol: TCP
volumeMounts:
- name: data
mountPath: /data
resources: {}
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
部署完成後來看一下pod的資料是否跟預期的一樣
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
dashboard-metrics-scraper-778b77d469-v85pw 1/1 Running 11 11d k8s-app=dashboard-metrics-scraper,pod-template-hash=778b77d469
k0s-nginx-585449566-4nhvn 1/1 Running 0 9h app=nginx,pod-template-hash=585449566
kubernetes-dashboard-5cd89984f5-9vtsm 1/1 Running 11 11d k8s-app=kubernetes-dashboard,pod-template-hash=5cd89984f5
my-redis-0 1/1 Running 0 3m23s app.kubernetes.io/name=my-redis,controller-revision-hash=my-redis-55cc9bcb54,env=dev,statefulset.kubernetes.io/pod-name=my-redis-0,user=frontend
my-redis-backend-0 1/1 Running 0 100s app.kubernetes.io/name=my-redis,controller-revision-hash=my-redis-backend-8d4cc9789,env=dev,statefulset.kubernetes.io/pod-name=my-redis-backend-0,user=backend
my-redis-frontend-0 1/1 Running 0 105s app.kubernetes.io/name=my-redis,controller-revision-hash=my-redis-frontend-dfdc9dc7c,env=dev,statefulset.kubernetes.io/pod-name=my-redis-frontend-0,user=frontend
這時候就可以透過Label Selector進行查詢
kubectl get pod -l env=dev
NAME READY STATUS RESTARTS AGE
my-redis-0 1/1 Running 0 4m11s
my-redis-backend-0 1/1 Running 0 2m28s
my-redis-frontend-0 1/1 Running 0 2m33s
除了在yaml裡面宣告label外,也可以透過kubectl語法進行設定
#新增label
kubectl label pods my-redis-backend-0 iamrich=true
pod/my-redis-backend-0 labeled
kubectl get pod -l iamrich=true
NAME READY STATUS RESTARTS AGE
my-redis-backend-0 1/1 Running 0 5m23s
#刪除label
kubectl label pods my-redis-backend-0 iamrich-
pod/my-redis-backend-0 labeled
kubectl get pod -l iamrich=true
No resources found in kubernetes-dashboard namespace.
以上大致上就是label的動手做囉