Skip to content
This repository was archived by the owner on Jan 9, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
81 commits
Select commit Hold shift + click to select a range
2ffed59
[SPARK-18278] Minimal support for submitting to Kubernetes.
mccheah Dec 6, 2016
00e545f
Fix style
mccheah Dec 6, 2016
cdbd9bb
Make naming more consistent
mccheah Dec 7, 2016
8f69fc0
Fix building assembly with Kubernetes.
mccheah Dec 9, 2016
75c6086
Service account support, use constants from fabric8 library.
mccheah Dec 10, 2016
93b75ce
Some small changes
mccheah Jan 7, 2017
e7397e8
Use k8s:// formatted URL instead of separate setting.
mccheah Jan 9, 2017
ed65428
Reindent comment to conforn to JavaDoc style
foxish Jan 9, 2017
f9ddb63
Move kubernetes under resource-managers folder.
mccheah Jan 9, 2017
178abc1
Use tar and gzip to compress+archive shipped jars (#2)
mccheah Jan 11, 2017
e2787e8
Use alpine and java 8 for docker images. (#10)
mccheah Jan 12, 2017
acceb72
Copy the Dockerfiles from docker-minimal-bundle into the distribution…
mccheah Jan 12, 2017
24f4bf0
inherit IO (#13)
foxish Jan 12, 2017
adcc906
Error messages when the driver container fails to start. (#11)
mccheah Jan 13, 2017
0b81dbf
Fix linter error to make CI happy (#18)
foxish Jan 13, 2017
e70f427
Documentation for the current state of the world (#16)
mccheah Jan 13, 2017
b25bc8b
Development workflow documentation for the current state of the world…
mccheah Jan 13, 2017
761b317
Added service name as prefix to executor pods (#14)
foxish Jan 13, 2017
8739b41
Add kubernetes profile to travis CI yml file (#21)
kimoonkim Jan 14, 2017
928e00e
Improved the example commands in running-on-k8s document. (#25)
lins05 Jan 17, 2017
3e3c4d4
Fix spacing for command highlighting (#31)
foxish Jan 18, 2017
36c4e94
Support custom labels on the driver pod. (#27)
mccheah Jan 19, 2017
b6c57c7
Make pod name unique using the submission timestamp (#32)
foxish Jan 19, 2017
3fd9c62
A number of small tweaks to the MVP. (#23)
mccheah Jan 24, 2017
81875a6
Correct hadoop profile: hadoop2.7 -> hadoop-2.7 (#41)
ash211 Jan 25, 2017
2a26ebd
Support setting the driver pod launching timeout. (#36)
lins05 Jan 25, 2017
b98c852
Sanitize kubernetesAppId for use in secret, service, and pod names (#45)
ash211 Jan 25, 2017
27f3005
Support spark.driver.extraJavaOptions (#48)
kimoonkim Jan 26, 2017
48f5884
Use "extraScalaTestArgs" to pass extra options to scalatest. (#52)
lins05 Jan 26, 2017
81bd355
Use OpenJDK8's official Alpine image. (#51)
mccheah Jan 26, 2017
86bd589
Remove unused driver extra classpath upload code (#54)
mccheah Jan 26, 2017
e6f35d2
Fix k8s integration tests (#44)
lins05 Jan 27, 2017
6cceb59
Added GC to components (#56)
foxish Jan 27, 2017
3b5901a
Create README to better describe project purpose (#50)
ash211 Jan 28, 2017
2e992be
Access the Driver Launcher Server over NodePort for app launch + subm…
mccheah Jan 30, 2017
b2e6877
Extract constants and config into separate file. Launch => Submit. (#65)
mccheah Jan 31, 2017
6ee3be5
Retry the submit-application request to multiple nodes (#69)
mccheah Feb 2, 2017
d0f95db
Allow adding arbitrary files (#71)
mccheah Feb 2, 2017
de9a82e
Fix NPE around unschedulable pod specs (#79)
ash211 Feb 2, 2017
fae76a0
Introduce blocking submit to kubernetes by default (#53)
ash211 Feb 3, 2017
4bc7c52
Do not wait for pod finishing in integration tests. (#84)
lins05 Feb 3, 2017
52a7ab2
Check for user jars/files existence before creating the driver pod. (…
lins05 Feb 8, 2017
487d1e1
Use readiness probe instead of client-side ping. (#75)
mccheah Feb 9, 2017
bdfc4e1
Note integration tests require Java 8 (#99)
ash211 Feb 10, 2017
fe8b45c
Bumping up kubernetes-client version to fix GKE and local proxy (#105)
foxish Feb 10, 2017
7a4075f
Truncate k8s hostnames to be no longer than 63 characters (#102)
ash211 Feb 11, 2017
3d80fff
Fixed loading the executors page through the kubectl proxy. (#95)
lins05 Feb 13, 2017
a34a114
Filter nodes to only try and send files to external IPs (#106)
foxish Feb 13, 2017
ac4dd91
Parse results of minikube status more rigorously (#97)
ash211 Feb 13, 2017
2112c4a
Adding legacyHostIP to the list of IPs we look at (#114)
foxish Feb 14, 2017
043cdd9
Add -DskipTests to dev docs (#115)
ash211 Feb 15, 2017
0e6df11
Shutdown the thread scheduler in LoggingPodStatusWatcher on receiving…
varunkatta Feb 16, 2017
a800e20
Trigger scalatest plugin in the integration-test phase (#93)
kimoonkim Feb 16, 2017
2773b77
Fix issue with DNS resolution (#118)
foxish Feb 16, 2017
6a999ca
Change the API contract for uploading local files (#107)
mccheah Feb 16, 2017
cad5dd3
Optionally expose the driver UI port as NodePort (#131)
kimoonkim Feb 22, 2017
68a83a2
Set the REST service's exit code to the exit code of its driver subpr…
ash211 Feb 23, 2017
1ab6dbc
Pass the actual iterable from the option to get files (#139)
mccheah Feb 23, 2017
bb5cb21
Use a separate class to track components that need to be cleaned up (…
mccheah Feb 23, 2017
04a555e
Enable unit tests in Travis CI build (#132)
kimoonkim Feb 23, 2017
d7f41c5
Change driver pod's restart policy from OnFailure to Never (#145)
ash211 Feb 23, 2017
b4b1bdd
Extract SSL configuration handling to a separate class (#123)
mccheah Feb 24, 2017
39c2cf2
Exclude known flaky tests (#156)
kimoonkim Feb 24, 2017
2303aad
Richer logging and better error handling in driver pod watch (#154)
foxish Feb 24, 2017
e7f78cb
Document blocking submit calls (#152)
ash211 Feb 25, 2017
fd24f23
Allow custom annotations on the driver pod. (#163)
mccheah Mar 2, 2017
7132f5d
Update client version & minikube version (#142)
foxish Mar 2, 2017
a51dcc8
Allow customizing external URI provision + External URI can be set vi…
mccheah Mar 3, 2017
a14dc1e
Remove okhttp from top-level pom (#166)
foxish Mar 3, 2017
015f18d
Allow setting memory on the driver submission server. (#161)
mccheah Mar 3, 2017
f414355
Add a section for prerequisites (#171)
foxish Mar 4, 2017
6cf635d
Add instructions to find master URL (#169)
foxish Mar 4, 2017
191dd51
Propagate exceptions (#172)
mccheah Mar 6, 2017
dc4e3d2
Logging for resource deletion (#170)
ash211 Mar 6, 2017
3636939
Fix pom versions (#178)
foxish Mar 14, 2017
2382ea6
Exclude flaky ExternalShuffleServiceSuite from Travis (#185)
kimoonkim Mar 15, 2017
b139b46
Fix lint-check failures and javadoc8 break (#187)
ash211 Mar 16, 2017
8c08189
Docs improvements (#176)
foxish Mar 8, 2017
8756494
Add Apache license to a few files (#175)
ash211 Mar 8, 2017
fece639
Adding clarification pre-alpha (#181)
foxish Mar 8, 2017
35724a3
Allow providing an OAuth token for authenticating against k8s (#180)
mccheah Mar 13, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 17 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,22 @@
sudo: required
dist: trusty

# 2. Choose language and target JDKs for parallel builds.
# 2. Choose language, target JDK and env's for parallel builds.
language: java
jdk:
- oraclejdk7
- oraclejdk8
env: # Used by the install section below.
# Configure the unit test build for spark core and kubernetes modules,
# while excluding some flaky unit tests using a regex pattern.
- PHASE=test \
PROFILES="-Pmesos -Pyarn -Phadoop-2.7 -Pkubernetes" \
MODULES="-pl core,resource-managers/kubernetes/core -am" \
ARGS="-Dtest=none -Dsuffixes='^org\.apache\.spark\.(?!ExternalShuffleServiceSuite|SortShuffleSuite$|rdd\.LocalCheckpointSuite$|deploy\.SparkSubmitSuite$|deploy\.StandaloneDynamicAllocationSuite$).*'"
# Configure the full build.
- PHASE=install \
PROFILES="-Pmesos -Pyarn -Phadoop-2.7 -Pkubernetes -Pkinesis-asl -Phive -Phive-thriftserver" \
MODULES="" \
ARGS="-T 4 -q -DskipTests"

# 3. Setup cache directory for SBT and Maven.
cache:
Expand All @@ -41,11 +52,12 @@ cache:
notifications:
email: false

# 5. Run maven install before running lint-java.
# 5. Run maven build before running lints.
install:
- export MAVEN_SKIP_RC=1
- build/mvn -T 4 -q -DskipTests -Pmesos -Pyarn -Phadoop-2.3 -Pkinesis-asl -Phive -Phive-thriftserver install
- build/mvn ${PHASE} ${PROFILES} ${MODULES} ${ARGS}

# 6. Run lint-java.
# 6. Run lints.
script:
- dev/lint-java
- dev/lint-scala
38 changes: 38 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,41 @@
# Apache Spark On Kubernetes

This repository, located at https://github.com/apache-spark-on-k8s/spark, contains a fork of Apache Spark that enables running Spark jobs natively on a Kubernetes cluster.

## What is this?

This is a collaboratively maintained project working on [SPARK-18278](https://issues.apache.org/jira/browse/SPARK-18278). The goal is to bring native support for Spark to use Kubernetes as a cluster manager, in a fully supported way on par with the Spark Standalone, Mesos, and Apache YARN cluster managers.

## Getting Started

- [Usage guide](docs/running-on-kubernetes.md) shows how to run the code
- [Development docs](resource-managers/kubernetes/README.md) shows how to get set up for development
- Code is primarily located in the [resource-managers/kubernetes](resource-managers/kubernetes) folder

## Why does this fork exist?

Adding native integration for a new cluster manager is a large undertaking. If poorly executed, it could introduce bugs into Spark when run on other cluster managers, cause release blockers slowing down the overall Spark project, or require hotfixes which divert attention away from development towards managing additional releases. Any work this deep inside Spark needs to be done carefully to minimize the risk of those negative externalities.

At the same time, an increasing number of people from various companies and organizations desire to work together to natively run Spark on Kubernetes. The group needs a code repository, communication forum, issue tracking, and continuous integration, all in order to work together effectively on an open source product.

We've been asked by an Apache Spark Committer to work outside of the Apache infrastructure for a short period of time to allow this feature to be hardened and improved without creating risk for Apache Spark. The aim is to rapidly bring it to the point where it can be brought into the mainline Apache Spark repository for continued development within the Apache umbrella. If all goes well, this should be a short-lived fork rather than a long-lived one.

## Who are we?

This is a collaborative effort by several folks from different companies who are interested in seeing this feature be successful. Companies active in this project include (alphabetically):

- Google
- Haiwen
- Hyperpilot
- Intel
- Palantir
- Pepperdata
- Red Hat

--------------------

(original README below)

# Apache Spark

Spark is a fast and general cluster computing system for Big Data. It provides
Expand Down
12 changes: 11 additions & 1 deletion assembly/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down Expand Up @@ -148,6 +148,16 @@
</dependency>
</dependencies>
</profile>
<profile>
<id>kubernetes</id>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-kubernetes_${scala.binary.version}</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</profile>
<profile>
<id>hive</id>
<dependencies>
Expand Down
2 changes: 1 addition & 1 deletion common/network-common/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion common/network-shuffle/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion common/network-yarn/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion common/sketch/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion common/tags/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
2 changes: 1 addition & 1 deletion common/unsafe/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../../pom.xml</relativePath>
</parent>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ public static long parseSecondNano(String secondNano) throws IllegalArgumentExce
public final int months;
public final long microseconds;

public final long milliseconds() {
public long milliseconds() {
return this.microseconds / MICROS_PER_MILLI;
}

Expand Down
2 changes: 1 addition & 1 deletion core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<parent>
<groupId>org.apache.spark</groupId>
<artifactId>spark-parent_2.11</artifactId>
<version>2.1.0</version>
<version>2.1.0-k8s-0.1.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,28 @@ $(document).ajaxStart(function () {
$.blockUI({message: '<h3>Loading Executors Page...</h3>'});
});

function findKubernetesServiceBaseURI() {
var k8sProxyPattern = '/api/v1/proxy/namespaces/';
var k8sProxyPatternPos = document.baseURI.indexOf(k8sProxyPattern);
if (k8sProxyPatternPos > 0) {
// Spark is running in a kubernetes cluster, and the web ui is served
// through the kubectl proxy.
var remaining = document.baseURI.substr(k8sProxyPatternPos + k8sProxyPattern.length);
var urlSlashesCount = remaining.split('/').length - 3;
var words = document.baseURI.split('/');
var baseURI = words.slice(0, words.length - urlSlashesCount).join('/');
return baseURI;
}

return null;
}

function createTemplateURI(appId) {
var kubernetesBaseURI = findKubernetesServiceBaseURI();
if (kubernetesBaseURI) {
return kubernetesBaseURI + '/static/executorspage-template.html';
}

var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
if (ind > 0) {
Expand All @@ -70,6 +91,14 @@ function createTemplateURI(appId) {
}

function getStandAloneppId(cb) {
var kubernetesBaseURI = findKubernetesServiceBaseURI();
if (kubernetesBaseURI) {
var appIdAndPort = kubernetesBaseURI.split('/').slice(-1)[0];
var appId = appIdAndPort.split(':')[0];
cb(appId);
return;
}

var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
if (ind > 0) {
Expand All @@ -95,6 +124,11 @@ function getStandAloneppId(cb) {
}

function createRESTEndPoint(appId) {
var kubernetesBaseURI = findKubernetesServiceBaseURI();
if (kubernetesBaseURI) {
return kubernetesBaseURI + "/api/v1/applications/" + appId + "/allexecutors";
}

var words = document.baseURI.split('/');
var ind = words.indexOf("proxy");
if (ind > 0) {
Expand Down
31 changes: 25 additions & 6 deletions core/src/main/scala/org/apache/spark/deploy/SparkSubmit.scala
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ object SparkSubmit {
private val STANDALONE = 2
private val MESOS = 4
private val LOCAL = 8
private val ALL_CLUSTER_MGRS = YARN | STANDALONE | MESOS | LOCAL
private val KUBERNETES = 16
private val ALL_CLUSTER_MGRS = YARN | STANDALONE | MESOS | KUBERNETES | LOCAL

// Deploy modes
private val CLIENT = 1
Expand Down Expand Up @@ -239,9 +240,10 @@ object SparkSubmit {
YARN
case m if m.startsWith("spark") => STANDALONE
case m if m.startsWith("mesos") => MESOS
case m if m.startsWith("k8s") => KUBERNETES
case m if m.startsWith("local") => LOCAL
case _ =>
printErrorAndExit("Master must either be yarn or start with spark, mesos, local")
printErrorAndExit("Master must either be yarn or start with spark, mesos, k8s, or local")
-1
}

Expand Down Expand Up @@ -284,6 +286,7 @@ object SparkSubmit {
}
val isYarnCluster = clusterManager == YARN && deployMode == CLUSTER
val isMesosCluster = clusterManager == MESOS && deployMode == CLUSTER
val isKubernetesCluster = clusterManager == KUBERNETES && deployMode == CLUSTER

// Resolve maven dependencies if there are any and add classpath to jars. Add them to py-files
// too for packages that include Python code
Expand Down Expand Up @@ -330,6 +333,10 @@ object SparkSubmit {

// The following modes are not supported or applicable
(clusterManager, deployMode) match {
case (KUBERNETES, CLIENT) =>
printErrorAndExit("Client mode is currently not supported for Kubernetes.")
case (KUBERNETES, CLUSTER) if args.isPython || args.isR =>
printErrorAndExit("Kubernetes does not currently support python or R applications.")
case (STANDALONE, CLUSTER) if args.isPython =>
printErrorAndExit("Cluster deploy mode is currently not supported for python " +
"applications on standalone clusters.")
Expand Down Expand Up @@ -463,17 +470,21 @@ object SparkSubmit {
OptionAssigner(args.principal, YARN, ALL_DEPLOY_MODES, sysProp = "spark.yarn.principal"),
OptionAssigner(args.keytab, YARN, ALL_DEPLOY_MODES, sysProp = "spark.yarn.keytab"),

// Other options
OptionAssigner(args.kubernetesNamespace, KUBERNETES, ALL_DEPLOY_MODES,
sysProp = "spark.kubernetes.namespace"),

// Other options
OptionAssigner(args.executorCores, STANDALONE | YARN, ALL_DEPLOY_MODES,
sysProp = "spark.executor.cores"),
OptionAssigner(args.executorMemory, STANDALONE | MESOS | YARN, ALL_DEPLOY_MODES,
sysProp = "spark.executor.memory"),
OptionAssigner(args.totalExecutorCores, STANDALONE | MESOS, ALL_DEPLOY_MODES,
sysProp = "spark.cores.max"),
OptionAssigner(args.files, LOCAL | STANDALONE | MESOS, ALL_DEPLOY_MODES,
OptionAssigner(args.files, LOCAL | STANDALONE | MESOS | KUBERNETES, ALL_DEPLOY_MODES,
sysProp = "spark.files"),
OptionAssigner(args.jars, LOCAL, CLIENT, sysProp = "spark.jars"),
OptionAssigner(args.jars, STANDALONE | MESOS, ALL_DEPLOY_MODES, sysProp = "spark.jars"),
OptionAssigner(args.jars, STANDALONE | MESOS | KUBERNETES, ALL_DEPLOY_MODES,
sysProp = "spark.jars"),
OptionAssigner(args.driverMemory, STANDALONE | MESOS | YARN, CLUSTER,
sysProp = "spark.driver.memory"),
OptionAssigner(args.driverCores, STANDALONE | MESOS | YARN, CLUSTER,
Expand Down Expand Up @@ -506,8 +517,9 @@ object SparkSubmit {

// Add the application jar automatically so the user doesn't have to call sc.addJar
// For YARN cluster mode, the jar is already distributed on each node as "app.jar"
// In Kubernetes cluster mode, the jar will be uploaded by the client separately.
// For python and R files, the primary resource is already distributed as a regular file
if (!isYarnCluster && !args.isPython && !args.isR) {
if (!isYarnCluster && !isKubernetesCluster && !args.isPython && !args.isR) {
var jars = sysProps.get("spark.jars").map(x => x.split(",").toSeq).getOrElse(Seq.empty)
if (isUserJar(args.primaryResource)) {
jars = jars ++ Seq(args.primaryResource)
Expand Down Expand Up @@ -606,6 +618,13 @@ object SparkSubmit {
}
}

if (isKubernetesCluster) {
childMainClass = "org.apache.spark.deploy.kubernetes.Client"
childArgs += args.primaryResource
childArgs += args.mainClass
childArgs ++= args.childArgs
}

// Load any properties specified through --conf and the default properties file
for ((k, v) <- args.sparkProperties) {
sysProps.getOrElseUpdate(k, v)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,9 @@ private[deploy] class SparkSubmitArguments(args: Seq[String], env: Map[String, S
var principal: String = null
var keytab: String = null

// Kubernetes only
var kubernetesNamespace: String = null

// Standalone cluster mode only
var supervise: Boolean = false
var driverCores: String = null
Expand Down Expand Up @@ -186,6 +189,9 @@ private[deploy] class SparkSubmitArguments(args: Seq[String], env: Map[String, S
.getOrElse(sparkProperties.get("spark.executor.instances").orNull)
keytab = Option(keytab).orElse(sparkProperties.get("spark.yarn.keytab")).orNull
principal = Option(principal).orElse(sparkProperties.get("spark.yarn.principal")).orNull
kubernetesNamespace = Option(kubernetesNamespace)
.orElse(sparkProperties.get("spark.kubernetes.namespace"))
.orNull

// Try to set main class from JAR if no --class argument is given
if (mainClass == null && !isPython && !isR && primaryResource != null) {
Expand Down Expand Up @@ -426,6 +432,9 @@ private[deploy] class SparkSubmitArguments(args: Seq[String], env: Map[String, S
case KEYTAB =>
keytab = value

case KUBERNETES_NAMESPACE =>
kubernetesNamespace = value

case HELP =>
printUsageAndExit(0)

Expand Down
Loading