You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spark.apache.org by do...@apache.org on 2020/05/14 17:15:54 UTC
[spark] branch branch-3.0 updated: [SPARK-31696][K8S] Support
driver service annotation in K8S
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 <do...@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 <do...@apache.org>
Signed-off-by: Dongjoon Hyun <do...@apache.org>
(cherry picked from commit c8f3bd861d96cf3f7b01cd9f864c181a57e1c77a)
Signed-off-by: Dongjoon Hyun <do...@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-unsubscribe@spark.apache.org
For additional commands, e-mail: commits-help@spark.apache.org