一、前言
? ? 上一篇文章初步探討了 Kubernetes 的節點親和性,了解到它在 Pod 調度上比傳統方式更靈活高效。今天我們繼續討論親和性同時Kubernetes 的調度機制。
二、Pod親和性
??? ?上一篇文章中我們介紹了節點親和性,今天我們講解一下Pod親和性。首先我們先看下Pod親和性的。使用命令 kubectl explain pods.spec.affinity.podAffinity
解釋:
(1)Pod親和性是Pod調度的規則,類例如將一類的Pod調度到相同的節點,和節點親和性一樣,Pod親和性也是由一組調度規則組成。
(2)和節點親和性類似,Pod親和性也分為軟親和性和硬親和性
三、軟親和性詳解
1、鑒于在上一篇文章中對節點軟親和性做了一些介紹,但是介紹的相對簡單,所以本文打算深入的講解一下軟親和性。
preferredDuringSchedulingIgnoredDuringExecution:軟親和性,從名字中就可以看出
preferred DuringScheduling:優先調度
IgnoredDuringExecution:運行期間忽略
所謂軟親和性是一種建議,建議調度器在調度Pod的時候遵守一定的規則去進行調度,如果沒有符合條件的節點,則忽略異常。按照一定的規則(比如負載均衡等等)挑選一個節點部署。同時如果節點變更了導致不符合條件也不會將Pod驅逐。
2、繼續深入這個字段,使用命令
kubectl explain pods.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution
描述:調度器會傾向于將 Pod 調度到滿足該字段所指定的親和性表達式的節點上,但它也可能會選擇一個違反了一個或多個表達式的節點。最受青睞的節點是權重總和最大的那個節點。
簡單來說:我們可以定義一系列的規則并且為每個規則設定一定的權重,例如
規則 | 權重 |
---|---|
rule1 | 1 |
rule2 | 2 |
rule3 | 3 |
假設我們先2個節點 node1和node2,其中node1符合規則1和2,node2符合規則1、3且不符合規則2。如下表格
節點 | 滿足條件 | 違反規則 | 權重得分 |
---|---|---|---|
node1 | rule1、rule2 | 無 | 3 |
node2 | rule1、rule3 | rule2 | 4 |
雖然node2節點違反了rule1,但是由權重得分最高,pod也會被調度到node2。這就是軟親和性,一句話來說軟親和性是一種優先調度策略。
調度規則
我們繼續查看如何編寫調度規則,使用命令kubectl explain 查看podAffinityTerm字段,命令如下
kubectl explain pods.spec.affinity.podAffinity.preferredDuringSchedulingIgnoredDuringExecution.podAffinityTerm
FIELDS:labelSelector <LabelSelector>.....篇幅限制,這里刪除了描述,下同matchLabelKeys <[]string>mismatchLabelKeys <[]string>namespaceSelector <LabelSelector>namespaces <[]string>topologyKey <string> -required-
(1)labelSelector:是一個標簽選擇器,用于篩選出滿足特定標簽條件的 Pod。案例:
labelSelector:matchLabels:app: web-server
##篩選出 label中包含 app=web-server 的節點
(2)matchLabelKeys:標簽key的選擇器,輸入一直數組。案例:
matchLabelKeys:- test##篩選出包含label key 包含 test的節點
(3)mismatchLabelKeys:和matchLabelKeys剛好相反,不包含
(4)namespaceSelector:命名空間標簽選擇器,這里是通過命名空間包含的標簽來做選擇的
namespaceSelector:matchLabels:purpose: production#篩選出命名空間包含 標簽 purpose=product的節點
(5)namespaces:命名空間選擇器,選擇包含指定命名空間的節點
namespaces:- dev- staging#篩選出包含命名空間 dev、staging的節點
(6)topologyKey(必填):是一個必需字段,它指定了節點標簽的鍵。Kubernetes 根據這個標簽鍵來確定節點的拓撲域,例如節點的主機名、可用區、機架等
topologyKey: kubernetes.io/hostname
權重:weight
權重就很好理解了,就是為規則設置權重(1-100),k8s匹配規則的時候會計算權重,對于軟親和性來說,權重最高的節點將會被選擇。
四、硬親和性詳解
與軟親和性對應的是硬親和性,requiredDuringSchedulingIgnoredDuringExecution
requiredDuringScheduling:調度期間必須滿足
IgnoredDuringExecution:執行期間忽略
結合就是:調度期間必須滿足條件,但是執行期間忽略。即當節點變更后導致不符合條件也不會把Pod驅逐
調度規則
查看描述使用命令
kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution
labelSelector <LabelSelector>matchLabelKeys <[]string>mismatchLabelKeys <[]string>namespaceSelector <LabelSelector>namespaces <[]string>topologyKey <string> -required-
字段和上面一樣,有一點不同的就是沒有權重字段,這里不再贅述。硬親和性要求是必須滿足條件,否則無法調度,pod會一直處于Pending狀態。如下圖
五、總結:
總的來說,Kubernetes 中的 Pod 親和性為我們提供了極為強大的 Pod 調度控制能力。軟親和性的靈活性與硬親和性的嚴格性相互補充,讓我們能夠根據不同的業務場景和應用需求,精準地規劃 Pod 在節點上的分布。這不僅優化了資源利用效率,還增強了系統的穩定性和容錯性。希望對你有所幫助