web-dev-qa-db-fra.com

Kafka dans Docker ne fonctionne pas

J'essaie d'utiliser l'image wurstmeister\kafka-docker Avec docker-compose, Mais j'ai de réels problèmes pour tout connecter.

Tous les messages ou questions que je vérifie ne semblent pas poser de problèmes, mais je suis franchement perdu. (Et il y a au moins deux questions dans SO qui tentent de résoudre le problème)

Je crois que le problème est ma mauvaise compréhension de la mise en réseau de docker. Donc le problème:

Je peux consommer et produire à partir du même conteneur de kafka, mais lorsque j'essaie de créer un autre conteneur (ou d'utiliser mon ordinateur portable avec un client python client), plusieurs erreurs liées au advertised.Host.name Paramètre (dans l'image, ce paramètre est KAFKA_ADVERTISED_Host_NAME)

J'essaie déjà de définir cette variable de nombreuses manières, mais cela ne fonctionne tout simplement pas.

Je cherche donc une réponse (c.-à-d. Comment définir automatiquement ces paramètres et quelle est sa signification) (comment définir le docker-compose.yml

C'est à moi:

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"

MISE À JOUR

Suivant les conseils de @dnephin, j'ai modifié le start-kafka.sh Dans les lignes suivantes:

...
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
    export KAFKA_ADVERTISED_PORT=$(hostname -i)
fi
...

et retirez KAFKA_ADVERTISED_Host_NAME: "kafka" du docker-compose.yml

J'ai commencé les conteneurs de manière canonique:

docker-compose up -d

Les deux conteneurs fonctionnent:

$ 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 

Après j'ai fait:

docker-compose logs

Et tout se passe bien.

Pour vérifier les adresses 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

Ensuite, j'exécute dans deux consoles différentes:

Un producteur:

$ 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 consommateur:

$ 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 

Presque immédiatement, les avertissements commencent à voler sur tout l'écran:

[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

etc

Dans la console du producteur, j'ai écrit quelques phrases:

$ 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?

Et quelques instants plus tard, j'ai eu cette réponse:

[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)

Et dans le 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
...

PDATE 2

Je l'ai fait fonctionner, au moins, dans docker-machine:

Premièrement, j'ai défini une variable avec le nom du docker-machine:

DOCKER_VM=kafka_test

Ensuite, je modifie le docker-compose.yml Comme suit:

KAFKA_ADVERTISED_Host_NAME: "${DOCKER_MACHINE_IP}"

Enfin, dans l'environnement du docker-machine, J'exécute:

DOCKER_MACHINE_IP=$(docker-machine ip $DOCKER_VM) docker-compose up -d

Mais dans l'ordinateur portable (je veux dire, sans utiliser de machine virtuelle, ça ne marche pas)

43
nanounanue

Ma solution à ce problème est légèrement différente. Je configure Kafka pour annoncer sur kafka hôte et, car il est exposé sur l'ordinateur hôte sur localhost:9092, J'ajoute une entrée dans /etc/hosts pour kafka à résoudre en localhost. En faisant cela Kafka est accessible depuis les autres conteneurs Docker et depuis 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"

Fichier d'hôtes mis à jour:

more /etc/hosts
127.0.0.1       localhost kafka
23
radek1st

Pour développer une application dans localhost, il existe une solution dans le 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}'"

J'espère que cela aidera les autres ...

6
Shakil

Je crois que la valeur que vous utilisez pour KAFKA_ADVERTISED_Host_NAME Changera en fonction de la façon dont le conteneur peut être atteint.

Si vous essayez de vous connecter depuis un autre conteneur, utilisez kafka devrait être correct (tant que vous définissez ce nom comme alias de lien).

Si vous essayez de vous connecter à partir de l'hôte, ce nom ne fonctionnera pas. Vous devez utiliser l'adresse IP du conteneur, que vous pouvez obtenir en utilisant docker inspect. Cependant, l'adresse IP du conteneur va changer. Il est donc préférable de le définir depuis l'intérieur du conteneur en utilisant $(hostname -i) pour le récupérer.

2
dnephin

Essayez juste ce qui suit et utilisez la découverte de service par exemple celle-ci .

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

Ou vous utilisez celui-ci:

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
2
user2550587

voici une version améliorée de la réponse @ radek1st.

links est l'ancienne méthode du menu fixe, networks est la méthode actuelle.

imo, faire tout type de changement de système n'est pas bon et ne devrait jamais être nécessaire. cela va aussi à l'encontre de l'objectif d'utiliser 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:-kafka}
    depends_on:
      - zookeeper
    networks:
     - sb
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_Host_NAME: ${KAFKA_HOSTNAME:-kafka}
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${KAFKA_HOSTNAME:-kafka}:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

Ensuite, j'utilise le script follow bash pour commencer. Cela me permet de remplacer le Kafka nom d’hôte pour le développement local. ./startup.sh localhost

#!/bin/bash
echo KAFKA_HOSTNAME=${1:-kafka} > .env
docker-compose up -d

Lire la suite -

2
denov

Je résous ce problème, utilisez le code ci-dessous:

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
0
ssddn

Personnellement, j'avais le problème parce que le KAFKA_ADVERTISED_PORT: "9092" était manquant dans l'environnement 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
0
Moebius