remove - Kafka en Docker no funciona
download docker image (8)
Acabo de actualizar mi archivo host y agregué
127.0.0.1 localhost kafkaserver
Es un buen trabajo para mí, usé la misma imagen de ventana acoplable en Windows 10
Estoy tratando de usar wurstmeister/kafka-docker
image con docker-compose
, pero estoy teniendo problemas reales al conectar todo.
Todos los mensajes o preguntas que verifico parecen no tener ningún problema, pero estoy francamente perdido. (Y hay al menos dos preguntas en SO que intentan abordar el problema)
Creo que el problema es mi escasa comprensión de las redes de la docker
. Así que el problema:
Puedo consumir y producir desde el mismo contenedor de kafka, pero cuando intento crear otro contenedor (o uso mi computadora portátil con un cliente de Python) recibí varios errores relacionados con el parámetro advertised.host.name
(en la imagen, este parámetro es KAFKA_ADVERTISED_HOST_NAME
)
Ya intenté configurar esta variable de muchas maneras, pero simplemente no funciona.
Así que estoy buscando una respuesta autoritativa (es decir, cómo establecer automáticamente esos parámetros y qué significa) cómo configurar la docker-compose.yml
Esto es mío:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
# hostname: kafka
ports:
- "9092"
links:
- zookeeper:zk
environment:
KAFKA_ADVERTISED_HOST_NAME: "kafka"
KAFKA_ADVERTISED_PORT: "9092"
KAFKA_ZOOKEEPER_CONNECT: "zk:2181"
ACTUALIZAR
Siguiendo los consejos de @dnephin, modifiqué el start-kafka.sh
en las siguientes líneas:
...
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
export KAFKA_ADVERTISED_PORT=$(hostname -i)
fi
...
y elimine KAFKA_ADVERTISED_HOST_NAME: "kafka"
de la docker-compose.yml
Comencé los contenedores de forma canónica:
docker-compose up -d
Ambos contenedores se están ejecutando:
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------
infraestructura_kafka_1 start-kafka.sh Up 0.0.0.0:32768->9092/tcp
infraestructura_zookeeper_1 /opt/zookeeper/bin/zkServe ... Up 0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp
Después hice:
docker-compose logs
Y todo va bien.
Para comprobar las direcciones ip:
$ KAFKA_IP=$(docker inspect --format ''{{ .NetworkSettings.IPAddress }}'' infraestructura_kafka_1)
$ echo $KAFKA_IP
172.17.0.4
and
$ ZK_IP=$(docker inspect --format ''{{ .NetworkSettings.IPAddress }}'' infraestructura_zookeeper_1)
$ echo $ZK_IP
172.17.0.3
Luego lo ejecuto en dos consolas diferentes:
Un productor:
$ docker run --rm --interactive wurstmeister/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-producer.sh --topic grillo --broker-list 171.17.0.4:9092
Un consumidor:
$ docker run --rm --interactive wurstmeister/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-consumer.sh --topic grillo --from-beginning --zookeeper 172.17.0.3:2181
Casi inmediatamente, las advertencias comienzan a volar por toda la pantalla:
[2016-03-11 00:39:17,010] WARN Fetching topic metadata with correlation id 0 for topics [Set(grillo)] from broker [BrokerEndPoint(1001,ba53d4fd7595,9092)] failed (kafka.client.ClientUtils$)
java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74)
at kafka.producer.SyncProducer.send(SyncProducer.scala:119)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
[2016-03-11 00:39:17,013] WARN [console-consumer-79688_9dd5f575d557-1457656747003-f1ed369d-leader-finder-thread], Failed to find leader for Set([grillo,0]) (kafka.consumer.ConsumerFetcherManager$LeaderFin
derThread)
kafka.common.KafkaException: fetching topic metadata for topics [Set(grillo)] from broker [ArrayBuffer(BrokerEndPoint(1001,ba53d4fd7595,9092))] failed
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
Caused by: java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74)
at kafka.producer.SyncProducer.send(SyncProducer.scala:119)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
... 3 more
y así
En la consola del productor, escribí unas frases:
$ docker run --rm --interactive klustera/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-producer.sh --topic grillo --broker-list 171.17.0.4:9092
Hola
¿Cómo estáń?
¿Todo bien?
Y unos momentos después, recibí esta respuesta:
[2016-03-11 00:39:28,955] ERROR Error when sending message to topic grillo with key: null, value: 4 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
[2016-03-11 00:40:28,956] ERROR Error when sending message to topic grillo with key: null, value: 16 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
[2016-03-11 00:41:28,956] ERROR Error when sending message to topic grillo with key: null, value: 12 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
Y en la docker-compose logs
...
zookeeper_1 | 2016-03-11 00:39:07,072 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@651] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create c
xid:0x2 zxid:0x47 txntype:-1 reqpath:n/a Error Path:/consumers Error:KeeperErrorCode = NodeExists for /consumers
zookeeper_1 | 2016-03-11 00:39:07,243 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@651] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create c
xid:0x19 zxid:0x4b txntype:-1 reqpath:n/a Error Path:/consumers/console-consumer-79688/owners/grillo Error:KeeperErrorCode = NoNode for /consumers/console-consumer-79688/owners/grillo
zookeeper_1 | 2016-03-11 00:39:07,247 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@651] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create $xid:0x1a zxid:0x4c txntype:-1 reqpath:n/a Error Path:/consumers/console-consumer-79688/owners Error:KeeperErrorCode = NoNode for /consumers/console-consumer-79688/owners
...
ACTUALIZACIÓN 2
Lo hice funcionar, al menos, en docker-machine
:
Primero, definí una variable con el nombre de la docker-machine
:
DOCKER_VM=kafka_test
Luego, docker-compose.yml
el docker-compose.yml
siguiente manera:
KAFKA_ADVERTISED_HOST_NAME: "${DOCKER_MACHINE_IP}"
Por último, en el entorno de la docker-machine
, ejecuto:
DOCKER_MACHINE_IP=$(docker-machine ip $DOCKER_VM) docker-compose up -d
Pero en la computadora portátil (es decir, sin usar una máquina virtual, no funciona)
Aquí hay una versión mejorada de @ radek1st respuesta.
links
son el antiguo modo de links
, las networks
son el método actual.
imo, hacer cualquier tipo de cambio de sistema no es bueno y nunca debería ser necesario. También de alguna manera derrota el propósito de usar Docker.
version: ''2.1''
networks:
sb:
driver: bridge
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
hostname: zookeeper
networks:
- sb
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
container_name: kafka
hostname: ${KAFKA_HOSTNAME:-kakfa}
depends_on:
- zookeeper
networks:
- sb
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_HOST_NAME: ${KAFKA_HOSTNAME:-kakfa}
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${KAFKA_HOSTNAME:-kakfa}:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
Luego uso el script follow bash para comenzar cosas. Esto me permite anular el nombre de host Kafka para el desarrollo local. ./startup.sh localhost
#!/bin/bash
echo KAFKA_HOSTNAME=${1:-kakfa} > .env
docker-compose up -d
Lee mas -
Creo que el valor que use para KAFKA_ADVERTISED_HOST_NAME
cambiará dependiendo de cómo se pueda llegar al contenedor.
Si está intentando conectarse desde otro contenedor, el uso de kafka
debería ser correcto (siempre y cuando configure el nombre como alias de enlace).
Si está intentando conectarse desde el host, ese nombre no va a funcionar. Necesitará usar la dirección IP del contenedor, que puede obtener usando la función de docker inspect
. Sin embargo, la dirección IP del contenedor cambiará, por lo que podría ser mejor configurarlo desde dentro del contenedor usando $(hostname -i)
para recuperarlo.
Mi solución a este problema es ligeramente diferente. Configuré Kafka para publicitar en el host de kafka
y, como está expuesto en la máquina del host en localhost:9092
, agrego una entrada en /etc/hosts
para que kafka
resuelva a localhost
. Al hacer esto, se puede acceder a Kafka desde los otros contenedores de Docker y desde localhost.
docker-compose.yml:
my-web-service:
build: ./my-web-service
ports:
- "8000:8000"
links:
- kafka
kafka:
image: "wurstmeister/kafka:0.10.2.0"
ports:
- "9092:9092"
hostname: kafka
links:
- zookeeper
environment:
- KAFKA_ADVERTISED_HOST_NAME=kafka
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- KAFKA_ADVERTISED_PORT=9092
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
Archivo de hosts actualizado:
more /etc/hosts
127.0.0.1 localhost kafka
Para desarrollar aplicaciones en localhost, hay una solución en la documentation : "HOSTNAME_COMMAND"
kafka:
image: wurstmeister/kafka
ports:
- 9092:9092
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
HOSTNAME_COMMAND: "route -n | awk ''/UG[ /t]/{print $$2}''"
Espero que esto ayude a otros ...
Personalmente, tuve el problema porque KAFKA_ADVERTISED_PORT: "9092"
faltaba en el entorno kafka.
kafka:
image : wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
KAFKA_ADVERTISED_PORT: "9092"
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper
Resuelvo este problema usar el código siguiente:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
depends_on:
- zookeeper
environment:
HOSTNAME_COMMAND: "ifconfig eth0 | grep ''inet addr'' | awk ''{ print $$2}'' | awk -F: ''{print $$2}''''"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Solo intente lo siguiente y use el descubrimiento de servicios, por ejemplo, este .
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
build: .
ports:
- "9092:9092"
links:
- zookeeper:zk
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.59.103
KAFKA_ADVERTISED_PORT: 9092
KAFKA_CREATE_TOPICS: "test:1:1"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
O usas este:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181"
kafka:
build: .
ports:
- "9092"
links:
- zookeeper:zk
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.59.103
DOCKER_HOST: 192.168.59.103:2375
volumes:
- /var/run/docker.sock:/var/run/docker.sock