This is an automated email from the ASF dual-hosted git repository.
dongjoon pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/spark-kubernetes-operator.git
The following commit(s) were added to refs/heads/main by this push:
new c13e6ce [SPARK-55190] Improve `ClusterInitStep` to use Server-Side
Apply APIs
c13e6ce is described below
commit c13e6ce712d8c4b225e29304f9abba11dc786d25
Author: Dongjoon Hyun <[email protected]>
AuthorDate: Mon Jan 26 16:27:36 2026 +0900
[SPARK-55190] Improve `ClusterInitStep` to use Server-Side Apply APIs
### What changes were proposed in this pull request?
This PR aims to improve `ClusterInitStep` to use `Server-Side Apply` APIs
instead of `Client-Side Apply` APIs to improve operational stability of
`SparkCluster` resources.
```java
- .create();
+ .forceConflicts()
+ .serverSideApply();
```
### Why are the changes needed?
Since K8s v1.22, `Server-Side Apply` is stably enabled by default.
- https://kubernetes.io/docs/reference/using-api/server-side-apply/
### Does this PR introduce _any_ user-facing change?
No user-facing behavior changing.
### How was this patch tested?
Pass the CIs.
### Was this patch authored or co-authored using generative AI tooling?
No.
Closes #471 from dongjoon-hyun/SPARK-55190.
Authored-by: Dongjoon Hyun <[email protected]>
Signed-off-by: Dongjoon Hyun <[email protected]>
---
.../reconciler/reconcilesteps/ClusterInitStep.java | 34 +++++++++++++++++-----
1 file changed, 27 insertions(+), 7 deletions(-)
diff --git
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/ClusterInitStep.java
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/ClusterInitStep.java
index b3b38c4..75d7474 100644
---
a/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/ClusterInitStep.java
+++
b/spark-operator/src/main/java/org/apache/spark/k8s/operator/reconciler/reconcilesteps/ClusterInitStep.java
@@ -69,15 +69,33 @@ public class ClusterInitStep extends ClusterReconcileStep {
}
try {
Service masterService = context.getMasterServiceSpec();
- context.getClient().services().resource(masterService).create();
+
context.getClient().services().resource(masterService).forceConflicts().serverSideApply();
Service workerService = context.getWorkerServiceSpec();
- context.getClient().services().resource(workerService).create();
+
context.getClient().services().resource(workerService).forceConflicts().serverSideApply();
StatefulSet masterStatefulSet = context.getMasterStatefulSetSpec();
-
context.getClient().apps().statefulSets().resource(masterStatefulSet).create();
+ context
+ .getClient()
+ .apps()
+ .statefulSets()
+ .resource(masterStatefulSet)
+ .forceConflicts()
+ .serverSideApply();
StatefulSet workerStatefulSet = context.getWorkerStatefulSetSpec();
-
context.getClient().apps().statefulSets().resource(workerStatefulSet).create();
+ context
+ .getClient()
+ .apps()
+ .statefulSets()
+ .resource(workerStatefulSet)
+ .forceConflicts()
+ .serverSideApply();
NetworkPolicy workerNetworkPolicy = context.getWorkerNetworkPolicySpec();
-
context.getClient().network().networkPolicies().resource(workerNetworkPolicy).create();
+ context
+ .getClient()
+ .network()
+ .networkPolicies()
+ .resource(workerNetworkPolicy)
+ .forceConflicts()
+ .serverSideApply();
var horizontalPodAutoscaler = context.getHorizontalPodAutoscalerSpec();
if (horizontalPodAutoscaler.isPresent()) {
context
@@ -86,7 +104,8 @@ public class ClusterInitStep extends ClusterReconcileStep {
.v2()
.horizontalPodAutoscalers()
.resource(horizontalPodAutoscaler.get())
- .create();
+ .forceConflicts()
+ .serverSideApply();
}
var podDisruptionBudget = context.getPodDisruptionBudgetSpec();
if (podDisruptionBudget.isPresent()) {
@@ -96,7 +115,8 @@ public class ClusterInitStep extends ClusterReconcileStep {
.v1()
.podDisruptionBudget()
.resource(podDisruptionBudget.get())
- .create();
+ .forceConflicts()
+ .serverSideApply();
}
ClusterStatus updatedStatus =
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]