在Docker群上构build一个多节点的Kafka集群

我find了这个卡夫卡的docker形象

https://hub.docker.com/r/spotify/kafka/ 

我可以使用链接中logging的命令轻松创build一个docker容器

 docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`boot2docker ip` --env ADVERTISED_PORT=9092 spotify/kafka 

这很好。 但是我想configuration一个运行在docker swarm上的“多个”节点的Kafka集群。

我怎样才能做到这一点?

编辑28/11/2017:

Kafka添加了listener.security.protocol.map到他们的configuration 。 这允许你设置不同的监听地址和协议,这取决于你是在群内还是群外,并且阻止Kafka被Docker中发生的任何负载平衡或ip转换弄糊涂。 Wurstmeister有一个工作的docker图像和示例撰写文件在这里 。 我尝试了一段时间后,几个docker机节点设置为一个群体,它似乎工作。

tbh虽然我只是附加一个Kafka图像覆盖networking,并运行卡夫卡控制台命令时,我想现在与它进行交互。

希望有所帮助


老东西下面

我一直在使用docker swarm模式的Docker 1.12

创build节点

 docker-machine create -d virtualbox master docker-machine create -d virtualbox slave master_config=$(docker-machine config master | tr -d '\"') slave_config=$(docker-machine config slave | tr -d '\"') master_ip=$(docker-machine ip master) docker $master_config swarm init --advertise-addr $master_ip --listen-addr $master_ip:2377 worker_token=$(docker $master_config swarm join-token worker -q) docker $slave_config swarm join --token $worker_token $master_ip:2377 eval $(docker-machine env master) 

创buildzookeeper服务

 docker service create --name zookeeper \ --constraint 'node.role == manager' \ -p 2181:2181 \ wurstmeister/zookeeper 

创build卡夫卡服务

 docker service create --name kafka \ --mode global \ -e 'KAFKA_PORT=9092' \ -e 'KAFKA_ADVERTISED_PORT=9092' \ -e 'KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092' \ -e 'KAFKA_ZOOKEEPER_CONNECT=tasks.zookeeper:2181' \ -e "HOSTNAME_COMMAND=ip r | awk '{ ip[\$3] = \$NF } END { print ( ip[\"eth0\"] ) }'" \ --publish '9092:9092' \ wurstmeister/kafka 

尽pipe由于某种原因,这只能在入口或用户定义的覆盖networking内工作,如果您尝试通过其中一台客户机连接到Kafka,则连接将断开。

改变广告的IP并不会让事情变得更好…

 docker service create --name kafka \ --mode global \ -e 'KAFKA_PORT=9092' \ -e 'KAFKA_ADVERTISED_PORT=9092' \ -e 'KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092' \ -e 'KAFKA_ZOOKEEPER_CONNECT=tasks.zookeeper:2181' \ -e 'KAFKA_LOG_DIRS=/kafka/kafka-logs' \ -e "HOSTNAME_COMMAND=curl 192.168.99.1:5000" \ --publish '9092:9092' \ wurstmeister/kafka 

我认为Docker中的新的网状networking和负载平衡可能会干扰Kafka连接。

获取主机容器我有一个烧瓶应用程序在本地运行,我curl

 from flask import Flask from flask import request app = Flask(__name__) @app.route('/') def hello_world(): return request.remote_addr 

以前的方法提出了一些问题:

  1. 如何指定zookeeper节点的ID?
  2. 如何指定卡夫卡节点和动物园pipe理员节点的ID?

#kafka configs echo "broker.id=${ID} advertised.host.name=${NAME} zookeeper.connect=${ZOOKEEPERS}" >> /opt/kafka/config/server.properties

一切都应该可以在覆盖networking中解决。

而且,在这个问题中,由于路由网状networking无法创buildKafka服务和发布端口,因此不要使用ingressnetworking。

我认为最好的select是通过使用docker和swarm组合来指定你的服务。 我将用一个例子来编辑答案。

在server.properties中设置broker.id = -1以允许kafka自动生成代理标识。 在群模式中有用。