[ 
https://issues.apache.org/jira/browse/SPARK-58910?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Yang Jie updated SPARK-58910:
-----------------------------
    Affects Version/s: 4.0.0
                           (was: 5.0.0)

> Executor pod template's serviceAccountName is overwritten when a service 
> account is configured
> ----------------------------------------------------------------------------------------------
>
>                 Key: SPARK-58910
>                 URL: https://issues.apache.org/jira/browse/SPARK-58910
>             Project: Spark
>          Issue Type: Bug
>          Components: Kubernetes
>    Affects Versions: 4.0.0
>            Reporter: Yang Jie
>            Priority: Major
>
> {{ExecutorKubernetesCredentialsFeatureStep.configurePod}} decides whether the 
> executor pod already carries a service account by reading a single field:
> {code:scala}
> pod = if (Option(pod.pod.getSpec.getServiceAccount).isEmpty) {
>   buildPodWithServiceAccount(executorServiceAccount
>     .orElse(driverServiceAccount), pod).getOrElse(pod.pod)
> } else {
>   pod.pod
> }
> {code}
> {{serviceAccount}} is the field Kubernetes marks as deprecated. 
> {{serviceAccountName}} is the current one, and on {{PodSpec}} the two are 
> independent fields with their own setters. 
> {{KubernetesUtils.loadPodFromTemplate}} deserializes a pod template 
> client-side, without the defaulting an API server would apply, so a template 
> naming only {{serviceAccountName}} leaves {{serviceAccount}} null.
> The guard therefore reads such a template as having no service account at all 
> and calls {{buildPodWithServiceAccount}}, which writes both fields:
> {code:scala}
> new PodBuilder(pod.pod)
>   .editOrNewSpec()
>     .withServiceAccount(account)
>     .withServiceAccountName(account)
> {code}
> The template's account is replaced and the executors run under a different 
> identity from the one the template asked for. That is the opposite of what 
> the step's own comment promises: "if not setup by the pod template, fallback 
> to the executor's sa".
> h3. Reproduction
> Executor pod template:
> {code:yaml}
> spec:
>   serviceAccountName: team-sa
> {code}
> Submitted with:
> {code}
> --conf 
> spark.kubernetes.executor.podTemplateFile=/path/to/executor-template.yaml
> --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark
> {code}
> The executor pods run as {{spark}}, not {{team-sa}}. Using 
> {{spark.kubernetes.authenticate.executor.serviceAccountName}} instead gives 
> the same result. With neither config set, {{buildPodWithServiceAccount}} 
> returns {{None}} and the template value survives, so reaching the bug takes 
> both a template that names the account and a configured account.
> Writing {{serviceAccount}} in the template, or both fields, behaves 
> correctly, since then the guard sees the account and takes the {{else}} 
> branch.
> h3. Why the current tests do not catch it
> The three cases in {{ExecutorKubernetesCredentialsFeatureStepSuite}} all 
> start from {{SparkPod.initialPod()}} with an empty {{SparkConf}}, so both 
> spec fields are null and the {{isEmpty}} branch always wins. None of them 
> pre-sets an account on the pod. A case whose pod names only 
> {{serviceAccountName}} fails today.
> h3. Suggested fix
> Read both fields, as SPARK-58872 does on the driver side:
> {code:scala}
> val spec = pod.pod.getSpec
> val existing = Option(spec.getServiceAccountName).filter(_.nonEmpty)
>   .orElse(Option(spec.getServiceAccount).filter(_.nonEmpty))
> {code}
> The empty-string filter matches {{SetDefaults_PodSpec}} in 
> {{pkg/apis/core/v1/defaults.go}}, which treats an empty 
> {{serviceAccountName}} as unset and copies the deprecated alias up.
> h3. History
> The guard arrived with SPARK-27872 ({{7912ab85a6f}}, 2019). SPARK-30122 
> ({{f9f06eee985}}) later added the fallback to the driver's account. The pod 
> template override table in {{docs/running-on-kubernetes.md}} states that 
> Spark overrides {{serviceAccount}} and {{serviceAccountName}} on driver pods 
> only and that executor pods remain unaffected, which holds except in this 
> case.
> Found while reviewing SPARK-58872, which fixes the same single-field read on 
> the driver side. There the consequence is only a spurious warning; here the 
> executors change identity.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to