Costruire un cluster multiplo nodo Kafka sullo swing docker

Ho trovato questa image docker per Kafka

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

e posso facilmente creare un contenitore docker utilizzando il command documentato nel link

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

Questo è buono. Ma voglio configurare un cluster "Kafka" nodo "multiplo" in esecuzione su un raggruppamento.

Come lo posso fare?

Ho provato questo con il docker 1.12 utilizzando la modalità docker swarm

creare nodes

 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) 

creare il servizio zookeeper

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

creare il servizio 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 

Anche se per qualche motivo ciò funziona solo all'interno della networking di overlay di ingresso o utente e la connessione si romperà a Kafka se si tenta di connettersi ad essa tramite una delle macchine guest.

Cambiare l'IP pubblicizzato non rende le cose migliori …

 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=curl 192.168.99.1:5000" \ --publish '9092:9092' \ wurstmeister/kafka 

Penso che il nuovo networking mesh e il bilanciamento del carico in docker potrebbero interferire con la connessione Kafka alcuni come ….

per get il contenitore host ho un'applicazione a flask che funziona localmente e che mi avvolge

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

L'approccio precedente solleva alcune domande:

  1. Come specificare gli ID per i nodes zookeeper?
  2. Come specificare l'id dei nodes kafka ei nodes zookeeper?

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

Tutto dovrebbe essere risolvibile nella networking di sovrapposizione.

Inoltre, nell'edizione Non è ansible creare un servizio Kafka e pubblicare le porte a causa della networking di rout mesh c'è un commento per non utilizzare la networking di accesso.

Penso che l'opzione migliore sia quella di specificare il tuo servizio utilizzando un compositore composto da uno swarm . Modificherò la risposta con un esempio.

impostare broker.id = -1 in server.properties per consentire a kafka di generare automaticamente l'ID broker. Utile in modalità Swarm.