一、Label介紹
一個Label是一個key=value
的鍵值對,其中key與value由用戶自己指定。Label可以附加到各種資源上,例如Node
Pod
Service
RC
等。 一個資源對象可以定義任意數量的Label,同一個Label也可以被添加到任意數量的資源對象上去,Label通常在資源對象定義時確認,也可以在對象創建後動態添加或者刪除。
可以通過給指定的資源對象捆綁一個
或多個
不同的Label來實現多維度的資源分組管理功能,以便於靈活、方便地進行資源分配、調度、配置、部署等管理工作。
舉例:當你在RC的yaml文件中定義了該RC的selector中的label爲app:my-web
,那麼這個RC就會去關注Pod-->metadata-->labeks
中label爲app:my-web
的Pod。修改了對應Pod的Label,就會使Pod脫離RC的控制。同樣,在RC運行正常的時候,若試圖繼續創建同樣Label的Pod,是創建不出來的。因爲RC認爲副本數已經正常了,再多起的話會被RC刪掉的。
二、Label常見標籤
例如:部署不同版本的應用到不同的環境中;或者監控和分析應用(日誌記錄、監控、告警)
常用的Label實例如下:
- 版本標籤:“release” : “stable” , “release” :“canary”
- 環境標籤:“environment”:“dev”, “environment”:“qa”, “environment”:“production”
- 架構標籤:“tier”:“frontend”, “tier”:“backend”, “tier”:“middleware”
- 分區標籤:“partition”:“customerA”, “partition”:“customerB”
- 質量管控標籤:“track”:“daily”, “track”:“weekly”
三、Label Selector
1、label Selector 介紹
Label 表達式 && Label Selector Label 相當於我們熟悉的標籤,給某個資源對象定義一個Label,就相當於給它打了一個標籤,隨後可以通過Label Selector 標籤選擇器 查詢和篩選有某些Label的資源對象。Kubernetes通過這種方式實現了類似SQL的簡單又通用的對象查詢機制。
2、 Label Selector 兩種表達式
label採用 等式類
1)基於等式的(Equality-based)
name = redis-slave: 匹配所有具有標籤name=redis-slave的資源對象 。
env != production: 匹配所有不具有標籤env=production的資源對象,比如env=test就是滿足此條件的標籤之一。
2)基於集合的(Set-based)
name in (redis-master,redis-slave):匹配所有具有name=redis-master或者name=redis-slave的資源對象 。
name not in (php-fronted):匹配所有不具有標籤name=php-fronted的資源對象。
可以通過多個Label Selector
表達式的組合實現複雜的條件選擇,多個表達式之間用",
“進行分隔即可,幾個條件之間是”AND
"的關係,即同時滿足多個,例如:
name=redis-slave,env!=production
name notin (php-fronted),env!=production
四、label value語法
長度不超過63個字符。 可以爲空 首位字符必須爲字母數字字符 中間必須是橫線、_、.、數字、字母。
五、 Label定義yaml
Label常定義在matadate
中
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
>> app: new_nginx <<============
RC通過Label Selector
機制實現對Pod副本的自動控制。 RC和Service在spec中定義Selector與Pod進行關聯。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
>> app: new_nginx<<=================
Deployment、Replica Set、DaemonSet和Job可以在Selector中使用基於集合的篩選條件定義。
selector:
matchLabels:
app:new_nginx
matchExpressions:
- {key: tier, operator: In, values: [frontend]}
- {key: environment, operator: NotIn, values: [dev]}
mathchLabels
用於定義一組Label,與直接寫在Selector中相同; matchExpressions
用於定義一組基於集合的篩選條件,可以用的運算符包括:In
NotIn
Exists
和DoesNotExIST
。
提示:如果同時設置了matchLabels和matchExpressions,則兩組條件爲"AND" 關係,即所有條件需要同時滿足時才能完成Selector的篩選。
六、Lbael Selector 使用場景
Label Selector 在Kubernetes中的最重要的使用場景有以下幾處:
- kube-controller進程通過資源對象RC上定義的Label Selector來篩選要監控的Pod副本的數量,從而實現Pod 副本的數量始終符合設定的全自動控制流程。
- kube-proxy 進程通過Service的Label Selector 來選擇對應的Pod,自動建立起每個Service到對應的Pod的請求轉發路由表,從而實現Service的智能均衡特性。
- 通過對某些Node定義特定的Label,並且在Pod定義文件中使用NodeSelector,這種標籤調度策略,kube-scheduler進程可以實現Pod“定向調度”的特性。