多个 Pod 不重复部署在同一个节点上
设置 Pod 的反亲和性。以 deploy traefik 为例。
template:
metadata:
labels:
app.kubernetes.io/instance: traefik
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: traefik
helm.sh/chart: traefik-10.3.0
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/instance
operator: In
values:
- traefik
topologyKey: kubernetes.io/hostname
- topologyKey 固定是 “kubernetes.io/hostname” 就可以。
- labelSelector 根据实际的 label 来填。
注意 podAntiAffinity 不能是 requiredDuringSchedulingIgnoredDuringExecution,得用 preferredDuringSchedulingIgnoredDuringExecution。 两个原因:
- 因为 deploy 可能会同时有两个 rs 做 scale down/up。就有可能导致每个节点已经有一个 pod,但是两个 rs 的 pod 都没满的情况。
- 因为不能保证 Pod 数量一定小于节点数量,如果 scale 超过节点数,就会导致多余的 Pod 部署失败。
由于 preferredDuringSchedulingIgnoredDuringExecution,也因此不能保证一定不重复在一个节点上