K8S調度之節點親和性

Node Affinity

Affinity 翻譯成中文是「親和性」,它對應的是 Anti-Affinity,咱們翻譯成「互斥」。這兩個詞比較形象,能夠把 pod 選擇 node 的過程類比成磁鐵的吸引和互斥,不一樣的是除了簡單的正負極以外,pod 和 node 的吸引和互斥是能夠靈活配置的。node

Affinity的優勢:api

  • 匹配有更多的邏輯組合,不僅是字符串的徹底相等
  • 調度分紅軟策略(soft)和硬策略(hard),在軟策略下,若是沒有知足調度條件的節點,pod會忽略這條規則,繼續完成調度。

目前主要的node affinity:網絡

  • requiredDuringSchedulingIgnoredDuringExecution
    表示pod必須部署到知足條件的節點上,若是沒有知足條件的節點,就不停重試。其中IgnoreDuringExecution表示pod部署以後運行的時候,若是節點標籤發生了變化,再也不知足pod指定的條件,pod也會繼續運行。架構

  • requiredDuringSchedulingRequiredDuringExecution
    表示pod必須部署到知足條件的節點上,若是沒有知足條件的節點,就不停重試。其中RequiredDuringExecution表示pod部署以後運行的時候,若是節點標籤發生了變化,再也不知足pod指定的條件,則從新選擇符合要求的節點。ui

  • preferredDuringSchedulingIgnoredDuringExecution
    表示優先部署到知足條件的節點上,若是沒有知足條件的節點,就忽略這些條件,按照正常邏輯部署。google

  • preferredDuringSchedulingRequiredDuringExecution
    表示優先部署到知足條件的節點上,若是沒有知足條件的節點,就忽略這些條件,按照正常邏輯部署。其中RequiredDuringExecution表示若是後面節點標籤發生了變化,知足了條件,則從新調度到知足條件的節點。翻譯

軟策略和硬策略的區分是有用處的,硬策略適用於 pod 必須運行在某種節點,不然會出現問題的狀況,好比集羣中節點的架構不一樣,而運行的服務必須依賴某種架構提供的功能;軟策略不一樣,它適用於滿不知足條件都能工做,可是知足條件更好的狀況,好比服務最好運行在某個區域,減小網絡傳輸等。這種區分是用戶的具體需求決定的,並無絕對的技術依賴。code

下面是一個官方的示例:字符串

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能提供相似的功能。

相關文章
相關標籤/搜索