我在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提交时,远程K8s服务器到底知道我是谁?什么是auth过程涉及所有这些?
一个PKIX path building failed错误是指的Java试图打开一个SSL连接,但无法找到证书链(路径)用于验证服务器提供的证书。
您运行的代码不信任群集提供的证书。群集可能使用自签名证书。
从命令行运行,Java在位于jre / lib / security / cacerts的信任库中查找链。作为更大环境(Tomcat,Glassfish等)的一部分运行,它将使用该环境的证书信任库。
由于您手动启动spark_submit,因此您可能缺少指定在何处查找密钥库(服务器证书和私钥)和信任库(CA证书)的选项。这些通常指定为:
-Djavax.net.ssl.trustStore=/somepath/truststore.jks
-Djavax.net.ssl.keyStore=/somepath/keystore.jks
如果您在Java 9+上运行,则还需要指定StoreType:
-Djavax.net.ssl.keyStoreType=
-Djavax.net.ssl.trustStoreType=
通过Java 8,密钥库始终是JKS。从Java 9开始,它们也可以是PKCS12。
对于自签名密钥,您可以从密钥库导出它,并将其作为可信证书导入信任库。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。