Skip to content
This repository was archived by the owner on Jan 9, 2020. It is now read-only.

Commit d835b6a

Browse files
tnachenfoxish
authored andcommitted
Allow docker image pull policy to be configurable (#328)
* Allow docker image pull policy to be configurable * Add flag documentation * Update running-on-kubernetes.md
1 parent c325691 commit d835b6a

File tree

8 files changed

+26
-5
lines changed

8 files changed

+26
-5
lines changed

docs/running-on-kubernetes.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,13 @@ from the other deployment modes. See the [configuration page](configuration.html
661661
Interval between reports of the current Spark job status in cluster mode.
662662
</td>
663663
</tr>
664+
<tr>
665+
<td><code>spark.kubernetes.docker.image.pullPolicy</code></td>
666+
<td><code>IfNotPresent</code></td>
667+
<td>
668+
Docker image pull policy used when pulling Docker images with Kubernetes.
669+
</td>
670+
</tr>
664671
</table>
665672

666673

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/kubernetes/SparkPodInitContainerBootstrap.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ private[spark] trait SparkPodInitContainerBootstrap {
3636

3737
private[spark] class SparkPodInitContainerBootstrapImpl(
3838
initContainerImage: String,
39+
dockerImagePullPolicy: String,
3940
jarsDownloadPath: String,
4041
filesDownloadPath: String,
4142
downloadTimeoutMinutes: Long,
@@ -60,7 +61,7 @@ private[spark] class SparkPodInitContainerBootstrapImpl(
6061
val initContainer = new ContainerBuilder()
6162
.withName(s"spark-init")
6263
.withImage(initContainerImage)
63-
.withImagePullPolicy("IfNotPresent")
64+
.withImagePullPolicy(dockerImagePullPolicy)
6465
.addNewVolumeMount()
6566
.withName(INIT_CONTAINER_PROPERTIES_FILE_VOLUME)
6667
.withMountPath(INIT_CONTAINER_PROPERTIES_FILE_DIR)

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/kubernetes/config.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ package object config extends Logging {
4747
.stringConf
4848
.createWithDefault(s"spark-executor:$sparkVersion")
4949

50+
private[spark] val DOCKER_IMAGE_PULL_POLICY =
51+
ConfigBuilder("spark.kubernetes.docker.image.pullPolicy")
52+
.doc("Docker image pull policy when pulling any docker image in Kubernetes integration")
53+
.stringConf
54+
.createWithDefault("IfNotPresent")
55+
5056
private[spark] val APISERVER_AUTH_SUBMISSION_CONF_PREFIX =
5157
"spark.kubernetes.authenticate.submission"
5258
private[spark] val APISERVER_AUTH_DRIVER_CONF_PREFIX =

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/kubernetes/submit/Client.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ private[spark] class Client(
6060
private val kubernetesDriverPodName = sparkConf.get(KUBERNETES_DRIVER_POD_NAME)
6161
.getOrElse(kubernetesAppId)
6262
private val driverDockerImage = sparkConf.get(DRIVER_DOCKER_IMAGE)
63+
private val dockerImagePullPolicy = sparkConf.get(DOCKER_IMAGE_PULL_POLICY)
6364
private val driverMemoryMb = sparkConf.get(org.apache.spark.internal.config.DRIVER_MEMORY)
6465
private val memoryOverheadMb = sparkConf
6566
.get(KUBERNETES_DRIVER_MEMORY_OVERHEAD)
@@ -99,7 +100,7 @@ private[spark] class Client(
99100
val driverContainer = new ContainerBuilder()
100101
.withName(DRIVER_CONTAINER_NAME)
101102
.withImage(driverDockerImage)
102-
.withImagePullPolicy("IfNotPresent")
103+
.withImagePullPolicy(dockerImagePullPolicy)
103104
.addToEnv(driverExtraClasspathEnv.toSeq: _*)
104105
.addNewEnv()
105106
.withName(ENV_DRIVER_MEMORY)

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/kubernetes/submit/DriverInitContainerComponentsProvider.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ private[spark] class DriverInitContainerComponentsProviderImpl(
104104
private val configMapName = s"$kubernetesAppId-init-config"
105105
private val configMapKey = s"$kubernetesAppId-init-config-key"
106106
private val initContainerImage = sparkConf.get(INIT_CONTAINER_DOCKER_IMAGE)
107+
private val dockerImagePullPolicy = sparkConf.get(DOCKER_IMAGE_PULL_POLICY)
107108
private val downloadTimeoutMinutes = sparkConf.get(INIT_CONTAINER_MOUNT_TIMEOUT)
108109

109110
override def provideInitContainerConfigMapBuilder(
@@ -196,6 +197,7 @@ private[spark] class DriverInitContainerComponentsProviderImpl(
196197
}
197198
new SparkPodInitContainerBootstrapImpl(
198199
initContainerImage,
200+
dockerImagePullPolicy,
199201
jarsDownloadPath,
200202
filesDownloadPath,
201203
downloadTimeoutMinutes,

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/scheduler/cluster/kubernetes/KubernetesClusterManager.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ private[spark] class KubernetesClusterManager extends ExternalClusterManager wit
4646
val maybeExecutorInitContainerSecretName =
4747
sparkConf.get(EXECUTOR_INIT_CONTAINER_SECRET)
4848
val maybeExecutorInitContainerSecretMount =
49-
sparkConf.get(EXECUTOR_INIT_CONTAINER_SECRET_MOUNT_DIR)
49+
sparkConf.get(EXECUTOR_INIT_CONTAINER_SECRET_MOUNT_DIR)
5050
val executorInitContainerSecretVolumePlugin = for {
5151
initContainerSecretName <- maybeExecutorInitContainerSecretName
5252
initContainerSecretMountPath <- maybeExecutorInitContainerSecretMount
@@ -65,6 +65,7 @@ private[spark] class KubernetesClusterManager extends ExternalClusterManager wit
6565
} yield {
6666
new SparkPodInitContainerBootstrapImpl(
6767
sparkConf.get(INIT_CONTAINER_DOCKER_IMAGE),
68+
sparkConf.get(DOCKER_IMAGE_PULL_POLICY),
6869
sparkConf.get(INIT_CONTAINER_JARS_DOWNLOAD_LOCATION),
6970
sparkConf.get(INIT_CONTAINER_FILES_DOWNLOAD_LOCATION),
7071
sparkConf.get(INIT_CONTAINER_MOUNT_TIMEOUT),
@@ -95,4 +96,3 @@ private[spark] class KubernetesClusterManager extends ExternalClusterManager wit
9596
scheduler.asInstanceOf[TaskSchedulerImpl].initialize(backend)
9697
}
9798
}
98-

resource-managers/kubernetes/core/src/main/scala/org/apache/spark/scheduler/cluster/kubernetes/KubernetesClusterSchedulerBackend.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ private[spark] class KubernetesClusterSchedulerBackend(
7777

7878
private var shufflePodCache: Option[ShufflePodCache] = None
7979
private val executorDockerImage = conf.get(EXECUTOR_DOCKER_IMAGE)
80+
private val dockerImagePullPolicy = conf.get(DOCKER_IMAGE_PULL_POLICY)
8081
private val kubernetesNamespace = conf.get(KUBERNETES_NAMESPACE)
8182
private val executorPort = conf.getInt("spark.executor.port", DEFAULT_STATIC_PORT)
8283
private val blockmanagerPort = conf
@@ -354,7 +355,7 @@ private[spark] class KubernetesClusterSchedulerBackend(
354355
.addNewContainer()
355356
.withName(s"executor")
356357
.withImage(executorDockerImage)
357-
.withImagePullPolicy("IfNotPresent")
358+
.withImagePullPolicy(dockerImagePullPolicy)
358359
.withNewResources()
359360
.addToRequests("memory", executorMemoryQuantity)
360361
.addToLimits("memory", executorMemoryLimitQuantity)

resource-managers/kubernetes/core/src/test/scala/org/apache/spark/deploy/kubernetes/SparkPodInitContainerBootstrapSuite.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.apache.spark.deploy.kubernetes.constants._
2727
class SparkPodInitContainerBootstrapSuite extends SparkFunSuite with BeforeAndAfter {
2828
private val OBJECT_MAPPER = new ObjectMapper()
2929
private val INIT_CONTAINER_IMAGE = "spark-init:latest"
30+
private val DOCKER_IMAGE_PULL_POLICY = "IfNotPresent"
3031
private val JARS_DOWNLOAD_PATH = "/var/data/spark-jars"
3132
private val FILES_DOWNLOAD_PATH = "/var/data/spark-files"
3233
private val DOWNLOAD_TIMEOUT_MINUTES = 5
@@ -137,6 +138,7 @@ class SparkPodInitContainerBootstrapSuite extends SparkFunSuite with BeforeAndAf
137138
private def bootstrapPodWithoutSubmittedDependencies(): Pod = {
138139
val bootstrapUnderTest = new SparkPodInitContainerBootstrapImpl(
139140
INIT_CONTAINER_IMAGE,
141+
DOCKER_IMAGE_PULL_POLICY,
140142
JARS_DOWNLOAD_PATH,
141143
FILES_DOWNLOAD_PATH,
142144
DOWNLOAD_TIMEOUT_MINUTES,
@@ -150,6 +152,7 @@ class SparkPodInitContainerBootstrapSuite extends SparkFunSuite with BeforeAndAf
150152
private def bootstrapPodWithSubmittedDependencies(): Pod = {
151153
val bootstrapUnderTest = new SparkPodInitContainerBootstrapImpl(
152154
INIT_CONTAINER_IMAGE,
155+
DOCKER_IMAGE_PULL_POLICY,
153156
JARS_DOWNLOAD_PATH,
154157
FILES_DOWNLOAD_PATH,
155158
DOWNLOAD_TIMEOUT_MINUTES,

0 commit comments

Comments
 (0)