【发布时间】: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) 正确地远程登录到 kafka2 和 kafka3 pod。此外,如果我在 kafka2 pod 中,我会使用 11.1.2.96 和 11.1.2.123 连接到 kafka1 和 kafka3 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/…似乎是同一个问题。
-
是的,因为您无法通过常规服务连接到自己:使用无头服务。