By default the Kubernetes scheduler distributes pods of a replica set evenly to all nodes, if no taints are present of course. So why or when do we need pod anti-affinity? 1 scenario I can think of is like this:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy1
spec:
replica: 2
selector:
matchLabels:
app: wordpress
domain: example.com
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy2
spec:
replica: 2
selector:
matchLabels:
app: wordpress
domain: hello.comWithout any advanced tuning such as pod anti-affinity, the replicas can possibly be scheduled like
node1: - deploy1-replica1 - deploy2-replica1 node2: - deploy1-replica2 - deploy2-replica2
To be fair this is usually Ok. But if we don’t want deploy1 and deploy2 sharing the same node, now it’s the time to use pod anti-affinity:
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy1
spec:
replica: 2
selector:
matchLabels:
app: wordpress
domain: example.com
template:
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- wordpress
topologyKey: kubernetes.io/hostname
weight: 100
...
# same goes for deploy2Now all replicas having app: wordpress label will be distributed evenly among all nodes
node1: - deploy1-replica1 node2: - deploy2-replica1 node3: - deploy1-replica2 node4: - deploy2-replica2
🙂
