Skip to content

Commit 9b3d213

Browse files
alxtkr77Alex Tokerclaude
authored
[Spark] Support spark-operator on multi-namespace deployments (#258)
Co-authored-by: Alex Toker <alext@mckinsey.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent ba417c1 commit 9b3d213

File tree

8 files changed

+749
-22
lines changed

8 files changed

+749
-22
lines changed

charts/mlrun-ce/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
apiVersion: v1
22
name: mlrun-ce
3-
version: 0.11.0-rc.12
3+
version: 0.11.0-rc.13
44
description: MLRun Open Source Stack
55
home: https://iguazio.com
66
icon: https://www.iguazio.com/wp-content/uploads/2019/10/Iguazio-Logo.png

charts/mlrun-ce/admin_installation_values.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,26 @@ seaweedfs:
4040
enabled: false
4141

4242
spark-operator:
43+
enabled: true
44+
fullnameOverride: spark-operator
45+
controller:
46+
replicas: 0 # No running pods in admin
47+
rbac:
48+
create: true # Creates ClusterRole (shared by all user namespaces)
49+
serviceAccount:
50+
create: true
51+
webhook:
52+
enable: true
53+
replicas: 1
54+
spark:
55+
jobNamespaces:
56+
- "" # All namespaces (no namespaceSelector on webhook)
57+
serviceAccount:
58+
create: false # No sparkapp SA in admin
59+
rbac:
60+
create: false
61+
62+
spark:
4363
enabled: false
4464

4565
pipelines:

charts/mlrun-ce/non_admin_cluster_ip_installation_values.yaml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,29 @@ timescaledb:
4444
nodePort: ""
4545

4646
spark-operator:
47-
enabled: false
47+
enabled: true
48+
fullnameOverride: spark-operator
49+
controller:
50+
replicas: 1
51+
rbac:
52+
create: false
53+
serviceAccount:
54+
create: true
55+
leaderElection:
56+
enable: true
57+
webhook:
58+
enable: false
59+
spark:
60+
jobNamespaces:
61+
- mlrun
62+
serviceAccount:
63+
create: true
64+
name: sparkapp
65+
rbac:
66+
create: true
67+
68+
spark:
69+
enabled: true
4870

4971
pipelines:
5072
service:

charts/mlrun-ce/non_admin_installation_values.yaml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,29 @@ seaweedfs:
3838
enabled: true
3939

4040
spark-operator:
41-
enabled: false
41+
enabled: true
42+
fullnameOverride: spark-operator
43+
controller:
44+
replicas: 1 # Controller runs in user namespace
45+
rbac:
46+
create: false # ClusterRole already exists from admin
47+
serviceAccount:
48+
create: true
49+
leaderElection:
50+
enable: true
51+
webhook:
52+
enable: false
53+
spark:
54+
jobNamespaces:
55+
- mlrun # Override with actual namespace at install time
56+
serviceAccount:
57+
create: true
58+
name: sparkapp
59+
rbac:
60+
create: true # Creates sparkapp Role + RoleBinding
61+
62+
spark:
63+
enabled: true
4264

4365
pipelines:
4466
service:

charts/mlrun-ce/templates/config/mlrun-spark-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{{- if index .Values "spark-operator" "enabled" -}}
1+
{{- if .Values.spark.enabled -}}
22
apiVersion: v1
33
kind: ConfigMap
44
metadata:
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
{{- $sparkOp := index .Values "spark-operator" -}}
2+
{{- $rbacCreate := true -}}
3+
{{- if hasKey $sparkOp "controller" -}}
4+
{{- if hasKey $sparkOp.controller "rbac" -}}
5+
{{- $rbacCreate = $sparkOp.controller.rbac.create -}}
6+
{{- end -}}
7+
{{- end -}}
8+
{{- if and $sparkOp.enabled (not $rbacCreate) -}}
9+
{{- /*
10+
This template renders only in user multi-NS mode:
11+
- spark-operator subchart is enabled (controller Deployment runs here)
12+
- controller.rbac.create is false (ClusterRole already exists from admin namespace)
13+
14+
It creates:
15+
1. RoleBinding: controller SA → shared ClusterRole (namespace-scoped access)
16+
2. Role + RoleBinding: leader election leases (coordination.k8s.io)
17+
*/ -}}
18+
---
19+
# RoleBinding: Grant controller SA access to the shared ClusterRole (namespace-scoped)
20+
apiVersion: rbac.authorization.k8s.io/v1
21+
kind: RoleBinding
22+
metadata:
23+
name: spark-operator-controller
24+
labels:
25+
app.kubernetes.io/name: mlrun-ce
26+
app.kubernetes.io/component: spark-controller-rbac
27+
app.kubernetes.io/managed-by: {{ .Release.Name }}
28+
subjects:
29+
- kind: ServiceAccount
30+
name: spark-operator-controller
31+
namespace: {{ .Release.Namespace }}
32+
roleRef:
33+
kind: ClusterRole
34+
name: spark-operator-controller
35+
apiGroup: rbac.authorization.k8s.io
36+
---
37+
# Role: Leader election leases
38+
apiVersion: rbac.authorization.k8s.io/v1
39+
kind: Role
40+
metadata:
41+
name: spark-operator-controller-leases
42+
labels:
43+
app.kubernetes.io/name: mlrun-ce
44+
app.kubernetes.io/component: spark-controller-rbac
45+
app.kubernetes.io/managed-by: {{ .Release.Name }}
46+
rules:
47+
- apiGroups: ["coordination.k8s.io"]
48+
resources: ["leases"]
49+
verbs: ["create", "get", "update"]
50+
---
51+
# RoleBinding: Grant controller SA access to leader election leases
52+
apiVersion: rbac.authorization.k8s.io/v1
53+
kind: RoleBinding
54+
metadata:
55+
name: spark-operator-controller-leases
56+
labels:
57+
app.kubernetes.io/name: mlrun-ce
58+
app.kubernetes.io/component: spark-controller-rbac
59+
app.kubernetes.io/managed-by: {{ .Release.Name }}
60+
subjects:
61+
- kind: ServiceAccount
62+
name: spark-operator-controller
63+
namespace: {{ .Release.Namespace }}
64+
roleRef:
65+
kind: Role
66+
name: spark-operator-controller-leases
67+
apiGroup: rbac.authorization.k8s.io
68+
{{- end }}

charts/mlrun-ce/values.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -645,3 +645,11 @@ kafka:
645645
# Empty means "use the release namespace"
646646
# Example: "controller" if that's where you installed the operator
647647
operatorNamespace: ""
648+
649+
# Spark configuration for multi-NS deployments
650+
# Controls CE-level spark resources (mlrun-spark-config ConfigMap)
651+
# In single-NS mode, both spark.enabled and spark-operator.enabled are true
652+
# In multi-NS admin mode, spark.enabled is false (no ConfigMap needed)
653+
# In multi-NS user mode, spark.enabled is true (ConfigMap needed for MLRun)
654+
spark:
655+
enabled: true

0 commit comments

Comments
 (0)