上一節,介紹了兩種定向排程匹配,使用起來非常方便,但是也有一定的問題,那就是如果沒有滿足的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
#關係符說明- 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
#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
成功排程到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
可以看到正常執行在node2節點上。
NodeAffinity規則的注意事項
如果同時定義了nodeSelector和nodeAffinity,那麼必須兩個條件都得到滿足,pod才能執行在指定的node上。
如果nodeAffinity指定了多個nodeSelectorTerms,那麼只需要其中一個能夠匹配成功即可。
如果一個nodeSelectorTerms中有多個matchExpressions,則一個節點必須滿足所有的才能匹配成功。
如果一個pod所在的node節點在pod執行期間其標籤發生了改變,不在符合該pod的節點親和性需求,則系統將忽略此變化。(也就是標籤的變化不會影響到前面已經排程成功的pod)
注意:非原創,是跟著黑馬影片學習一個字一個字敲出來的筆記
影片地址:
https://www。bilibili。com/video/BV1xX4y1K7nb?p=2