首页 > 解决方案 > Spark 与 Kubernetes 连接到 pod id,而不是地址

问题描述

我们有几个服务的 k8s 部署,包括 Apache Spark。所有服务似乎都可以运行。我们的应用程序连接到 Spark master 以使用 k8s DNS 服务为调用 master 的集群提交作业,spark-api因此我们使用master=spark://spark-api:7077和使用spark.submit.deployMode=cluster. 我们通过 API 提交作业,而不是通过 spark-submit 脚本。

这将在集群上运行“驱动程序”和所有“执行程序”,这部分似乎可以工作,但是我们的应用程序中的启动代码会从某个 Spark 进程回调。出于某种原因,它试图连接到harness-64d97d6d6-4r4d8pod ID,而不是 k8s 集群 IP 或 DNS。

这个pod ID是如何进入系统的?Spark 似乎以某种方式认为它是调用它的服务的地址。不用说任何与 k8s pod ID 的连接都会失败,工作也是如此。

知道 Spark 怎么会认为pod ID是 IP 地址或 DNS 名称吗?

顺便说一句,如果我们运行一个小样本作业,master=local一切都很好,但是使用上述配置执行的相同作业会尝试连接到虚假的 pod ID。

BTW2:调用 pod 的 k8s DNS 是harness-api

标签: apache-sparkkubernetesamazon-eks

解决方案


您可以考虑为 Pod 使用Headless服务,harness-64etcetc以完成反向 DNS 发现。Actually, it will create particular endpoint for the relevant service by matching appropriate selector inside your application Pod and as result A record expects to be added into Kubernetes DNS configuration.

最终,我发现了相关的#266 Github issue,这可能会为进一步调查带来一些有用的信息。


推荐阅读