This is an automated email from the ASF dual-hosted git repository.
jerryshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new a0c485a9df [#10864] feat(charts): Support topologySpreadConstraints in
Helm charts (#11917)
a0c485a9df is described below
commit a0c485a9df93be77458eecbd233e4a95c0592eb4
Author: somaz <[email protected]>
AuthorDate: Tue Aug 25 18:06:16 2026 +0900
[#10864] feat(charts): Support topologySpreadConstraints in Helm charts
(#11917)
### What changes were proposed in this pull request?
Add an opt-in `topologySpreadConstraints` value to the Gravitino,
Iceberg REST, and Lance REST Helm charts. It defaults to `[]` (no change
to existing deployments) and is written into each Deployment's pod spec
alongside the existing `affinity` / `tolerations` fields.
### Why are the changes needed?
Enterprises running on multi-AZ Kubernetes clusters often require
workloads to be spread across zones or nodes for HA. Without this field,
all pods of a chart can land on the same node/AZ, creating a single
point of failure.
Fix: #10864
### Does this PR introduce _any_ user-facing change?
Yes, a new optional `topologySpreadConstraints` value (default `[]`) in
all three charts. No behavior change when unset.
### How was this patch tested?
helm unittest on all three charts (added a render test per chart;
iceberg/lance also assert the field is absent by default):
- gravitino: 38 passed
- gravitino-iceberg-rest-server: 33 passed
- gravitino-lance-rest-server: 32 passed
Also verified with helm lint and helm template that the constraints
render into the pod spec when set and are omitted when unset.
Co-authored-by: Jerry Shao <[email protected]>
---
.../templates/deployment.yaml | 5 ++++
.../tests/deployment_test.yaml | 27 ++++++++++++++++++
.../gravitino-iceberg-rest-server/values.yaml | 2 ++
.../templates/deployment.yaml | 4 +++
.../tests/deployment_test.yaml | 32 ++++++++++++++++++++++
dev/charts/gravitino-lance-rest-server/values.yaml | 2 ++
dev/charts/gravitino/templates/deployment.yaml | 2 ++
dev/charts/gravitino/tests/deployment_test.yaml | 23 ++++++++++++++++
dev/charts/gravitino/values.yaml | 5 ++++
9 files changed, 102 insertions(+)
diff --git a/dev/charts/gravitino-iceberg-rest-server/templates/deployment.yaml
b/dev/charts/gravitino-iceberg-rest-server/templates/deployment.yaml
index a038febf3c..05f67abcb2 100644
--- a/dev/charts/gravitino-iceberg-rest-server/templates/deployment.yaml
+++ b/dev/charts/gravitino-iceberg-rest-server/templates/deployment.yaml
@@ -145,6 +145,11 @@ spec:
{{- toYaml . | nindent 8 }}
{{- end }}
+ {{- with .Values.topologySpreadConstraints }}
+ topologySpreadConstraints:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+
volumes:
# Configuration volume
- name: iceberg-rest-server-config
diff --git
a/dev/charts/gravitino-iceberg-rest-server/tests/deployment_test.yaml
b/dev/charts/gravitino-iceberg-rest-server/tests/deployment_test.yaml
index 74b926174d..9a8702a7bf 100644
--- a/dev/charts/gravitino-iceberg-rest-server/tests/deployment_test.yaml
+++ b/dev/charts/gravitino-iceberg-rest-server/tests/deployment_test.yaml
@@ -223,3 +223,30 @@ tests:
- equal:
path: spec.template.spec.containers[0].readinessProbe.httpGet.path
value: /custom/ready
+
+ - it: does not render topologySpreadConstraints by default
+ template: deployment.yaml
+ asserts:
+ - notExists:
+ path: spec.template.spec.topologySpreadConstraints
+
+ - it: renders topologySpreadConstraints when set
+ template: deployment.yaml
+ set:
+ topologySpreadConstraints:
+ - maxSkew: 1
+ topologyKey: topology.kubernetes.io/zone
+ whenUnsatisfiable: DoNotSchedule
+ labelSelector:
+ matchLabels:
+ app.kubernetes.io/name: gravitino-iceberg-rest-server
+ asserts:
+ - equal:
+ path: spec.template.spec.topologySpreadConstraints[0].maxSkew
+ value: 1
+ - equal:
+ path: spec.template.spec.topologySpreadConstraints[0].topologyKey
+ value: topology.kubernetes.io/zone
+ - equal:
+ path:
spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable
+ value: DoNotSchedule
diff --git a/dev/charts/gravitino-iceberg-rest-server/values.yaml
b/dev/charts/gravitino-iceberg-rest-server/values.yaml
index 6e0df95823..ed7b9cc8e2 100644
--- a/dev/charts/gravitino-iceberg-rest-server/values.yaml
+++ b/dev/charts/gravitino-iceberg-rest-server/values.yaml
@@ -366,6 +366,8 @@ tolerations: []
affinity: {}
+topologySpreadConstraints: []
+
## PodDisruptionBudget configuration
## PodDisruptionBudgets limit the number of pods that can be down
simultaneously during voluntary disruptions
## (such as node drains, cluster upgrades, or pod evictions), ensuring high
availability and service continuity.
diff --git a/dev/charts/gravitino-lance-rest-server/templates/deployment.yaml
b/dev/charts/gravitino-lance-rest-server/templates/deployment.yaml
index 9333d1fbdb..e72bac95ea 100644
--- a/dev/charts/gravitino-lance-rest-server/templates/deployment.yaml
+++ b/dev/charts/gravitino-lance-rest-server/templates/deployment.yaml
@@ -111,3 +111,7 @@ spec:
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
+ {{- with .Values.topologySpreadConstraints }}
+ topologySpreadConstraints:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
diff --git a/dev/charts/gravitino-lance-rest-server/tests/deployment_test.yaml
b/dev/charts/gravitino-lance-rest-server/tests/deployment_test.yaml
index 25c0ba97bd..f50f7b7e40 100644
--- a/dev/charts/gravitino-lance-rest-server/tests/deployment_test.yaml
+++ b/dev/charts/gravitino-lance-rest-server/tests/deployment_test.yaml
@@ -244,3 +244,35 @@ tests:
name: lance-data
mountPath: /var/lib/lance
any: true
+
+ - it: does not render topologySpreadConstraints by default
+ template: deployment.yaml
+ set:
+ lanceRest:
+ gravitinoMetalake: lrs_test
+ asserts:
+ - notExists:
+ path: spec.template.spec.topologySpreadConstraints
+
+ - it: renders topologySpreadConstraints when set
+ template: deployment.yaml
+ set:
+ lanceRest:
+ gravitinoMetalake: lrs_test
+ topologySpreadConstraints:
+ - maxSkew: 1
+ topologyKey: topology.kubernetes.io/zone
+ whenUnsatisfiable: DoNotSchedule
+ labelSelector:
+ matchLabels:
+ app.kubernetes.io/name: gravitino-lance-rest-server
+ asserts:
+ - equal:
+ path: spec.template.spec.topologySpreadConstraints[0].maxSkew
+ value: 1
+ - equal:
+ path: spec.template.spec.topologySpreadConstraints[0].topologyKey
+ value: topology.kubernetes.io/zone
+ - equal:
+ path:
spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable
+ value: DoNotSchedule
diff --git a/dev/charts/gravitino-lance-rest-server/values.yaml
b/dev/charts/gravitino-lance-rest-server/values.yaml
index a097d52021..0252f1f22a 100644
--- a/dev/charts/gravitino-lance-rest-server/values.yaml
+++ b/dev/charts/gravitino-lance-rest-server/values.yaml
@@ -198,3 +198,5 @@ nodeSelector: {}
tolerations: []
affinity: {}
+
+topologySpreadConstraints: []
diff --git a/dev/charts/gravitino/templates/deployment.yaml
b/dev/charts/gravitino/templates/deployment.yaml
index 6380fd4525..e1f30e3651 100644
--- a/dev/charts/gravitino/templates/deployment.yaml
+++ b/dev/charts/gravitino/templates/deployment.yaml
@@ -234,6 +234,8 @@ spec:
{{- toYaml .Values.affinity | nindent 8 }}
tolerations:
{{- toYaml .Values.tolerations | nindent 8 }}
+ topologySpreadConstraints:
+ {{- toYaml .Values.topologySpreadConstraints | nindent 8 }}
volumes:
- name: gravitino-conf
configMap:
diff --git a/dev/charts/gravitino/tests/deployment_test.yaml
b/dev/charts/gravitino/tests/deployment_test.yaml
index b23b73f9e1..b0e63334e2 100644
--- a/dev/charts/gravitino/tests/deployment_test.yaml
+++ b/dev/charts/gravitino/tests/deployment_test.yaml
@@ -265,3 +265,26 @@ tests:
name: GRAVITINO_DB
value: gravitino
any: true
+
+ - it: renders topologySpreadConstraints when set
+ template: deployment.yaml
+ release:
+ name: gravitino
+ set:
+ topologySpreadConstraints:
+ - maxSkew: 1
+ topologyKey: topology.kubernetes.io/zone
+ whenUnsatisfiable: DoNotSchedule
+ labelSelector:
+ matchLabels:
+ app.kubernetes.io/name: gravitino
+ asserts:
+ - equal:
+ path: spec.template.spec.topologySpreadConstraints[0].maxSkew
+ value: 1
+ - equal:
+ path: spec.template.spec.topologySpreadConstraints[0].topologyKey
+ value: topology.kubernetes.io/zone
+ - equal:
+ path:
spec.template.spec.topologySpreadConstraints[0].whenUnsatisfiable
+ value: DoNotSchedule
diff --git a/dev/charts/gravitino/values.yaml b/dev/charts/gravitino/values.yaml
index b2796bc09f..f7238d9d5c 100644
--- a/dev/charts/gravitino/values.yaml
+++ b/dev/charts/gravitino/values.yaml
@@ -663,6 +663,11 @@ tolerations: []
##
affinity: {}
+## Topology spread constraints for pod assignment
+## ref:
https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/
+##
+topologySpreadConstraints: []
+
## PodDisruptionBudget configuration
## PodDisruptionBudgets limit the number of pods that can be down
simultaneously during voluntary disruptions
## (such as node drains, cluster upgrades, or pod evictions), ensuring high
availability and service continuity.