Apache Spark Spark-提交 k8s API https 错误

sac*_*a.p 1 java api https apache-spark kubernetes

火花版本:2.4.4

k8s版本:1.18

我有一个 Spark 和一个 k8s 集群。

我遵循 Spark 文档:https://spark.apache.org/docs/2.4.4/running-on-kubernetes.html

当我在 k8s 上使用 HTTP 代理提交作业时:一切正常。

但是,使用 k8s 上的本机 HTTPS API 时,我收到此错误:

以前我必须将 k8s API 证书导入到我的主 Spark (keytool)。

internal.WatchConnectionManager: Exec Failure: HTTP 403, Status: 403 - pods "spark-pi-1598541432880-driver" is forbidden: User "system:anonymous" cannot watch resource "pods" in API group "" in the namespace "default"
java.net.ProtocolException: Expected HTTP 101 response but was '403 Forbidden'
    at okhttp3.internal.ws.RealWebSocket.checkResponse(RealWebSocket.java:216)
    at okhttp3.internal.ws.RealWebSocket$2.onResponse(RealWebSocket.java:183)
    at okhttp3.RealCall$AsyncCall.execute(RealCall.java:141)
    at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为没有匿名用户。

我已经尝试向 k8s 添加“匿名”用户,但没有效果。

如果我尝试不导入 API 证书,则会收到此错误:

Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:198)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1967)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:331)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:325)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1688)

Run Code Online (Sandbox Code Playgroud)

我提交工作的命令:

-bash-4.2$ spark-submit --master k8s://https://ip:port  --deploy-mode cluster --name spark-pi --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.container.image=docker.io/spawnxx/spark:fink-test-2 hdfs://hdfs_ip/user/sacha.pateyron/spark-examples_2.11-2.4.4.jar 1000
Run Code Online (Sandbox Code Playgroud)

Apache Spark 本身不支持 K8s https API(因此我必须导入证书)?

任何想法 ?

sac*_*a.p 5

解决方案 :

HTTPS k8s API 使用证书和令牌进行身份验证。

首先下载k8s HTTPS API:

关于主火花 ->

echo -n|openssl s_client -connect ip_master_k8s:port_https_api|openssl x509 -outform PEM > selfsigned_certificate.pem
Run Code Online (Sandbox Code Playgroud)

在k8s master机器上获取spark token:

kubectl get secret

kubectl describe secret spark-token-XXX
Run Code Online (Sandbox Code Playgroud)

然后在 Spark master 上我们提交一个带有 cert 和 token 的作业:

spark-submit --master k8s://https://ip_master_k8s:port_https_api  --deploy-mode cluster --name spark-pi --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.container.image=your_image --conf spark.kubernetes.authenticate.submission.caCertFile=selfsigned_certificate.pem --conf spark.kubernetes.authenticate.submission.oauthToken=spark-token-XXX hdfs://ip_master_hdfs/my_jar
Run Code Online (Sandbox Code Playgroud)