Skip to content

Commit

Permalink
Add topologySpreadConstraints (kubeflow#2091)
Browse files Browse the repository at this point in the history
* Update README and documentation (kubeflow#2047)

* Update docs

Signed-off-by: Yi Chen <[email protected]>

* Remove docs and update README

Signed-off-by: Yi Chen <[email protected]>

* Add link to monthly community meeting

Signed-off-by: Yi Chen <[email protected]>

---------

Signed-off-by: Yi Chen <[email protected]>
Signed-off-by: jbhalodia-slack <[email protected]>

* Add PodDisruptionBudget to chart (kubeflow#2078)

* Add PodDisruptionBudget to chart

Signed-off-by: Carlos Sánchez Páez <[email protected]>
Signed-off-by: Carlos Sánchez Páez <[email protected]>
Signed-off-by: Carlos Sánchez Páez <[email protected]>

* PR comments

Signed-off-by: Carlos Sánchez Páez <[email protected]>

---------

Signed-off-by: Carlos Sánchez Páez <[email protected]>
Signed-off-by: Carlos Sánchez Páez <[email protected]>
Signed-off-by: jbhalodia-slack <[email protected]>

* Set topologySpreadConstraints

Signed-off-by: jbhalodia-slack <[email protected]>

* Update README and increase patch version

Signed-off-by: jbhalodia-slack <[email protected]>

* Revert replicaCount change

Signed-off-by: jbhalodia-slack <[email protected]>

* Update README after master merger

Signed-off-by: jbhalodia-slack <[email protected]>

* Update README

Signed-off-by: jbhalodia-slack <[email protected]>

---------

Signed-off-by: Yi Chen <[email protected]>
Signed-off-by: jbhalodia-slack <[email protected]>
Signed-off-by: Carlos Sánchez Páez <[email protected]>
Signed-off-by: Carlos Sánchez Páez <[email protected]>
Co-authored-by: Yi Chen <[email protected]>
Co-authored-by: Carlos Sánchez Páez <[email protected]>
  • Loading branch information
3 people committed Jul 26, 2024
1 parent 51e4886 commit 4108f54
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 5 deletions.
2 changes: 1 addition & 1 deletion charts/spark-operator-chart/Chart.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
apiVersion: v2
name: spark-operator
description: A Helm chart for Spark on Kubernetes operator
version: 1.4.5
version: 1.4.6
appVersion: v1beta2-1.6.2-3.5.0
keywords:
- spark
Expand Down
3 changes: 2 additions & 1 deletion charts/spark-operator-chart/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# spark-operator

![Version: 1.4.5](https://img.shields.io/badge/Version-1.4.5-informational?style=flat-square) ![AppVersion: v1beta2-1.6.2-3.5.0](https://img.shields.io/badge/AppVersion-v1beta2--1.6.2--3.5.0-informational?style=flat-square)
![Version: 1.4.6](https://img.shields.io/badge/Version-1.4.6-informational?style=flat-square) ![AppVersion: v1beta2-1.6.2-3.5.0](https://img.shields.io/badge/AppVersion-v1beta2--1.6.2--3.5.0-informational?style=flat-square)

A Helm chart for Spark on Kubernetes operator

Expand Down Expand Up @@ -132,6 +132,7 @@ See [helm uninstall](https://helm.sh/docs/helm/helm_uninstall) for command docum
| sidecars | list | `[]` | Sidecar containers |
| sparkJobNamespaces | list | `[""]` | List of namespaces where to run spark jobs |
| tolerations | list | `[]` | List of node taints to tolerate |
| topologySpreadConstraints | list | `[]` | Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in. Ref: [Pod Topology Spread Constraints](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/) Specify topologySpreadConstraints without the labelSelector field, the labelSelector field will be set to "spark-operator.selectorLabels" subtemplate in the deployment.yaml file. |
| uiService.enable | bool | `true` | Enable UI service creation for Spark application |
| volumeMounts | list | `[]` | |
| volumes | list | `[]` | |
Expand Down
10 changes: 10 additions & 0 deletions charts/spark-operator-chart/templates/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,13 @@ spec:
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- if and .Values.topologySpreadConstraints (gt (int .Values.replicaCount) 1) }}
{{- $selectorLabels := include "spark-operator.selectorLabels" . | fromYaml -}}
{{- $labelSelectorDict := dict "labelSelector" ( dict "matchLabels" $selectorLabels ) }}
topologySpreadConstraints:
{{- range .Values.topologySpreadConstraints }}
- {{ mergeOverwrite . $labelSelectorDict | toYaml | nindent 8 | trim }}
{{- end }}
{{ else if and .Values.topologySpreadConstraints (eq (int .Values.replicaCount) 1) }}
{{ fail "replicaCount must be greater than 1 to enable topologySpreadConstraints."}}
{{- end }}
51 changes: 51 additions & 0 deletions charts/spark-operator-chart/tests/deployment_test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -299,3 +299,54 @@ tests:
- key: key2
operator: Exists
effect: NoSchedule

- it: Should not contain topologySpreadConstraints if topologySpreadConstraints is not set
set:
topologySpreadConstraints: []
asserts:
- notExists:
path: spec.template.spec.topologySpreadConstraints

- it: Should add topologySpreadConstraints if topologySpreadConstraints is set and replicaCount is greater than 1
set:
replicaCount: 2
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
asserts:
- equal:
path: spec.template.spec.topologySpreadConstraints
value:
- labelSelector:
matchLabels:
app.kubernetes.io/instance: spark-operator
app.kubernetes.io/name: spark-operator
maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
- labelSelector:
matchLabels:
app.kubernetes.io/instance: spark-operator
app.kubernetes.io/name: spark-operator
maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule

- it: Should fail if topologySpreadConstraints is set and replicaCount is not greater than 1
set:
replicaCount: 1
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: ScheduleAnyway
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
asserts:
- failedTemplate:
errorMessage: "replicaCount must be greater than 1 to enable topologySpreadConstraints."

Original file line number Diff line number Diff line change
Expand Up @@ -17,21 +17,22 @@ tests:

- it: Should render spark operator podDisruptionBudget if podDisruptionBudget.enable is true
set:
replicaCount: 2
podDisruptionBudget:
enable: true
documentIndex: 0
asserts:
- containsDocument:
apiVersion: policy/v1
kind: PodDisruptionBudget
name: spark-operator-podDisruptionBudget
name: spark-operator-pdb

- it: Should set minAvailable from values
set:
replicaCount: 2
podDisruptionBudget:
enable: true
minAvailable: 3
asserts:
- equal:
path: spec.template.minAvailable
path: spec.minAvailable
value: 3
12 changes: 12 additions & 0 deletions charts/spark-operator-chart/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,18 @@ podDisruptionBudget:
# Require `replicaCount` to be greater than 1
minAvailable: 1

# -- Topology spread constraints rely on node labels to identify the topology domain(s) that each Node is in.
# Ref: [Pod Topology Spread Constraints](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/)
# Specify topologySpreadConstraints without the labelSelector field, the labelSelector field will be set
# to "spark-operator.selectorLabels" subtemplate in the deployment.yaml file.
topologySpreadConstraints: []
# - maxSkew: 1
# topologyKey: topology.kubernetes.io/zone
# whenUnsatisfiable: ScheduleAnyway
# - maxSkew: 1
# topologyKey: kubernetes.io/hostname
# whenUnsatisfiable: DoNotSchedule

# nodeSelector -- Node labels for pod assignment
nodeSelector: {}

Expand Down

0 comments on commit 4108f54

Please sign in to comment.