Neuigkeiten von trion.
Immer gut informiert.

Kafka-Entwicklungsumgebung mit Docker und Docker Compose

title-logo

Dieser Artikel veranschaulicht den Aufbau einer Docker-basierten Entwicklungsumgebung für Kafka und zeigt, wie die benötigten Infrastrukturkomponenten auf einfache Weise mit Docker Compose bereitgestellt werden können.

Für die Entwicklungsumgebung werden unterschiedliche Komponenten benötigt, die in Docker Containern mit Hilfe von Docker Compose zur Verfügung gestellt werden sollen.

Neben dem Broker spielt der Key-Value-Store Apache Zookeeper eine zentrale Rolle beim Betrieb von Kafka. Zookeeper wird für die Bereitstellung von Konfigurationen, wie zum Beispiel vorhandenen Brokern und Kafka-Topics verwendet. Darüber hinaus nutzt Kafka Zookeeper für das Cluster-Management und die Leader-Election.

Für Kafka wird im folgendem das Docker Image von Confluent Inc. verwendet. Ein Image für Zookeeper wird direkt von Apache bereitgestellt.

Für die Übertragung von Daten mit Kafka wird das Serialisierungs-Framework Avro mit Schemaunterstützung verwendet. Aus diesem Grund wird zusätzlich eine Schema-Registry für den Austausch von Schemata zwischen produzierenden und konsumierenden Parteien benötigt. Diese wird ebenfalls von Confluent bereitgestellt.

Darüber hinaus werden die Kafka Topics UI und die Schema Registry UI von Landoop für die Visualisierung von Kafka-Topics und Avro-Schemata verwendet.

Damit die Kafka Topics UI Zugriff auf Kafka hat, wird zusätzlich ein Kafka REST Proxy benötigt, der für die Umsetzung des Kafka Protokolls nach HTTP zuständig ist.

Docker Compose

components

Die zuvor aufgeführten Komponenten werden in den folgenden Abschnitten in einem Compose File zusammengefasst und können anschließend mit Docker Compose gesteuert werden.

Für dieses Szenario müssen folgende Voraussetzungen erfüllt werden:

  • Docker Engine Version 17.04.0-ce

  • Docker Compose Version 1.12.0 oder höher

  • Compose File Version 2.1

Zookeeper

Im ersten Schritt wird Zookeeper konfiguriert. Dazu werden folgende Einstellungen in der docker-compose.yml vorgenommen:

version: '2.1'
services:
  zookeeper:
    image: zookeeper:3.4.10 # (1)
    ports:
      - "2181:2181" # (2)
...
  1. Zookeeper Image mit dem Tag (Version) 3.4.10

  2. Port Mapping für Zugriffe auf Zookeeper vom Hostsystem

Kafka

Kafka benötigt Zugriff auf den Zookeeper-Container um für den Betrieb benötigte Informationen in Zookeeper hinterlegen zu können. Die notwendigen Verbindungsinformationen werden wie folgt mit Hilfe von Umgebungsvariablen bereitgestellt:

...
  kafka:
    image: confluentinc/cp-kafka:3.2.1 # (1)
    ports:
      - "9092:9092" # (2)
    environment:
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181" # (3)
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://kafka:9092" # (4)
    depends_on: # (5)
      - zookeeper
...
  1. Kafka Image von Confluent mit dem Tag (Version) 3.2.1

  2. Port Mapping für Zugriffe auf Kafka vom Hostsystem

  3. Angabe der Verbindungsinformationen des Zookeeper-Containers

  4. Advertised Listeners gibt an, wie der Kafka-Broker von anderen Systemen erreicht werden kann

  5. Beschreibt die Abhängigkeit und Startreihenfolge der Docker-Container (Zookeeper wird vor Kafka gestartet)

Bei der Konfiguration von Kafka ist zu beachten, dass Kafka-Clients nicht unmittelbar auf einen bestimmte Kafka-Instanz in einem Kafka-Cluster zugreifen, sondern Zookeeper für die Auswahl verwenden. Die in Zookeeper hinterlegte Verbindungsinformation für eine einzelne Kafka-Instanz wird über die Umgebungsvariable KAFKA_ADVERTISED_LISTENERS gesteuert. Dies kann zu Problemen führen, wenn Kafka sowohl innerhalb als auch außerhalb des Docker-Netzwerks erreichbar sein soll, da der in Zookeeper hinterlegte Host-Name außerhalb des Docker-Netzwerks nicht ohne Weiteres aufgelöst werden kann.

Eine Lösung für dieses Problem ist, alle Komponenten im network_mode: "host" zu betreiben. Alternativ kann Kafka mit der oben gezeigten Einstellung betrieben werden und es muss ein Eintrag in der /etc/hosts für den Hostnamen kafka erstellt werden (127.0.0.1 kafka).

Schema-Registry

Die Schema-Registry benötigt sowohl Zugriff auf Zookeeper als auch auf Kafka. Zudem muss eine Listener-Definition bereitgestellt werden, die beim Start der Schema-Registry in Zookeeper hinterlegt wird.

schema-registry_ui

Die Konfiguration wird ebenfalls über Umgebungsvariablen bereitgestellt.

