【问题标题】:Kubernetes - Can't connect to a service IP from the service's podKubernetes - 无法从服务的 pod 连接到服务 IP
【发布时间】:2016-04-28 11:47:26
【问题描述】:

我正在尝试创建 3 个 Kafka 实例并将其部署到本地 Kubernetes 设置。因为每个实例都需要一些特定的配置,所以我正在为每个实例创建一个 RC 和一个服务 - 急切地等待 #18016 ;)

但是,我遇到了问题,因为 Kafka 在使用服务 IP 时无法与自己建立网络连接(Kafka 代理在与其他代理交换复制消息时尝试这样做)。例如,假设我有两个工作主机(172.17.8.201 和 172.17.8.202),我的 pod 安排如下:

  • 主机 1 (172.17.8.201)

    • kafka1 吊舱 (10.2.16.1)
  • 主机 2 (172.17.8.202)

    • kafka2 吊舱 (10.2.68.1)
    • kafka3 吊舱 (10.2.68.2)

另外,假设我有以下服务 IP:

  • kafka1集群IP:11.1.2.96
  • kafka2集群IP:11.1.2.120
  • kafka3集群IP:11.1.2.123

kafka1 pod(容器)尝试使用kafka1 集群 IP (11.1.2.96) 向自身发送消息时,就会出现问题。由于某种原因,无法建立连接,也没有发送消息。

更多信息:如果我手动连接到 kafka1 pod,我可以使用它们各自的集群 IP (11.1.2.120 / 11.1.2.123) 正确地远程登录到 kafka2kafka3 pod。此外,如果我在 kafka2 pod 中,我会使用 11.1.2.96 和 11.1.2.123 连接到 kafka1kafka3 pod。最后,如果我使用 pod IP,我可以连接到所有 pod(来自所有 pod)。

需要强调的是,我不应该告诉 kafka 代理使用 pod IP 而不是集群 IP 进行复制。就像现在一样,Kafka 用于复制您配置为“广告”的任何 IP - 这是您的客户端用于连接到代理的 IP。即使可以,我相信这个问题也可能出现在其他软件上。

这个问题似乎只发生在我使用的组合中,因为完全相同的文件在 GCE 中可以正常工作。现在,我正在跑步:

  • Kubernetes 1.1.2
  • coreos 928.0.0
  • 使用 flannel 设置网络
  • vagrant + VirtualBpx 上的一切

经过一些调试,我不确定问题出在工人 iptables 规则、kube-proxy 还是 flannel 中。

PS:我最初在他们的 github 上以 Issue 的形式发布了这个问题,但我已被 Kubernetes 团队重定向到这里。我稍微改写了文本,因为它听起来像是“支持请求”,但实际上我相信这是某种错误。无论如何,对那个 Kubernetes 团队感到抱歉!


编辑:此问题已被确认为错误https://github.com/kubernetes/kubernetes/issues/20391

【问题讨论】:

  • 我看到很多关于 pod 无法通过服务连接到自己的问题。我不知道为什么,但一定有技术原因。服务旨在负载平衡对 Pod 的请求,因此 Pod 不应该与它们自己服务的端口通信对我来说有点道理。但是,对于您正在做的事情,您想要的是使用无头服务kubernetes.io/v1.0/docs/user-guide/…
  • 好吧,它可以在集群内访问,但我也希望可以从 Internet 访问 kafka 集群。当我在 GCE 中时,我正在使用类型为“LoadBalancer”的服务 - 并为负载均衡器 IP 和广告 IP 使用保留 IP。它工作正常。虽然,我的问题的重点是我无法使用服务 IP 访问 Pod - GCE 和我的本地设置中的行为现在不一致,这绝对看起来很奇怪。
  • 你可以同时拥有:我一直都在使用它:你可以拥有一个负载均衡服务和一个针对相同 Pod 的无头服务。
  • 很高兴知道,谢谢!但我仍在寻找连接问题的答案——正如我在问题中提到的,其他用例可能会发现同样的问题。我在stackoverflow上稍微挖掘了一下,这个问题stackoverflow.com/questions/34732597/…似乎是同一个问题。
  • 是的,因为您无法通过常规服务连接到自己:使用无头服务。

标签: apache-kafka kubernetes


【解决方案1】:

对于您想要做的事情,您应该使用 Headless Service http://kubernetes.io/v1.0/docs/user-guide/services.html#headless-services

这意味着设置

clusterIP: None

在您的服务中

这意味着不会有与服务关联的 IP,但它会返回 selector 选择的 Pod 的所有 IP

【讨论】:

    【解决方案2】:

    更新:该错误已在 v1.2.4 中修复

    你可以试试container hook

    containers:
      - name: kafka
        image: Kafka
        lifecycle:
          postStart:
            exec:
              command:
                - "some.sh" #some shell scripts to get this pod's IP and notify the other Kafka members that "add me into your cluster"
          preStop:
            exec:
              command:
                - "some.sh" #some shell scripts to get other Kafka pods' IP and notify the other Kafka members that "delete me from your cluster"
    

    我在将 3 个 mongodb pod 作为集群运行时遇到了类似的问题,但是这些 pod 无法通过其服务的 IP 访问自己。

    另外,这个bug修复了吗?

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2018-08-18
      • 2018-10-07
      • 1970-01-01
      • 2020-01-01
      • 2020-08-04
      • 2022-06-16
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多