1. 程式人生 > >K8S調度之節點親和性

K8S調度之節點親和性

用處 適用於 變化 匹配 選項 裏的 RM contain 標簽

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調度之節點親和性