一般狀況下,Pod分配到哪些Node是不須要管理員操心的,這個過程會由scheduler自動實現。但有時,咱們須要指定一些調度的限制,例如某些應用應該跑在具備SSD存儲的節點上,有些應用應該跑在同一個節點上等等。 node
nodeSelector:
首先咱們爲Node規劃標籤,而後在建立部署的時候,經過使用nodeSelector標籤來指定Pod運行在哪些節點上。nginx
親和性(Affinity )與反親和性(AntiAffinity):
web
包含:nodeAffinity(主機親和性),podAffinity(POD親和性)以及podAntiAffinity(POD反親和性)redis
策略名稱 | 匹配目標 | 支持的操做符 | 支持拓撲域 | 設計目標 |
---|---|---|---|---|
nodeAffinity | 主機標籤 | In,NotIn,Exists,DoesNotExist,Gt,Lt | 不支持 | 決定Pod能夠部署在哪些主機上 |
podAffinity | Pod標籤 | In,NotIn,Exists,DoesNotExist | 支持 | 決定Pod能夠和哪些Pod部署在同一拓撲域 |
PodAntiAffinity | Pod標籤 | In,NotIn,Exists,DoesNotExist | 支持 | 決定Pod不能夠和哪些Pod部署在同一拓 |
nodeAffinity使用場景 :api
若是S1服務使用S2服務,爲了減小它們之間的網絡延遲(或其它緣由),把S1服務的POD和S2服務的pod部署在同一拓撲域中。
podAntiAffinity使用場景:網絡
運算符關係:app
nodeSelector的調度方式略顯簡單,經過親和和反親和配置,可以爲調度提供更靈活的策略,主要有如下幾點加強:dom
親和性特性包含兩種方式:
ide
IgnoreDuringExecution表示若是在Pod運行期間Node的標籤發生變化,致使親和性策略不能知足,則繼續運行當前的Pod。性能
限制
topologyKey:
例子:
apiVersion: apps/v1 kind: Deployment metadata: name: redis-cache spec: selector: matchLabels: app: redis replicas: 3 template: metadata: labels: app: redis spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - redis topologyKey: "kubernetes.io/hostname" containers: - name: redis-server image: redis:latest
上面的例子中,建立了一個具備三個實例的部署,採用了Pod間的反親和策略,限制建立的實例的時候,若是節點上已經存在具備相同標籤的實例,則不進行部署,避免了一個節點上部署多個相同的實例。
基於上面的例子:
再建立3個Web服務的實例,同上面Redis的配置,首先確保兩個Web不會部署到相同的節點,而後在應用Pod間親和策略,優先在有Redis服務的節點上部署Web。
apiVersion: apps/v1 kind: Deployment metadata: name: web-server spec: selector: matchLabels: app: web-store replicas: 3 template: metadata: labels: app: web-store spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - web-store topologyKey: "kubernetes.io/hostname" podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - redis topologyKey: "kubernetes.io/hostname" containers: - name: web-app image: nginx:latest
⚠️注意事項: