设置
笔记本电脑: -
- 虚拟机虚拟机中的Kafka:从笔记本电脑的 localhost 转发的 vagrant 9092 端口
- 虚拟机虚拟机中的Kubernetes 集群:miniKube
期望的结果
我的 miniKube 集群上的微服务可以向 Kafka 虚拟机发送消息。请注意,这适用于 Google Container Engine (GKE)
实际结果
从笔记本电脑上,我可以使用控制台生产者向 Kafka VM 发送消息,它很乐意将这些消息添加到主题中。但是当来自 kubernetes 集群的微服务发送消息时,会收到消息但不会添加到主题中。
相反,我在微服务上收到错误...
Batch containing 1 record(s) expired due to timeout while requesting metadata from brokers for generated-test-script-0
如果我尾随 kafka-request.log 我会看到...
[2017-02-08 21:57:05,891] TRACE Completed request:{api_key=3,api_version=1,correlation_id=0,client_id=producer-5} -- {topics=[generated-test-script]} from connection 10.0.2.15:9092-10.0.2.2:50124;totalTime:0,requestQueueTime:0,localTime:0,remoteTime:0,responseQueueTime:0,sendTime:0,securityProtocol:PLAINTEXT,principal:User:ANONYMOUS (kafka.request.logger)
在“成功”的情况下,当我简单地在笔记本电脑上使用控制台生产者时,我看到了 2 行。1 与上面相同,但我猜另一个 ACK ...
[2017-02-08 22:08:12,764] TRACE Completed request:{api_key=3,api_version=2,correlation_id=0,client_id=console-producer} -- {topics=[test]} from connection 10.0.2.15:9092-10.0.2.2:50748;totalTime:6,requestQueueTime:0,localTime:6,remoteTime:0,responseQueueTime:0,sendTime:0,securityProtocol:PLAINTEXT,principal:User:ANONYMOUS (kafka.request.logger)
[2017-02-08 22:08:13,799] TRACE Completed request:{api_key=0,api_version=2,correlation_id=1,client_id=console-producer} -- {acks=1,timeout=1500,topic_data=[{topic=test,data=[{partition=0,record_set=java.nio.HeapByteBuffer[pos=0 lim=39 cap=39]}]}]} from connection 10.0.2.15:9092-10.0.2.2:53696;totalTime:22,requestQueueTime:1,localTime:21,remoteTime:0,responseQueueTime:0,sendTime:0,securityProtocol:PLAINTEXT,principal:User:ANONYMOUS (kafka.request.logger)
结论与思考
所以在kafka服务器端没有错误,只是在客户端。我的猜测是这是一个网络问题设置(NAT?),虚拟 Kubernetes 集群中的微服务可以与我的 Kafka 虚拟机通信,但回复路由被丢弃?
Kafka 需要在第一个发送的消息上返回元数据,因此使批量大小 == 0 或“acks”= 0 并没有真正帮助作为 hack,因为最初需要发回此元数据。
任何想法或指示都会很棒,因为我真的想在本地运行这个集群和 Kafka VM 以进行开发工作。