This is an automated email from the ASF dual-hosted git repository. dongjoon pushed a commit to branch branch-3.0 in repository https://gitbox.apache.org/repos/asf/spark.git
The following commit(s) were added to refs/heads/branch-3.0 by this push: new 541d451 [SPARK-31696][K8S] Support driver service annotation in K8S 541d451 is described below commit 541d451cd7062f04e53d93719034877f27452a3e Author: Dongjoon Hyun <dongj...@apache.org> AuthorDate: Wed May 13 13:59:42 2020 -0700 [SPARK-31696][K8S] Support driver service annotation in K8S ### What changes were proposed in this pull request? This PR aims to add `spark.kubernetes.driver.service.annotation` like `spark.kubernetes.driver.service.annotation`. ### Why are the changes needed? Annotations are used in many ways. One example is that Prometheus monitoring system search metric endpoint via annotation. - https://github.com/helm/charts/tree/master/stable/prometheus#scraping-pod-metrics-via-annotations ### Does this PR introduce _any_ user-facing change? Yes. The documentation is added. ### How was this patch tested? Pass Jenkins with the updated unit tests. Closes #28518 from dongjoon-hyun/SPARK-31696. Authored-by: Dongjoon Hyun <dongj...@apache.org> Signed-off-by: Dongjoon Hyun <dongj...@apache.org> (cherry picked from commit c8f3bd861d96cf3f7b01cd9f864c181a57e1c77a) Signed-off-by: Dongjoon Hyun <dongj...@apache.org> --- docs/running-on-kubernetes.md | 13 +++++++++++-- .../src/main/scala/org/apache/spark/deploy/k8s/Config.scala | 1 + .../scala/org/apache/spark/deploy/k8s/KubernetesConf.scala | 5 +++++ .../deploy/k8s/features/DriverServiceFeatureStep.scala | 1 + .../org/apache/spark/deploy/k8s/KubernetesTestConf.scala | 2 ++ .../deploy/k8s/features/DriverServiceFeatureStepSuite.scala | 13 +++++++++++-- 6 files changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/running-on-kubernetes.md b/docs/running-on-kubernetes.md index 4f228a5..2739149 100644 --- a/docs/running-on-kubernetes.md +++ b/docs/running-on-kubernetes.md @@ -803,12 +803,21 @@ See the [configuration page](configuration.html) for information on Spark config <td><code>spark.kubernetes.driver.annotation.[AnnotationName]</code></td> <td>(none)</td> <td> - Add the annotation specified by <code>AnnotationName</code> to the driver pod. + Add the Kubernetes <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/">annotation</a> specified by <code>AnnotationName</code> to the driver pod. For example, <code>spark.kubernetes.driver.annotation.something=true</code>. </td> <td>2.3.0</td> </tr> <tr> + <td><code>spark.kubernetes.driver.service.annotation.[AnnotationName]</code></td> + <td>(none)</td> + <td> + Add the Kubernetes <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/">annotation</a> specified by <code>AnnotationName</code> to the driver service. + For example, <code>spark.kubernetes.driver.service.annotation.something=true</code>. + </td> + <td>3.1.0</td> +</tr> +<tr> <td><code>spark.kubernetes.executor.label.[LabelName]</code></td> <td>(none)</td> <td> @@ -823,7 +832,7 @@ See the [configuration page](configuration.html) for information on Spark config <td><code>spark.kubernetes.executor.annotation.[AnnotationName]</code></td> <td>(none)</td> <td> - Add the annotation specified by <code>AnnotationName</code> to the executor pods. + Add the Kubernetes <a href="https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/">annotation</a> specified by <code>AnnotationName</code> to the executor pods. For example, <code>spark.kubernetes.executor.annotation.something=true</code>. </td> <td>2.3.0</td> diff --git a/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/Config.scala b/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/Config.scala index 8684a60..22f4c75 100644 --- a/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/Config.scala +++ b/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/Config.scala @@ -411,6 +411,7 @@ private[spark] object Config extends Logging { val KUBERNETES_DRIVER_LABEL_PREFIX = "spark.kubernetes.driver.label." val KUBERNETES_DRIVER_ANNOTATION_PREFIX = "spark.kubernetes.driver.annotation." + val KUBERNETES_DRIVER_SERVICE_ANNOTATION_PREFIX = "spark.kubernetes.driver.service.annotation." val KUBERNETES_DRIVER_SECRETS_PREFIX = "spark.kubernetes.driver.secrets." val KUBERNETES_DRIVER_SECRET_KEY_REF_PREFIX = "spark.kubernetes.driver.secretKeyRef." val KUBERNETES_DRIVER_VOLUMES_PREFIX = "spark.kubernetes.driver.volumes." 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 09943b7..6dcae3e 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 @@ -106,6 +106,11 @@ private[spark] class KubernetesDriverConf( KubernetesUtils.parsePrefixedKeyValuePairs(sparkConf, KUBERNETES_DRIVER_ANNOTATION_PREFIX) } + def serviceAnnotations: Map[String, String] = { + KubernetesUtils.parsePrefixedKeyValuePairs(sparkConf, + KUBERNETES_DRIVER_SERVICE_ANNOTATION_PREFIX) + } + override def secretNamesToMountPaths: Map[String, String] = { KubernetesUtils.parsePrefixedKeyValuePairs(sparkConf, KUBERNETES_DRIVER_SECRETS_PREFIX) } diff --git a/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStep.scala b/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStep.scala index 925bcdf..1e9c60c 100644 --- a/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStep.scala +++ b/resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStep.scala @@ -69,6 +69,7 @@ private[spark] class DriverServiceFeatureStep( val driverService = new ServiceBuilder() .withNewMetadata() .withName(resolvedServiceName) + .addToAnnotations(kubernetesConf.serviceAnnotations.asJava) .endMetadata() .withNewSpec() .withClusterIP("None") diff --git a/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/KubernetesTestConf.scala b/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/KubernetesTestConf.scala index ee830a9..7763b11 100644 --- a/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/KubernetesTestConf.scala +++ b/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/KubernetesTestConf.scala @@ -48,6 +48,7 @@ object KubernetesTestConf { labels: Map[String, String] = Map.empty, environment: Map[String, String] = Map.empty, annotations: Map[String, String] = Map.empty, + serviceAnnotations: Map[String, String] = Map.empty, secretEnvNamesToKeyRefs: Map[String, String] = Map.empty, secretNamesToMountPaths: Map[String, String] = Map.empty, volumes: Seq[KubernetesVolumeSpec] = Seq.empty): KubernetesDriverConf = { @@ -59,6 +60,7 @@ object KubernetesTestConf { setPrefixedConfigs(conf, KUBERNETES_DRIVER_LABEL_PREFIX, labels) setPrefixedConfigs(conf, KUBERNETES_DRIVER_ENV_PREFIX, environment) setPrefixedConfigs(conf, KUBERNETES_DRIVER_ANNOTATION_PREFIX, annotations) + setPrefixedConfigs(conf, KUBERNETES_DRIVER_SERVICE_ANNOTATION_PREFIX, serviceAnnotations) setPrefixedConfigs(conf, KUBERNETES_DRIVER_SECRETS_PREFIX, secretNamesToMountPaths) setPrefixedConfigs(conf, KUBERNETES_DRIVER_SECRET_KEY_REF_PREFIX, secretEnvNamesToKeyRefs) setVolumeSpecs(conf, KUBERNETES_DRIVER_VOLUMES_PREFIX, volumes) diff --git a/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStepSuite.scala b/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStepSuite.scala index 9068289..18afd10 100644 --- a/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStepSuite.scala +++ b/resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/k8s/features/DriverServiceFeatureStepSuite.scala @@ -38,6 +38,9 @@ class DriverServiceFeatureStepSuite extends SparkFunSuite { private val DRIVER_LABELS = Map( "label1key" -> "label1value", "label2key" -> "label2value") + private val DRIVER_SERVICE_ANNOTATIONS = Map( + "annotation1key" -> "annotation1value", + "annotation2key" -> "annotation2value") test("Headless service has a port for the driver RPC, the block manager and driver ui.") { val sparkConf = new SparkConf(false) @@ -46,7 +49,8 @@ class DriverServiceFeatureStepSuite extends SparkFunSuite { .set(UI_PORT, 4080) val kconf = KubernetesTestConf.createDriverConf( sparkConf = sparkConf, - labels = DRIVER_LABELS) + labels = DRIVER_LABELS, + serviceAnnotations = DRIVER_SERVICE_ANNOTATIONS) val configurationStep = new DriverServiceFeatureStep(kconf) assert(configurationStep.configurePod(SparkPod.initialPod()) === SparkPod.initialPod()) assert(configurationStep.getAdditionalKubernetesResources().size === 1) @@ -79,7 +83,9 @@ class DriverServiceFeatureStepSuite extends SparkFunSuite { } test("Ports should resolve to defaults in SparkConf and in the service.") { - val kconf = KubernetesTestConf.createDriverConf(labels = DRIVER_LABELS) + val kconf = KubernetesTestConf.createDriverConf( + labels = DRIVER_LABELS, + serviceAnnotations = DRIVER_SERVICE_ANNOTATIONS) val configurationStep = new DriverServiceFeatureStep(kconf) val resolvedService = configurationStep .getAdditionalKubernetesResources() @@ -164,6 +170,9 @@ class DriverServiceFeatureStepSuite extends SparkFunSuite { DRIVER_LABELS.foreach { case (k, v) => assert(service.getSpec.getSelector.get(k) === v) } + DRIVER_SERVICE_ANNOTATIONS.foreach { case (k, v) => + assert(service.getMetadata.getAnnotations.get(k) === v) + } assert(service.getSpec.getPorts.size() === 3) val driverServicePorts = service.getSpec.getPorts.asScala assert(driverServicePorts.head.getName === DRIVER_PORT_NAME) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@spark.apache.org For additional commands, e-mail: commits-h...@spark.apache.org