Kubernetes學習筆記(二十二)Pod排程 (親和性排程NodeAffinity)

上一節,介紹了兩種定向排程匹配,使用起來非常方便,但是也有一定的問題,那就是如果沒有滿足的node,那麼pod將不會被執行,即使在叢集中海油node列表也不行,這就限制了它的使用場景。

基於上面的問題,k8s還提供了一種親和度排程,它在nodeselector的基礎之上進行了擴充套件,可以透過匹配的形式,實現優先選擇滿足條件的node排程,如果沒有,也可以排程到不滿足條件的節點上,使排程更加的靈活。

Affinity主要分為三類:

nodeAffinity(node親和性):以node為目標,解決pod可以排程到那些node的問題

podAffinity(pod親和性):以pod為目標,解決pod可以和那些已存在的pod部署到同一個拓撲域中的問題

podAntiAffinity(pod反親和性):以pod為目標,解決pod不能和那些已存在的pod部署在同一個拓撲域中的問題

關於親和性(反親和性)使用場景的說明

親和性

:如果兩個應用頻繁互動,那就有必要利用親和性讓兩個應用盡可能地靠近,這樣可以減少因網路通訊帶來的效能損耗

反親和性

:當應用的採用多副本部署時,有必要採用反親和性讓各個應用例項分佈在各個node上,這樣可以提高服務的高可用。

NodeAffinity

首先看一下nodeAffinity的可用配置項

kubectl explain pod。spec。affinity。nodeAffinityFIELDS: #node節點必須滿足指定的所有規則才可以,相當於硬限制 requiredDuringSchedulingIgnoredDuringExecution <[]Object> nodeSelectorTerms: #節點選擇列表 matchFields: #按照節點欄位列出的節點選擇器要求列表 matchExpressions: #按照節點標籤列出的節點選擇器要求列出列表(推薦) key: 鍵 value: 值 operator: #關係符,支援Exists,DoesNotExist,In,NotIn,Gt,Lt #優先排程到滿足指定規則的node,相當於軟限制 preferredDuringSchedulingIgnoredDuringExecution perference: #一個節點選擇器項,與相應的權重關聯 matchFields: #按照節點欄位列出節點選擇器要求列表 matchExpressions: #按照節點標籤列出的節點選擇器要求列出列表(推薦) key: 鍵 value: 值 operator: #關係符,支援In,NotIn,Exists,DoesNotExist,Gt,Le,weight傾向權重,在範圍1-100

#關係符說明- matchExpressions: - key: nodeenv #匹配存在標籤的key為nodeenv的節點 operator: Exists - key: nodeenv #匹配標籤的key為nodeenv,且value是’xxx‘或’yyy‘的節點 value: [“xxx”,“yyy”] - key: nodeenv #匹配標籤的key為nodeeev,且value大於xxx的節點 operator: Gt values: “xxx”

首先演示演示一下requiredDuringSchedulingIgnoredDuringExecution

建立pod-nodeaffinity-required。yaml

apiVersion: v1kind: Podmetadata: name: pod-nodeaffinity-required namespace: devspec: containers: - name: nginx image: nginx:1。17。1 affinity: # 親和性設定 nodeAffinity: # 設定node親和性 requiredDuringSchedulingIgnoredDuringExecution: # 硬限制 nodeSelectorTerms: - matchExpressions: # 匹配nodeenv的值在[“xxx”,“yyy”]中的標籤 - key: nodeenv operator: In values: [“xxx”,“yyy”]

#建立podkubectl create -f pod-nodeaffinity-required。yaml#檢視pod狀態(執行失敗)kubectl get pods pod-nodeaffinity-required -n dev -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-nodeaffinity-required 0/1 Pending 0 12s #檢視pod詳情kubectl describe pod pod-nodeaffinity-required -n dev

Kubernetes學習筆記(二十二)Pod排程 (親和性排程/NodeAffinity)

#node節點都不能滿足排程要求,所以啟動一直在Pending狀態。# 刪除pod-nodeaffinity-requiredkubectl delete -f pod-nodeaffinity-required。yaml #給node1節點打個標籤kubectl label node node1 nodeenv=xxx -n dev#再次建立pod,然後檢視pod資訊kubectl get pods pod-nodeaffinity-required -n dev -o wide

Kubernetes學習筆記(二十二)Pod排程 (親和性排程/NodeAffinity)

成功排程到node1節點並啟動執行。

下面演示一下preferredDuringSchedulingIgnoredDuringExecution

建立pod-nodeaffinity-preferred。yaml

apiVersion: v1kind: Podmetadata: name: pod-nodeaffinity-preferred namespace: devspec: containers: - name: nginx image: nginx:1。17。1 affinity: # 親和性設定 nodeAffinity: # 設定node親和性 preferredDuringSchedulingIgnoredDuringExecution: # 軟限制 - weight: 1 preference: # 匹配nodeenv的值在[“ddd”,“bbb”]中的標籤(當前環境沒有) matchExpressions: - key: nodeenv operator: In values: [“ddd”,“bbb”]

#建立podkubectl create -f pod-nodeaffinity-preferred。yaml#檢視pod資訊kubectl get pods pod-nodeaffinity-preferred -n dev -o wide

Kubernetes學習筆記(二十二)Pod排程 (親和性排程/NodeAffinity)

可以看到正常執行在node2節點上。

NodeAffinity規則的注意事項

如果同時定義了nodeSelector和nodeAffinity,那麼必須兩個條件都得到滿足,pod才能執行在指定的node上。

如果nodeAffinity指定了多個nodeSelectorTerms,那麼只需要其中一個能夠匹配成功即可。

如果一個nodeSelectorTerms中有多個matchExpressions,則一個節點必須滿足所有的才能匹配成功。

如果一個pod所在的node節點在pod執行期間其標籤發生了改變,不在符合該pod的節點親和性需求,則系統將忽略此變化。(也就是標籤的變化不會影響到前面已經排程成功的pod)

注意:非原創,是跟著黑馬影片學習一個字一個字敲出來的筆記

影片地址:

https://www。bilibili。com/video/BV1xX4y1K7nb?p=2