【问题标题】:Spark with Kubernetes connecting to pod id, not addressSpark 与 Kubernetes 连接到 pod id,而不是地址
【发布时间】:2019-05-24 21:34:59
【问题描述】:

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

这将在集群上运行“驱动程序”和所有“执行程序”,这部分似乎可以工作,但是我们的应用程序中的启动代码会从某个 Spark 进程回调。由于某种原因,它试图连接到harness-64d97d6d6-4r4d8,这是 pod 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

【问题讨论】:

  • 您可以通过将容器的主机名设置为 spark-api 来欺骗提交过程,因此当它尝试宣传自己时,它将使用该名称,但老实说,您的问题还不清楚关于你故事中的哪个 Pod 是 harness-64etcetc
  • 向 Spark 提交作业的 pod 的 pod ID 为 harness-64etcetc,因此连接从 Spark 返回到启动作业的 pod,但使用这个虚假名称,就好像它是一个地址或名字。

标签: apache-spark kubernetes amazon-eks


【解决方案1】:

您可以考虑为harness-64etcetc Pod 使用Headless 服务,以完成反向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,这可能会带来一些有用的信息以供进一步调查。

【讨论】:

  • 你有工作样本吗?我认为这在这里可能没有帮助。我正在对其进行测试,最后最终在单个 pod 中同时运行 master 和 worker(s) 容器。对于我的测试环境来说已经足够好了。请建议您如何使用无头服务进行操作,以便我可以尝试。
猜你喜欢
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多