[英]kafka on kubernetes cannot produce/consume topics (ClosedChannelException, ErrorLoggingCallback)
[英]Creating topics, but getting Kafka FailedPayloadsError with Python on Kubernetes
我在python kafka库中使用了SimpleProducer。 该脚本以前可以与我尝试过的其他更难配置的kafka设置完美配合。
kafka = KafkaClient(u'[masterNodeIp]:[servicePort]')
producer = SimpleProducer(kafka)
#make a simple message, while true run
producer.send_messages(b'oneMoreTopic', sentence)
一次运行此脚本后,我会在python-console中收到此响应。
kafka.common.LeaderNotAvailableError: TopicMetadata(topic='oneMoreTopic', error=5, partitions=[])
然后,我可以在zookeeper.log上进入“节点”,然后查看:
2015-09-14 12:16:32,276 - INFO [ProcessThread(sid:3 cport:-1)::PrepRequestProcessor@627] - Got user-level KeeperException when processing sessionid:0x34fcb982d030000 type:setData cxid:0x71 zxid:0x1000000d8 txntype:-1 reqpath:n/a Error Path:/config/topics/oneMoreTopic Error:KeeperErrorCode = NoNode for /config/topics/oneMoreTopic
2015-09-14 12:16:32,278 - INFO [ProcessThread(sid:3 cport:-1)::PrepRequestProcessor@627] - Got user-level KeeperException when processing sessionid:0x34fcb982d030000 type:create cxid:0x72 zxid:0x1000000d9 txntype:-1 reqpath:n/a Error Path:/config/topics Error:KeeperErrorCode = NodeExists for /config/topics
2015-09-14 12:16:32,302 - INFO [ProcessThread(sid:3 cport:-1)::PrepRequestProcessor@627] - Got user-level KeeperException when processing sessionid:0x34fcb982d030000 type:create cxid:0x7b zxid:0x1000000dc txntype:-1 reqpath:n/a Error Path:/brokers/topics/oneMoreTopic/partitions/0 Error:KeeperErrorCode = NoNode for /brokers/topics/oneMoreTopic/partitions/0
2015-09-14 12:16:32,304 - INFO [ProcessThread(sid:3 cport:-1)::PrepRequestProcessor@627] - Got user-level KeeperException when processing sessionid:0x34fcb982d030000 type:create cxid:0x7c zxid:0x1000000dd txntype:-1 reqpath:n/a Error Path:/brokers/topics/oneMoreTopic/partitions Error:KeeperErrorCode = NoNode for /brokers/topics/oneMoreTopic/partitions
这似乎只是Zookeeper为该主题创建了一个新的Znode,因为它以前没有出现过。 和Kafka server.log打印:
[2015-09-14 12:16:32,282] INFO Topic creation {"version":1,"partitions":{"0":[10200119]}} (kafka.admin.AdminUtils$)
[2015-09-14 12:16:32,287] INFO [KafkaApi-10200219] Auto creation of topic oneMoreTopic with 1 partitions and replication factor 1 is successful! (kafka.server.KafkaApis)
[2015-09-14 12:16:51,579] INFO Closing socket connection to /10.240.1.94. (kafka.network.Processor)
但是,我的消息从未发布到该主题,而下次我运行python-script时,我总是得到:
kafka.common.FailedPayloadsError
在我使其正常工作的情况下,advertised.host.name始终是节点的外部IP,但是我似乎无法通过Kubernetes来实现。 是否有可能使外部IP可从容器中调用?
对于所有代理,我的kafka / config / server.properties看起来都像这样:
broker.id=10200121
host.name=kafka-f8p06
advertised.host.name=kafka-f8p06
++
broker.id=10200121
host.name=kafka-f8p06 <----- use IP here
advertised.host.name=kafka-f8p06 <---- use IP here
我认为您应该为host.name
和advertised.host.name
设置IP,因为K8s不能按主机名解析Pod,但可以按IP解析。
您的kafka节点可能无法以这种方式互相交谈,也找不到领导者。
我的问题的根本原因是通过确保所有节点都可以通过互联网到达互联网来解决
sudo iptables -t nat -A POSTROUTING ! -d 10.0.0.0/8 -o ens4v1 -j MASQUERADE
此后,我将advertised.host.name更改为尝试从中访问代理的外部IP地址。 因此,如果我的GCE节点位于156.99.33.101上,并且在33777上为我的kafka服务打开了nodePort,我将输入:
advertised.host.name=156.99.33.101
advertised.host.port=33777
advertised.host.name是当一个经纪人收到请求时kafka用于连接回自身的内容,因此,使用外部地址至少可使它可访问。 尽管我不确定将其定向到本地地址空间之外是否有任何后果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.