Untuk deploy kafka, saya akan menggunakan docker agar lebih mudah. Saya menggunakan kafka dari wursmeister karena lebih ringan dibanding punya versi bitnami dan mempunyai dokumentasi yang cukup lengkap.


Deploy dengan docker-compose

Deploy dengan docker-compose.yml

  1. Buat docker-compose.yml file
version: "3.7"

services:
  # harus ada zookeeper!
  # zookeeper ini bekerja sebagai pengatur semua aktivitias di kafka
  zookeeper:
    container_name: zookeeper
    image: wurstmeister/zookeeper:latest
    ports:
      - "2181:2181"
    networks:
      - kafka-net

  kafka:
    container_name: kafka
    image: wurstmeister/kafka:latest
    #tidak ada port khusus untuk kafka
    #silahkan gunakan random port
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      #zookeeper container dan port
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      #bedakan port docker dan localhost
      KAFKA_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_LOCALHOST://kafka:9092
      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_LOCALHOST://localhost:9092
      #biar gampang, gunakan plaintext saja dulu
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER:PLAINTEXT,LISTENER_LOCALHOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER

    depends_on:
      - zookeeper
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - kafka-net

networks:
  kafka-net:
  1. Jalankan dengan docker-compose up -d. Untuk cek sudah jalan atau tidaknya, bisa dengan nc -zv localhost 9092 atau bila ingin menggunakan GUI bisa menggunakan offset explorer .
Akses Kafka dengan Offset Explorer

Akses Kafka dengan Offset Explorer


Penjelasan

Akses Kafka di Localhost

Yang sebenarnya perlu diperhatikan adalah di variabel KAFKA_LISTENERS & KAFKA_ADVERTISED_LISTERNERS

KAFKA_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_LOCALHOST://kafka:9092
KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_LOCALHOST://localhost:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER:PLAINTEXT,LISTENER_LOCALHOST:PLAINTEXT

Maka kafka hanya akan bisa di akses di localhost.

Akses Kafka di Docker Saja

Bila hanya perlu kafka di docker hapus saja LISTENER_LOCALHOST nya

KAFKA_LISTENERS: LISTENER_DOCKER://kafka:9091
KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER://kafka:9091
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER:PLAINTEXT

Nama dari LISTENER_DOCKER dan LISTENER_LOCALHOST bukan nama wajib, anda bebas mengganti nya dengan nama apapun juga, pastikan nama mudah di ingat dan dibedakan!

Akses Kafka untuk Local Subnet

Agar lebih mudah dibedakan maka LISTERNET_LOCALHOST akan saya ganti dengan LISTENER_INTRANET

KAFKA_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_INTRANET://kafka:9092
KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_INTRANET://192.168.1.2:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER:PLAINTEXT,LISTENER_INTRANET:PLAINTEXT

Bagaimana agar bisa di akses lewat internet? Tinggal di ganti IP local dengan IP public

Berikut contoh docker-compose.yml kafka agar bisa di akses lewat local subnet

version: "3.7"

services:

  zookeeper:
    container_name: zookeeper
    image: wurstmeister/zookeeper:latest
    ports:
      - "2181:2181"
    environment:
      ZOO_TICK_TIME: 400000
    networks:
      - kafka-net

  kafka:
    container_name: kafka
    image: wurstmeister/kafka:latest
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_INTRANET://kafka:9092
      KAFKA_ADVERTISED_LISTENERS: LISTENER_DOCKER://kafka:9091,LISTENER_INTRANET://192.168.1.2:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: LISTENER_DOCKER:PLAINTEXT,LISTENER_INTRANET:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: LISTENER_DOCKER

    depends_on:
      - zookeeper
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - kafka-net

networks:
  kafka-net: