所以我在 Google Kubernetes Engine 上有集群节点,我做 spark-submit 来运行一些 spark 作业。(我没有完全使用 spark-submit,我使用 java 代码启动提交,但它们本质上调用的是同一个 Scala 类,即 SparkSubmit.class)
就我而言,我有两个集群可以使用 gcloud 命令在我的笔记本电脑上连接。
例如
gcloud container clusters get-credentials cluster-1
gcloud container clusters get-credentials cluster-2
当我连接到 cluster-1 并且 spark-submit 正在提交到 cluster-1 时,它可以工作。但是当我运行第二个 gcloud 命令仍然提交到 cluster-1 时,它不起作用,并且出现以下堆栈跟踪(精简版)
io.fabric8.kubernetes.client.KubernetesClientException: Failed to start websocket
at io.fabric8.kubernetes.client.dsl.internal.WatchConnectionManager$2.onFailure(WatchConnectionManager.java:194)
at okhttp3.internal.ws.RealWebSocket.failWebSocket(RealWebSocket.java:543)
at okhttp3.internal.ws.RealWebSocket$2.onFailure(RealWebSocket.java:208)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:148)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
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:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1514)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
我一直在寻找一段时间没有成功。主要问题可能是当 spark-submit 启动时,它会在本地机器上搜索与 Kubernetes 相关的某种凭证,而前两个 gcloud 命令更改的上下文把它搞砸了。
我只是好奇,当我们进行 spark-submit 时,远程 K8s 服务器究竟是如何知道我是谁的?这一切涉及的身份验证过程是什么?
先感谢您。