我安装了孵化器卡夫卡图。撰写本文时,版本kafka-0.8.5
。
helm install --name kafka \
--set replicas=1 \
--set persistence.enabled=false \
--set zookeeper.replicaCount=1 \
incubator/kafka
要尝试此操作,我使用Kafka cli工具运行一个单独的pod,仅作为bash shell。我使用的是confluentinc/cp-kafka:4.1.1-2
pod所使用的完全相同的Docker映像kafka-0
,因此客户端和服务器之间存在完美的版本匹配:
kubectl run shell --rm -i --tty --image confluentinc/cp-kafka:4.1.1-2 -- /bin/bash
列出主题,发布消息,获取主题偏移都可以正常工作,如下所示。但是,当我尝试运行kafka-console-consumer
并查看主题中的测试记录时,它会无限期挂起。为什么?
root@shell-5c6ddf5d99-tbsvm:/# /usr/bin/kafka-topics --zookeeper kafka-zookeeper:2181 --list
__confluent.support.metrics
root@shell-5c6ddf5d99-tbsvm:/# echo "abcxyz" | /usr/bin/kafka-console-producer --broker-list kafka:9092 --topic test-topic
>[2018-08-07 16:43:26,110] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {test-topic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)
root@shell-5c6ddf5d99-tbsvm:/# /usr/bin/kafka-topics --zookeeper kafka-zookeeper:2181 --list
__confluent.support.metrics
test-topic
root@shell-5c6ddf5d99-tbsvm:/# /usr/bin/kafka-run-class kafka.tools.GetOffsetShell --broker-list kafka:9092 --topic test-topic --time -1
test-topic:0:1
root@shell-5c6ddf5d99-tbsvm:/# /usr/bin/kafka-console-consumer --bootstrap-server kafka:9092 --from-beginning --topic test-topic
<hangs indefinitely>
仅供参考,这是一个本地minikube开发集群,其最新的minikube带有Kubernetes 1.10.x服务器端和1.10.x kubectl客户端工具。这是一个干净的新minikube,除了kafka,kafka-zookeeper和我的Shell Pod之外,没有其他任何运行。
此外,编写一个小型Java客户端测试应用程序以使用它也会得到类似的结果,即无限期地轮询而没有消息。当我的Java客户端订阅test-topic
时,它永远不会收到分配给一个主题分区的通知回调。
答案 0 :(得分:1)
我自己花了几个小时,其中有一个bug in minikube阻止了Kafka的工作。
我对Helm部署不熟悉,但是您必须确保两件事。首先,Kafka广告主机必须与您的Kubernetes服务IP(或kube dns中的DNS名称)相同,其次,您必须将minikube的网络接口设置为混杂模式:
minikube ssh sudo ip link set docker0 promisc on
如果您不执行此解决方法,则kafka无法通过Kubernetes服务与自己抗衡,并且其领导者选举失败。我发现它在容器部署环境中非常脆弱。