用于 spark-submit 的 kubernetes init 容器
kubernetes init container for spark-submit
我正在尝试 运行 使用 spark 3.2.1 映像将 spark 提交到 Kubernetes 集群,它正在运行。现在我的问题是,我可以在执行 spark-submit 的同时执行一个 init 容器吗?我试图实现的是 init 容器检查另一个服务是否启动,它是否启动然后 spark-submit 将 运行 或它失败。
我可以看到 conf 参数“spark.kubernetes.initContainer.image”适用于 spark 版本 2.3,但不适用于 3.2.1 (https://spark.apache.org/docs/2.3.0/running-on-kubernetes.html)
在我提交 spark 作业之前,是否有任何机制可以用来检查其他服务是否已启动?
我可以在下面的链接中看到 spark 的初始化容器使用情况,但它没有提供准确的答案
https://docs.bitnami.com/kubernetes/infrastructure/spark/configuration/configure-sidecar-init-containers/
https://doc.lucidworks.com/spark-guide/11153/running-spark-on-kubernetes
非常感谢任何帮助,谢谢。
你不提其他服务是否在同一个容器中,但原理是一样的。它包含在文档 here 中,并给出了这个示例,该示例定义了一个具有两个初始容器的简单 Pod。第一个等待 myservice,第二个等待 mydb。一旦两个初始容器都完成,Pod 就会从其规范部分运行应用程序容器。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
我发现提交spark作业的最佳方式是sparkoperator,更多细节可以在GitHub link
中找到
有一个选项可以包含 init 容器和 sidecar 容器。
您可以为您的广告连播定义广告连播模板
./bin/spark-submit --master k8s://50.1.0.4:6443 --deploy-mode cluster --name spark-pi --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=1 --conf spark.kubernetes.container.image=spark:v3.2.1
--conf spark.kubernetes.driver.podTemplateFile=//path/my_pod_template.yaml
--conf spark.kubernetes.executor.podTemplateFile=//path/my_pod_template.yaml
--conf local:///opt/spark/examples/jars/spark-examples_2.12-3.2.1.jar
请注意,模板不必包含 Spark 应用运行所需的所有字段。它的主要目的,正如官方描述的docs是为了:
Spark users can similarly use template files to define the driver or
executor pod configurations that Spark configurations do not support.
这意味着 lot/most 个字段将根据 --conf
个值被覆盖。在我的例子中,我不想指定主容器规范,我只需要 initContainer
来进行一些初始化检查。不用说,主容器可用的所有卷和环境变量也将可用于 init 容器,而无需将它们显式添加到 pod 模板。
my_pod_template.yaml:
类似于 Alan 的回答
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
来源: https://spark.apache.org/docs/latest/running-on-kubernetes.html#pod-template
我正在尝试 运行 使用 spark 3.2.1 映像将 spark 提交到 Kubernetes 集群,它正在运行。现在我的问题是,我可以在执行 spark-submit 的同时执行一个 init 容器吗?我试图实现的是 init 容器检查另一个服务是否启动,它是否启动然后 spark-submit 将 运行 或它失败。
我可以看到 conf 参数“spark.kubernetes.initContainer.image”适用于 spark 版本 2.3,但不适用于 3.2.1 (https://spark.apache.org/docs/2.3.0/running-on-kubernetes.html)
在我提交 spark 作业之前,是否有任何机制可以用来检查其他服务是否已启动?
我可以在下面的链接中看到 spark 的初始化容器使用情况,但它没有提供准确的答案
https://docs.bitnami.com/kubernetes/infrastructure/spark/configuration/configure-sidecar-init-containers/ https://doc.lucidworks.com/spark-guide/11153/running-spark-on-kubernetes
非常感谢任何帮助,谢谢。
你不提其他服务是否在同一个容器中,但原理是一样的。它包含在文档 here 中,并给出了这个示例,该示例定义了一个具有两个初始容器的简单 Pod。第一个等待 myservice,第二个等待 mydb。一旦两个初始容器都完成,Pod 就会从其规范部分运行应用程序容器。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
我发现提交spark作业的最佳方式是sparkoperator,更多细节可以在GitHub link
中找到有一个选项可以包含 init 容器和 sidecar 容器。
您可以为您的广告连播定义广告连播模板
./bin/spark-submit --master k8s://50.1.0.4:6443 --deploy-mode cluster --name spark-pi --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=1 --conf spark.kubernetes.container.image=spark:v3.2.1
--conf spark.kubernetes.driver.podTemplateFile=//path/my_pod_template.yaml
--conf spark.kubernetes.executor.podTemplateFile=//path/my_pod_template.yaml
--conf local:///opt/spark/examples/jars/spark-examples_2.12-3.2.1.jar
请注意,模板不必包含 Spark 应用运行所需的所有字段。它的主要目的,正如官方描述的docs是为了:
Spark users can similarly use template files to define the driver or executor pod configurations that Spark configurations do not support.
这意味着 lot/most 个字段将根据 --conf
个值被覆盖。在我的例子中,我不想指定主容器规范,我只需要 initContainer
来进行一些初始化检查。不用说,主容器可用的所有卷和环境变量也将可用于 init 容器,而无需将它们显式添加到 pod 模板。
my_pod_template.yaml:
类似于 Alan 的回答
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
来源: https://spark.apache.org/docs/latest/running-on-kubernetes.html#pod-template