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:
#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.