"Three replicas" says nothing about where they run, so tell the scheduler to spread them.
Without a rule all three can land on one node; one node failure then takes the whole service down while kubectl get pods still said 3/3.
topologySpreadConstraints
topologySpreadConstraints: - maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule # or ScheduleAnyway labelSelector: {matchLabels: {app: checkout}}
Prefer spread constraints for balance
Anti-affinity is a pairwise "avoid that Pod" rule and can leave zones lopsided. Spread constraints reason about the whole distribution, which is nearly always the real goal. Use both when you need hard co-location rules and balance.