K8S調度之節點親和性
Node Affinity
Affinity 翻譯成中文是“親和性”,它對應的是 Anti-Affinity,我們翻譯成“互斥”。這兩個詞比較形象,可以把 pod 選擇 node 的過程類比成磁鐵的吸引和互斥,不同的是除了簡單的正負極之外,pod 和 node 的吸引和互斥是可以靈活配置的。
Affinity的優點:
- 匹配有更多的邏輯組合,不只是字符串的完全相等
- 調度分成軟策略(soft)和硬策略(hard),在軟策略下,如果沒有滿足調度條件的節點,pod會忽略這條規則,繼續完成調度。
目前主要的node affinity:
requiredDuringSchedulingIgnoredDuringExecution
表示pod必須部署到滿足條件的節點上,如果沒有滿足條件的節點,就不停重試。其中IgnoreDuringExecution表示pod部署之後運行的時候,如果節點標簽發生了變化,不再滿足pod指定的條件,pod也會繼續運行。requiredDuringSchedulingRequiredDuringExecution
表示pod必須部署到滿足條件的節點上,如果沒有滿足條件的節點,就不停重試。其中RequiredDuringExecution表示pod部署之後運行的時候,如果節點標簽發生了變化,不再滿足pod指定的條件,則重新選擇符合要求的節點。preferredDuringSchedulingIgnoredDuringExecution
表示優先部署到滿足條件的節點上,如果沒有滿足條件的節點,就忽略這些條件,按照正常邏輯部署。preferredDuringSchedulingRequiredDuringExecution
表示優先部署到滿足條件的節點上,如果沒有滿足條件的節點,就忽略這些條件,按照正常邏輯部署。其中RequiredDuringExecution表示如果後面節點標簽發生了變化,滿足了條件,則重新調度到滿足條件的節點。
軟策略和硬策略的區分是有用處的,硬策略適用於 pod 必須運行在某種節點,否則會出現問題的情況,比如集群中節點的架構不同,而運行的服務必須依賴某種架構提供的功能;軟策略不同,它適用於滿不滿足條件都能工作,但是滿足條件更好的情況,比如服務最好運行在某個區域,減少網絡傳輸等。這種區分是用戶的具體需求決定的,並沒有絕對的技術依賴。
下面是一個官方的示例:
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/e2e-az-name operator: In values: - e2e-az1 - e2e-az2 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value containers: - name: with-node-affinity image: gcr.io/google_containers/pause:2.0
這個 pod 同時定義了 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 兩種 nodeAffinity。第一個要求 pod 運行在特定 AZ 的節點上,第二個希望節點最好有對應的 another-node-label-key:another-node-label-value 標簽。
這裏的匹配邏輯是label在某個列表中,可選的操作符有:
- In: label的值在某個列表中
- NotIn:label的值不在某個列表中
- Exists:某個label存在
- DoesNotExist:某個label不存在
- Gt:label的值大於某個值(字符串比較)
- Lt:label的值小於某個值(字符串比較)
如果nodeAffinity中nodeSelector有多個選項,節點滿足任何一個條件即可;如果matchExpressions有多個選項,則節點必須同時滿足這些選項才能運行pod 。
需要說明的是,node並沒有anti-affinity這種東西,因為NotIn和DoesNotExist能提供類似的功能。
K8S調度之節點親和性