官方建议:如果节点超过1000不建议用Affinity,因为调度计算会消耗大量时间,当然官方也有优化方案
NodeAffinity:节点亲和力
requiredDuringSchedulingIgnoredDuringExecution: 硬亲和力,即支持必须部署在指定的节点上,也支持必须不部署在指定节点上
preferredDuringSchedulingIgnoredDuringExecution: 软亲和力,尽量部署在满足条件的节点上,或者是尽量不用部署在被匹配的节点上
pod亲和力
A应用 B应用 C应用,将a应用根据某种策略部署在一块
requiredDuringSchedulingIgnoredDuringExecution: 将a应用和b应用部署在一块
preferredDuringSchedulingIgnoredDuringExecution: 尽量将a应用和b应用部署在一块
requiredDuringSchedulingIgnoredDuringExecution: 不要将a应用与之匹配的应用部署在一块
preferredDuringSchedulingIgnoredDuringExecution: 尽量不要将a应用与之匹配的应用部署在一块
kubectl label nodes node01 disktype=ssd kubectl label nodes node02 disktype=ssd kubectl label nodes node01 processor=gpu
apiVersion: v1 kind: Pod metadata: name: nginx-gpu spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: #必须满足 nodeSelectorTerms: - matchExpressions: #下面这些条件是可以单独拿出来匹配出目标 - key: disktype #标签disktype operator: In #等于 values: - ssd # ssd preferredDuringSchedulingIgnoredDuringExecution: #尽量满足 - weight: 1 preference: matchExpressions: - key: processor #labels key operator: In #等于 values: - gpu # gpu containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent
#pod亲和力 kubectl label pod bosybox meme=bus #给需要绑定的pod加个唯一标签 --- apiVersion: v1 kind: Pod metadata: name: nginx spec: #把改实例和kube-systemnamespaces下符合的albel为k8s-calico-kube-controllers的pod部署在同一个节点(拓扑域)上 affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: meme operator: In values: - bus #如果写了namespaces但是留空,他是匹配所有namespace下的指定label的pod,如果写了那么namespaces指定了值,就是匹配指定namespaces下单指定labels的pod namespaces: - kube-system topologyKey: kubernetes.io/hostname containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent --- …… spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: k8s-con operator: In values: - calico containers: --- #反亲和力 apiVersion: v1 kind: Pod metadata: name: nginx spec: affinity: podAntiAffinity: #就这里加了个Anti requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: meme operator: In values: - bus namespaces: - kube-system topologyKey: kubernetes.io/hostname containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent #就是尽量不部署在同一个服务器上