diff --git a/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/KubernetesConf.scala b/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/KubernetesConf.scala index 087eeee277..937c5f5d8f 100644 --- a/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/KubernetesConf.scala +++ b/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/KubernetesConf.scala @@ -230,9 +230,7 @@ private[spark] object KubernetesConf { s"$appName-$id" .trim .toLowerCase(Locale.ROOT) - .replaceAll("\\s+", "-") - .replaceAll("\\.", "-") - .replaceAll("[^a-z0-9\\-]", "") + .replaceAll("[^a-z0-9\\-]", "-") .replaceAll("-+", "-") } diff --git a/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/BasicExecutorFeatureStepSuite.scala b/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/BasicExecutorFeatureStepSuite.scala index b7c97bb9a6..1aa34aa7e9 100644 --- a/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/BasicExecutorFeatureStepSuite.scala +++ b/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/BasicExecutorFeatureStepSuite.scala @@ -370,6 +370,29 @@ class BasicExecutorFeatureStepSuite extends SparkFunSuite with BeforeAndAfter { } } + test("SPARK-35969: Make the pod prefix more readable and tallied with K8S DNS Label Names") { + baseConf.remove(KUBERNETES_EXECUTOR_POD_NAME_PREFIX) + baseConf.set("spark.app.name", "xyz.abc _i_am_a_app_name_w/_some_abbrs") + val baseDriverPod = SparkPod.initialPod() + val step1 = new BasicExecutorFeatureStep(newExecutorConf(), new SecurityManager(baseConf), + defaultProfile) + val podConfigured1 = step1.configurePod(baseDriverPod) + assert(podConfigured1.pod.getMetadata.getName + .startsWith("xyz-abc-i-am-a-app-name-w-some-abbrs")) + + // scalastyle:off nonascii + baseConf.set("spark.app.name", "time.is the#most¥valuable_—thing。it's&about?time.") + // scalastyle:on + + val step2 = new BasicExecutorFeatureStep(newExecutorConf(), new SecurityManager(baseConf), + defaultProfile) + + val podConfigured2 = step2.configurePod(baseDriverPod) + assert(podConfigured2.pod.getMetadata.getName + .startsWith("time-is-the-most-valuable-thing-it-s-about-time-")) + + } + // There is always exactly one controller reference, and it points to the driver pod. private def checkOwnerReferences(executor: Pod, driverPodUid: String): Unit = { assert(executor.getMetadata.getOwnerReferences.size() === 1)