已配置必要Edit权限RBAC,Spark-Submit提交本地K8s集群仍失败
已创建指定的serviceaccount(sa-apache-spark),并完成与edit集群角色的clusterrolebinding绑定,但向本地K8s集群提交Spark任务时仍失败。
提交命令:
$ spark-submit --master k8s://https://127.0.0.1:16443 --conf spark.executor.instances=1 --conf spark.kubernetes.container.image=spark:python3 --conf spark.kubernetes.file.upload.path=/tmp --conf spark.kubernetes.authenticate.driver.serviceAccountName=sa-apache-spark --deploy-mode cluster TextFile.py
核心错误日志:
25/03/07 16:21:39 ERROR Client: Please check "kubectl auth can-i create pod" first. It should be yes. Exception in thread "main" io.fabric8.kubernetes.client.KubernetesClientException: An error has occurred. ... Caused by: java.io.IOException: timeout ... Caused by: java.net.SocketException: Socket closed
权限验证结果:
$ kubectl auth can-i create pod yes
虽然kubectl auth can-i返回权限正常,但错误栈显示问题根源是Spark客户端与K8s API服务器的网络连接超时/套接字关闭,而非权限不足。常见触发场景包括:
- Spark客户端无法正确访问K8s API服务器(地址/端口错误、TLS证书不被信任)
- K8s API服务器响应缓慢,超出Spark客户端默认超时阈值
- 本地代理、防火墙拦截了Spark与API服务器的连接
- ServiceAccount的命名空间与任务部署命名空间不匹配
校验K8s API服务器地址正确性
执行kubectl cluster-info获取集群API服务器的实际地址,确保--master参数中的https://127.0.0.1:16443与实际地址一致。处理TLS证书信任问题
如果K8s API服务器使用自签名证书,需在Spark提交命令中指定CA证书路径:--conf spark.kubernetes.authenticate.caCertFile=/path/to/your/ca.crt证书路径可从本地
~/.kube/config文件的certificate-authority字段获取。调整Spark客户端超时参数
延长Spark与K8s API服务器的连接/请求超时时间:--conf spark.kubernetes.connection.timeout=60000 --conf spark.kubernetes.request.timeout=60000单位为毫秒,上述配置设置为60秒。
排查网络拦截问题
执行以下命令测试API服务器连通性:curl -k https://127.0.0.1:16443/api/v1/pods若请求失败,关闭本地防火墙或添加允许规则,同时检查是否存在代理拦截连接。
确认ServiceAccount命名空间匹配
确保sa-apache-spark存在于Spark任务部署的目标命名空间(默认default),或在提交命令中显式指定命名空间:--conf spark.kubernetes.namespace=your-target-namespace同时验证ClusterRoleBinding是否正确绑定了该ServiceAccount(ClusterRoleBinding为集群级,但ServiceAccount属于特定命名空间,需确保绑定关系无遗漏)。
检查Spark镜像网络配置
确认spark:python3镜像内部可正常解析并访问K8s API服务器,可进入镜像测试DNS解析和网络连通性。
内容的提问来源于stack exchange,提问作者khteh

