Apache kafka Kubernetes-Can';t从服务连接到服务IP';s吊舱
我正在尝试创建3个Kafka实例,并将其部署到本地Kubernetes设置中。因为每个实例都需要一些特定的配置,所以我将为每个实例创建一个RC和一个服务—急切地等待;) 但是,我遇到了问题,因为Kafka在使用服务IP时无法建立与自身的网络连接(Kafka代理在与其他代理交换复制消息时会尝试这样做)。例如,假设我有两台工作主机(172.17.8.201和172.17.8.202),我的POD的计划如下:Apache kafka Kubernetes-Can';t从服务连接到服务IP';s吊舱,apache-kafka,kubernetes,Apache Kafka,Kubernetes,我正在尝试创建3个Kafka实例,并将其部署到本地Kubernetes设置中。因为每个实例都需要一些特定的配置,所以我将为每个实例创建一个RC和一个服务—急切地等待;) 但是,我遇到了问题,因为Kafka在使用服务IP时无法建立与自身的网络连接(Kafka代理在与其他代理交换复制消息时会尝试这样做)。例如,假设我有两台工作主机(172.17.8.201和172.17.8.202),我的POD的计划如下: 主机1(172.17.8.201) kafka1pod(10.2.16.1) 主机2(
- 主机1(172.17.8.201)
pod(10.2.16.1)kafka1
- 主机2(172.17.8.202)
pod(10.2.68.1)kafka2
pod(10.2.68.2)kafka3
集群IP:11.1.2.96kafka1
集群IP:11.1.2.120kafka2
集群IP:11.1.2.123kafka3
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中正常工作。现在,我正在跑步:
- 库伯内特斯1.1.2
- coreos 928.0.0
- 网络设置与法兰绒
- vagrant+VirtualPX上的所有内容
编辑:此问题已被确认为一个错误对于要执行的操作,您应该使用无头服务 这意味着设置
clusterIP:None
在您的服务中
这意味着不会有与服务相关联的IP,但它将返回由选择器选择的POD的所有IP
更新:该错误在v1.2.4中已修复
你可以试试
我在将3个mongodb pod作为集群运行时遇到了类似的问题,但这些pod无法通过其服务的IP访问自己
此外,该错误是否已修复?我看到许多关于pod无法通过服务连接到自身的问题。我不知道为什么,但一定有技术上的原因。服务意味着对pod的负载平衡请求,所以我觉得pod不应该与它们自己所服务的端口通信是有道理的。但是,对于您正在做的事情,您想要的是使用无头服务,它可以在集群内进行访问,但我也希望kafka集群可以从Internet访问。当我在GCE中时,我正在使用类型为“LoadBalancer”的服务,并将保留IP用作负载均衡器IP和播发IP。它很好用。尽管如此,我问题的重点是,我无法使用服务IP访问Pod-GCE和我的本地设置中的行为目前不一致,这显然看起来很奇怪。你可以同时拥有:我一直都在使用:你可以拥有一个负载平衡的设备和一个针对相同Pod的无头服务。很高兴知道,谢谢但是我仍然在寻找连接问题的答案——正如我在问题中提到的,其他用例可能会发现同样的问题。我在stackoverflow这里挖掘了一点,这个问题似乎是同样的问题。是的,因为你不能通过常规服务连接到self:使用无头服务。
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"