场景说明:每个Node上只运行一个某应用的容器。假设有8台服务器,当某个应用伸缩到8个容器的时候,这些容器要平均地分布到8台服务器中,每台服务器上都有一个容器,不能出现某服务器上有多个,某服务器上一个都没有的情况。
k8s默认的容器调度策略是满足不了的,虽然它会尽量往负载低的服务器上调度,但难免会出现一台服务器上有重复的容器。此时可通过nodeAffinity
和podAntiAffinity
配合使用来实现。示例如下:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: NotIn
values:
- virtual-kubelet
- key: k8s.aliyun.com
operator: NotIn
values:
- 'true'
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- tongji-app
topologyKey: kubernetes.io/hostname
podAntiAffinity中的values即应用的标签名。
更多关于pod的调度可以看这里:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/