...
  kafka-schema-registry:
    image: confluentinc/cp-schema-registry:3.2.1 # (1)
    ports:
      - "8001:8001" # (2)
    environment:
      SCHEMA_REGISTRY_KAFKASTORE_CONNECTION_URL: zookeeper:2181 # (3)
      SCHEMA_REGISTRY_LISTENERS: http://kafka-schema-registry:8081 # (4)
    depends_on: # (5)
      - zookeeper
      - kafka
...
  1. Confluent Schema Registry Image mit dem Tag (Version) 3.2.1

  2. Port Mapping für Zugriffe auf die Schema-Registry vom Hostsystem

  3. Angabe der Verbindungsinformationen der Zookeeper-Instanz

  4. Listeners gibt an, wie die Schema-Registry erreicht werden kann (diese Information wird ebenfalls in Zookeeper hinterlegt)

  5. Beschreibt die Abhängigkeiten und die Startreihenfolge der Schema-Registry zu Zookeeper und Kafka

Rest-Proxy

Für das Monitoring der Kafka-Topics wird der Kafka REST Proxy und die Kafka Topics UI benötigt. Der REST Proxy benötigt dabei Zugriff auf Zookeeper, Kafka und die Schema-Registry.

Für die Schema-Registry UI wird lediglich Zugriff auf die Schema-Registry benötigt.

...
kafka-rest-proxy:
  image: confluentinc/cp-kafka-rest:3.2.1 # (1)
  ports:
    - "8082:8082" # (2)
  environment:
    KAFKA_REST_ZOOKEEPER_CONNECT: zookeeper:2181 # (3)
    KAFKA_REST_LISTENERS: http://kafka-rest-proxy:8082/ # (4)
    KAFKA_REST_SCHEMA_REGISTRY_URL: http://kafka-schema-registry:8081/ # (5)
    KAFKA_REST_HOST_NAME: kafka-rest-proxy # (6)
  depends_on: # (7)
    - zookeeper
    - kafka
    - kafka-schema-registry
...
  1. Kafka REST Proxy Image mit dem Tag (Version) 3.2.1

  2. Port Mapping für Zugriffe auf den REST Proxy vom Hostsystem

  3. Verbindungsinformationen für den Zugriff auf Zookeeper

  4. Angabe eines Listeners für den Zugriff auf den REST Proxy

  5. Verbindungsinformationen für den Zugriff auf die Schema-Registry für die Serialisierung und Deserialisierung von Avro-Nachrichten

  6. Spezifiziert den Hostnamen, der für die interne Generierung von URLs verwendet wird

  7. Beschreibt die Abhängigkeiten des REST Proxy zu Zookeeper, Kafka und der Schema-Registry

Kafka Topics UI

schema-registry_ui

Die Kafka Topics UI benötigt ausschließlich Zugriff auf den REST Proxy. Die Notwendige Konfiguration wird über Umgebungsvariablen bereitgestellt.

...
kafka-topics-ui:
  image: landoop/kafka-topics-ui:0.8.3 # (1)
  ports:
    - "8002:8000" # (2)
  environment:
    KAFKA_REST_PROXY_URL: http://kafka-rest-proxy:8082/ # (3)
    PROXY: "true" # (4)
  depends_on: # (5)
    - kafka-rest-proxy
...
  1. Kafka Topics UI Image mit dem Tag (Version) 0.8.3

  2. Port Mapping für Zugriffe auf die Kafka Topics UI vom Hostsystem

  3. Verbindungsinformationen für den Zugriff auf den REST Proxy

  4. Verhindert Probleme, die durch Cross-Origin Resource Sharing (CORS) verursacht werden

  5. Beschreibt die Abhängigkeiten der Kafka Topics UI zum REST Proxy

Kafka Schema-Registry UI

Die Schema-Registry UI benötigt Zugriff auf die Schema-Registry, der über folgende Konfiguration ermöglicht wird:

...
schema-registry-ui:
  image: landoop/schema-registry-ui:0.9.1 # (1)
  ports:
    - "8003:8000" # (2)
  environment:
    SCHEMAREGISTRY_URL: http://kafka-schema-registry:8081/ # (3)
    PROXY: "true" # (4)
  depends_on: # (5)
    - kafka-schema-registry
  1. Schema-Registry UI Image mit dem Tag (Version) 0.9.1

  2. Port Mapping für Zugriffe auf die Schema-Registry UI vom Hostsystem

  3. Verbindungsinformationen für den Zugriff auf die Schema-Registry

  4. Verhindert Probleme, die durch Cross-Origin Resource Sharing (CORS) verursacht werden

  5. Beschreibt die Abhängigkeiten der Schema-Registry UI zur Schema-Registry

Verwendung

Die Docker Container können mit docker-compose up gestartet werden.

Die folgende Tabelle zeigt eine Übersicht der Services und die entsprechenden Verbindungsinformationen vom Hostsystem.

Service Host:Port

Kafka

localhost:9092

Zookeeper

localhost:2181

Schema-Registry

localhost:8001

Kafka-Topics UI

localhost:8002

Schema-Registry UI

localhost:8003

Das komplette Compose File ist unter docker-compose.yml verfügbar.




Zu den Themen Docker und Kafka bieten wir sowohl Unterstützung als auch passende Schulungen an:

Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.