SparkPi提交K8s集群失败:无法找到有效证书路径
Spark on Kubernetes 任务崩溃:PKIX证书路径问题排查与解决
问题描述
使用Spark 3.5.1提交SparkPi示例到Rancher Desktop管理的K8s集群,Driver Pod创建后几秒崩溃,核心报错为:
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
执行命令:
spark-submit.cmd --master k8s://https://172.17.45.59:6443 --deploy-mode cluster --name spark-pi --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=2 --conf spark.kubernetes.container.image=spark:our-own-apache-spark-kb8 --conf spark.kubernetes.container.image.pullPolicy=IfNotPresent --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark local:///opt/spark/examples/jars/spark-examples_2.13-3.5.1.jar 100
根本原因
Spark Driver Pod中的JVM信任库未包含Rancher Desktop K8s集群的CA证书,导致Driver与K8s API Server建立SSL连接时无法验证服务器身份,握手失败。
解决步骤
1. 提取Rancher Desktop的K8s CA证书
从本地kubeconfig文件中解码CA证书:
# Windows环境可使用Git Bash或PowerShell执行 cat ~/.kube/config | findstr certificate-authority-data | awk '{print $2}' | base64 -d > ca.crt
2. 构建包含CA证书的Spark镜像
修改自定义Spark镜像的Dockerfile,将CA证书导入JVM信任库:
FROM spark:our-own-apache-spark-kb8 COPY ca.crt /opt/spark/ca.crt # 默认JVM信任库密码为changeit RUN keytool -importcert -file /opt/spark/ca.crt -alias rancher-k8s-ca -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt
重新构建镜像:
docker build -t spark:our-own-apache-spark-kb8-with-ca .
3. 使用新镜像提交任务
更新spark-submit命令中的镜像参数:
spark-submit.cmd --master k8s://https://172.17.45.59:6443 --deploy-mode cluster --name spark-pi --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=2 --conf spark.kubernetes.container.image=spark:our-own-apache-spark-kb8-with-ca --conf spark.kubernetes.container.image.pullPolicy=IfNotPresent --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark local:///opt/spark/examples/jars/spark-examples_2.13-3.5.1.jar 100
临时方案(仅测试环境)
若需快速验证,可临时禁用SSL证书验证(生产环境禁止使用),添加以下配置到spark-submit命令:
--conf spark.kubernetes.ssl.trustStore=/dev/null --conf spark.kubernetes.ssl.trustStorePassword='' --conf spark.kubernetes.ssl.trustStoreType=PEM
内容的提问来源于stack exchange,提问作者PowerfullDeveloper
相关产品推荐
相关产品推荐

