From 04be6d328103e26169ca2e3af3f60dfc1c81808f Mon Sep 17 00:00:00 2001 From: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:13:01 +0100 Subject: [PATCH 01/11] Add guidance for spreading Placement and Scheduler replicas in Kubernetes Signed-off-by: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> --- .../kubernetes/kubernetes-production.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index 1b737f0665e..d41e11f5aa3 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -122,6 +122,61 @@ To scale scheduler and placement to three instances independently of the `global --wait ``` +### Spreading Placement and Scheduler replicas + +For HA **Scheduler** and **Placement**, the Helm chart uses pod anti-affinity so replicas are not all scheduled on the same failure domain. Two values control that behavior: + +- **`global.ha.topologyKey`** — Kubernetes label used as the “domain” for spreading (default `topology.kubernetes.io/zone`, i.e. one pod per zone when possible). +- **`global.ha.podAntiAffinityPolicy`** — **soft** (`preferredDuringSchedulingIgnoredDuringExecution`, default) or **hard** (`requiredDuringSchedulingIgnoredDuringExecution`) enforcement of that spread. + +**When to change `topologyKey`** + +- **Multi-zone clusters** — default `topology.kubernetes.io/zone` is usually what you want so replicas land in different availability zones. +- **Single zone, many nodes** — nodes often share the same zone label, so zone spreading does little. Set `global.ha.topologyKey` to `kubernetes.io/hostname` so the scheduler prefers different nodes. + +Example in a values file: + +```yaml +global: + ha: + enabled: true + topologyKey: kubernetes.io/hostname +``` + +**When to use soft vs hard spreading** + +- **Soft (default)** — Use in most clusters. Kubernetes *tries* to separate replicas by `topologyKey`, but can still place two on the same zone or node if resources are tight. Avoids pods stuck **Pending** when you have fewer zones than replicas. +- **Hard** — Use when you *require* no two replicas on the same topology value (for example you must have one Scheduler or Placement pod per zone). Only viable if you have at least as many distinct values for `topologyKey` as replicas (three zones for three replicas when using `topology.kubernetes.io/zone`). + +Enable hard spreading with Helm: + +```bash +helm upgrade --install dapr dapr/dapr \ + --version={{% dapr-latest-version short="true" %}} \ + --namespace dapr-system \ + --create-namespace \ + --set global.ha.enabled=true \ + --set global.ha.podAntiAffinityPolicy=requiredDuringSchedulingIgnoredDuringExecution \ + --wait +``` + +Or combine with a custom topology key: + +```bash +helm upgrade --install dapr dapr/dapr \ + --version={{% dapr-latest-version short="true" %}} \ + --namespace dapr-system \ + --create-namespace \ + --set global.ha.enabled=true \ + --set global.ha.topologyKey=kubernetes.io/hostname \ + --set global.ha.podAntiAffinityPolicy=requiredDuringSchedulingIgnoredDuringExecution \ + --wait +``` + +{{% alert title="Note" color="primary" %}} +If pods stay **Pending** after enabling **hard** spreading, your cluster likely does not expose enough distinct `topologyKey` values for the replica count. Switch to **soft** spreading, widen the cluster (more zones or nodes), or change `topologyKey`. Full `global.ha` reference: [Dapr Helm chart README](https://github.com/dapr/dapr/blob/master/charts/dapr/README.md). +{{% /alert %}} + ## 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 From 5872e2f0e0a279e07bc64ebe1cc075acb279634a Mon Sep 17 00:00:00 2001 From: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> Date: Thu, 19 Mar 2026 18:27:48 +0100 Subject: [PATCH 02/11] more concise Signed-off-by: MyMirelHub <15373565+MyMirelHub@users.noreply.github.com> --- .../kubernetes/kubernetes-production.md | 51 ++++--------------- 1 file changed, 10 insertions(+), 41 deletions(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index d41e11f5aa3..84199c88eb0 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -124,59 +124,28 @@ To scale scheduler and placement to three instances independently of the `global ### Spreading Placement and Scheduler replicas -For HA **Scheduler** and **Placement**, the Helm chart uses pod anti-affinity so replicas are not all scheduled on the same failure domain. Two values control that behavior: +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`** — Kubernetes label used as the “domain” for spreading (default `topology.kubernetes.io/zone`, i.e. one pod per zone when possible). -- **`global.ha.podAntiAffinityPolicy`** — **soft** (`preferredDuringSchedulingIgnoredDuringExecution`, default) or **hard** (`requiredDuringSchedulingIgnoredDuringExecution`) enforcement of that spread. +- `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 to change `topologyKey`** +When running in production, consider: -- **Multi-zone clusters** — default `topology.kubernetes.io/zone` is usually what you want so replicas land in different availability zones. -- **Single zone, many nodes** — nodes often share the same zone label, so zone spreading does little. Set `global.ha.topologyKey` to `kubernetes.io/hostname` so the scheduler prefers different nodes. +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. -Example in a values file: +For example, hard spreading by hostname in a single-zone cluster: ```yaml global: ha: enabled: true topologyKey: kubernetes.io/hostname + podAntiAffinityPolicy: requiredDuringSchedulingIgnoredDuringExecution ``` -**When to use soft vs hard spreading** - -- **Soft (default)** — Use in most clusters. Kubernetes *tries* to separate replicas by `topologyKey`, but can still place two on the same zone or node if resources are tight. Avoids pods stuck **Pending** when you have fewer zones than replicas. -- **Hard** — Use when you *require* no two replicas on the same topology value (for example you must have one Scheduler or Placement pod per zone). Only viable if you have at least as many distinct values for `topologyKey` as replicas (three zones for three replicas when using `topology.kubernetes.io/zone`). - -Enable hard spreading with Helm: - -```bash -helm upgrade --install dapr dapr/dapr \ - --version={{% dapr-latest-version short="true" %}} \ - --namespace dapr-system \ - --create-namespace \ - --set global.ha.enabled=true \ - --set global.ha.podAntiAffinityPolicy=requiredDuringSchedulingIgnoredDuringExecution \ - --wait -``` - -Or combine with a custom topology key: - -```bash -helm upgrade --install dapr dapr/dapr \ - --version={{% dapr-latest-version short="true" %}} \ - --namespace dapr-system \ - --create-namespace \ - --set global.ha.enabled=true \ - --set global.ha.topologyKey=kubernetes.io/hostname \ - --set global.ha.podAntiAffinityPolicy=requiredDuringSchedulingIgnoredDuringExecution \ - --wait -``` - -{{% alert title="Note" color="primary" %}} -If pods stay **Pending** after enabling **hard** spreading, your cluster likely does not expose enough distinct `topologyKey` values for the replica count. Switch to **soft** spreading, widen the cluster (more zones or nodes), or change `topologyKey`. Full `global.ha` reference: [Dapr Helm chart README](https://github.com/dapr/dapr/blob/master/charts/dapr/README.md). -{{% /alert %}} - ## 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 From 19c509f47bc38dd8529ca97375371b77d696139b Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:31:41 +0200 Subject: [PATCH 03/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index 84199c88eb0..270cb7f55cb 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -136,7 +136,7 @@ When running in production, consider: 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: +For example, too configure hard spreading by hostname in a single-zone cluster, use the following Helm values: ```yaml global: From 3d06f835e5060eeb456173e7590a7c941a02a056 Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:31:51 +0200 Subject: [PATCH 04/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index 270cb7f55cb..a85f2ef1b91 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -127,7 +127,7 @@ To scale scheduler and placement to three instances independently of the `global 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). +- `global.ha.podAntiAffinityPolicy`: Enables soft spreading with `preferredDuringSchedulingIgnoredDuringExecution` (the default) or hard spreading with `requiredDuringSchedulingIgnoredDuringExecution`. When running in production, consider: From d2af76e08de822181e70dad05ecb75e141d678fa Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:32:00 +0200 Subject: [PATCH 05/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index a85f2ef1b91..cca611d6889 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -126,7 +126,7 @@ To scale scheduler and placement to three instances independently of the `global 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.topologyKey`: Kubernetes label used meaning “different domain”. Set by default to `topology.kubernetes.io/zone`. - `global.ha.podAntiAffinityPolicy`: Enables soft spreading with `preferredDuringSchedulingIgnoredDuringExecution` (the default) or hard spreading with `requiredDuringSchedulingIgnoredDuringExecution`. When running in production, consider: From 30579fb01e208c82979e2f5c6249439ef9335abb Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:32:08 +0200 Subject: [PATCH 06/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index cca611d6889..a541c5ee610 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -124,7 +124,7 @@ To scale scheduler and placement to three instances independently of the `global ### 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: +With HA enabled, the default Helm values add pod anti-affinity so Scheduler and Placement service replicas are attempted to be scheduled across different failure domains if cluster resourcing allows. This is configured using the following Helm chart [options](https://github.com/dapr/dapr/blob/master/charts/dapr/README.md) - `global.ha.topologyKey`: Kubernetes label used meaning “different domain”. Set by default to `topology.kubernetes.io/zone`. - `global.ha.podAntiAffinityPolicy`: Enables soft spreading with `preferredDuringSchedulingIgnoredDuringExecution` (the default) or hard spreading with `requiredDuringSchedulingIgnoredDuringExecution`. From c4fc7c1cbef2081ff748c886d727854306189297 Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:32:15 +0200 Subject: [PATCH 07/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index a541c5ee610..8065e4911f6 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -132,7 +132,7 @@ With HA enabled, the default Helm values add pod anti-affinity so Scheduler and 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. +2. **Single zone, many nodes**: Zone labels are often identical across the cluster; set `topologyKey` to `kubernetes.io/hostname` to enable spreading 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. From d2e541cc15fc1cbc63b5c4eff18c2f974d113a13 Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:32:22 +0200 Subject: [PATCH 08/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index 8065e4911f6..a0467d8c138 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -131,7 +131,7 @@ With HA enabled, the default Helm values add pod anti-affinity so Scheduler and 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. +1. **Availability zones**: The default topology key spreads pods across zones. This limits the chance that a single zone outage removes multiple Scheduler or Placement pods at the same time. 2. **Single zone, many nodes**: Zone labels are often identical across the cluster; set `topologyKey` to `kubernetes.io/hostname` to enable spreading 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. From e7e04bef2d46155e2aecf74543f03198fd08c9f9 Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:32:31 +0200 Subject: [PATCH 09/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index a0467d8c138..39f3b3a7ad7 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -133,7 +133,7 @@ When running in production, consider: 1. **Availability zones**: The default topology key spreads pods across zones. This limits the chance that a single zone outage removes multiple Scheduler or Placement pods at the same time. 2. **Single zone, many nodes**: Zone labels are often identical across the cluster; set `topologyKey` to `kubernetes.io/hostname` to enable spreading 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. +3. **Soft spreading**: The default behaviour is recommended here allowing pod scheduling to succeed 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, too configure hard spreading by hostname in a single-zone cluster, use the following Helm values: From a57da697f1ee9c700a9141b3dc79860f47a55def Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:32:40 +0200 Subject: [PATCH 10/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index 39f3b3a7ad7..599c427873c 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -134,7 +134,7 @@ When running in production, consider: 1. **Availability zones**: The default topology key spreads pods across zones. This limits the chance that a single zone outage removes multiple Scheduler or Placement pods at the same time. 2. **Single zone, many nodes**: Zone labels are often identical across the cluster; set `topologyKey` to `kubernetes.io/hostname` to enable spreading by node. 3. **Soft spreading**: The default behaviour is recommended here allowing pod scheduling to succeed 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. +4. **Hard spreading**: Only use when you must never place two replicas on the same topology value. This requires as many distinct values for `topologyKey` as replicas, or pods will stay `Pending`. For example, too configure hard spreading by hostname in a single-zone cluster, use the following Helm values: From 124f084f2cfcc09ef76be915ebcb84ff861a50f9 Mon Sep 17 00:00:00 2001 From: Mirel <15373565+MyMirelHub@users.noreply.github.com> Date: Mon, 4 May 2026 16:32:47 +0200 Subject: [PATCH 11/11] Update daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md Co-authored-by: Alice Gibbons Signed-off-by: Mirel <15373565+MyMirelHub@users.noreply.github.com> --- .../en/operations/hosting/kubernetes/kubernetes-production.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md index 599c427873c..709f5d63102 100644 --- a/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md +++ b/daprdocs/content/en/operations/hosting/kubernetes/kubernetes-production.md @@ -129,7 +129,7 @@ With HA enabled, the default Helm values add pod anti-affinity so Scheduler and - `global.ha.topologyKey`: Kubernetes label used meaning “different domain”. Set by default to `topology.kubernetes.io/zone`. - `global.ha.podAntiAffinityPolicy`: Enables soft spreading with `preferredDuringSchedulingIgnoredDuringExecution` (the default) or hard spreading with `requiredDuringSchedulingIgnoredDuringExecution`. -When running in production, consider: +When running in production, consider the following recommendations. 1. **Availability zones**: The default topology key spreads pods across zones. This limits the chance that a single zone outage removes multiple Scheduler or Placement pods at the same time. 2. **Single zone, many nodes**: Zone labels are often identical across the cluster; set `topologyKey` to `kubernetes.io/hostname` to enable spreading by node.