在docker swarm上构建一个多节点Kafka集群

Kno*_*uch 11 apache-kafka docker docker-swarm

我为Kafka找到了这个docker图像

https://hub.docker.com/r/spotify/kafka/
Run Code Online (Sandbox Code Playgroud)

我可以使用链接中记录的命令轻松创建一个docker容器

docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`boot2docker ip` --env ADVERTISED_PORT=9092 spotify/kafka
Run Code Online (Sandbox Code Playgroud)

这很好.但我想配置一个在docker swarm上运行的"多个"节点Kafka集群.

我怎样才能做到这一点?

Ric*_*hie 7

编辑28/11/2017:

Kafka添加listener.security.protocol.map到他们的配置中.这允许您根据您是在群集内部还是在群集外部来设置不同的侦听器地址和协议,并阻止Kafka对docker中发生的任何负载平衡或ip转换感到困惑.Wurstmeister 在这里有一个工作的docker图像和示例撰写文件.我试了一会儿,将几个docker机器节点设置为一个群,它似乎工作.

虽然我只是将Kafka图像附加到覆盖网络并运行Kafka控制台命令,但我现在想要与它进行交互.

希望有所帮助


下面的旧东西

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

创建节点

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)
Run Code Online (Sandbox Code Playgroud)

创建zookeeper服务

docker service create --name zookeeper \
    --constraint 'node.role == manager' \
    -p 2181:2181 \
    wurstmeister/zookeeper
Run Code Online (Sandbox Code Playgroud)

创建kafka服务

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
Run Code Online (Sandbox Code Playgroud)

虽然由于某种原因,这只能在入口或用户定义的覆盖网络中工作,如果您尝试通过其中一台客户机连接到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
Run Code Online (Sandbox Code Playgroud)

我认为docker中的新网状网络和负载均衡可能会干扰Kafka连接的一些方式....

为了得到主机容器我有一个本地运行的烧瓶应用程序,我卷曲

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return request.remote_addr
Run Code Online (Sandbox Code Playgroud)