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.

Reply via email to