Anti-affinity
What does keeping replicas apart cost, and why do the rules compose badly?
Topology tells the scheduler what shares a switch. It cannot tell the scheduler that these two pods are replicas of one service, or that these three jobs all hammer the same downstream database. Anti-affinity is a human-supplied correlation matrix: a rule such as "never place two replicas of service X on the same node/rack." It patches an informational gap. The scheduler's model of independence is physical, and real correlation is semantic. This is "independence assumed and false," with a price tag attached.
Every anti-affinity rule is an anti-packing rule, so the cost is direct utilization. And the constraints compose badly. They are conjunctive and checked at placement time, while they must hold over the task's whole lifetime. A cluster that drifts (nodes drained, tasks rescheduled) accumulates placements that were legal when made and are violated now. That forces a descheduler: a background process that evicts tasks that were correctly placed yesterday. This is the same shape as compaction and vacuum (background cleanup of dead space) in storage: a decision made once against a moving world needs a collector behind it.
Shuffle sharding is an elegant escape from correlation: each tenant gets a random small subset of the machines, so two tenants rarely share the same subset. It gives combinatorial isolation without paying n-times replication.
Anti-affinity buys independence the topology cannot see, and pays in packing density plus a background evictor.