一般状况下,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
⚠️注意事项: