diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index 1b737f0665e..84199c88eb0 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -122,6 +122,30 @@ To scale scheduler and placement to three instances independently of the `global --wait ``` +### Spreading Placement and Scheduler replicas + +With HA enabled, the Helm chart adds pod anti-affinity so **Scheduler** and **Placement** replicas tend to land on different failure domains. Configure that with: + +- `global.ha.topologyKey` — label Kubernetes uses for “different domain” (default `topology.kubernetes.io/zone`). +- `global.ha.podAntiAffinityPolicy` — **soft** spreading (`preferredDuringSchedulingIgnoredDuringExecution`, default) or **hard** spreading (`requiredDuringSchedulingIgnoredDuringExecution`). Full field names and defaults are documented in the [Helm chart readme](https://github.com/dapr/dapr/blob/master/charts/dapr/README.md). + +When running in production, consider: + +1. **Availability zones** — The default topology key spreads across zones. That limits the chance that one zone outage removes multiple Raft or etcd members at the same time. +2. **Single zone, many nodes** — Zone labels are often identical across the cluster; set `topologyKey` to `kubernetes.io/hostname` if you need separation by node. +3. **Soft spreading** — Leave the default unless you have a reason to change it: scheduling still succeeds when the cluster is short on zones or nodes. +4. **Hard spreading** — Only when you must never place two replicas on the same topology value. You need at least as many distinct values for `topologyKey` as replicas, or pods can stay Pending. + +For example, hard spreading by hostname in a single-zone cluster: + +```yaml +global: + ha: + enabled: true + topologyKey: kubernetes.io/hostname + podAntiAffinityPolicy: requiredDuringSchedulingIgnoredDuringExecution +``` + ## Setting cluster critical priority class name for control plane services In some scenarios, nodes may have memory and/or cpu pressure and the Dapr control plane pods might get selected