Kubernetes上的Kafka图表:简单的测试字符串产生+消耗

时间:2018-08-07 16:54:24

标签: docker kubernetes apache-kafka confluent

我安装了孵化器卡夫卡图。撰写本文时,版本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时,它永远不会收到分配给一个主题分区的通知回调。

1 个答案:

答案 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服务与自己抗衡,并且其领导者选举失败。我发现它在容器部署环境中非常脆弱。