Affinity 翻譯成中文是「親和性」,它對應的是 Anti-Affinity,咱們翻譯成「互斥」。這兩個詞比較形象,能夠把 pod 選擇 node 的過程類比成磁鐵的吸引和互斥,不一樣的是除了簡單的正負極以外,pod 和 node 的吸引和互斥是能夠靈活配置的。node
Affinity的優勢:api
目前主要的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在某個列表中,可選的操做符有:
若是nodeAffinity中nodeSelector有多個選項,節點知足任何一個條件便可;若是matchExpressions有多個選項,則節點必須同時知足這些選項才能運行pod 。
須要說明的是,node並無anti-affinity這種東西,由於NotIn和DoesNotExist能提供相似的功能。