Kubernetes - 无法从服务的 pod 连接到服务 IP

Posted

技术标签:

【中文标题】Kubernetes - 无法从服务的 pod 连接到服务 IP【英文标题】:Kubernetes - Can't connect to a service IP from the service's pod 【发布时间】: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 的无头服务。 很高兴知道,谢谢!但我仍在寻找连接问题的答案——正如我在问题中提到的,其他用例可能会发现同样的问题。我在***上稍微挖掘了一下,这个问题***.com/questions/34732597/…似乎是同一个问题。 是的,因为您无法通过常规服务连接到自己:使用无头服务。 【参考方案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修复了吗?

【讨论】:

以上是关于Kubernetes - 无法从服务的 pod 连接到服务 IP的主要内容,如果未能解决你的问题,请参考以下文章

无法从 kubernetes pod 内部连接到外部数据库

.NET Core pod 无法连接到 Kubernetes 中的 SQL Server pod

kubernetes常见故障

无法从 Kubernetes 集群上的 Angular pod 向服务发出 GET 请求

Kubernetes Python客户端:使用Autobahn websocket连接到pod /服务/使用bearer token连接

kubernetes:pod无法删除