[Kafka] Kafka Cluster Docker-compose로 구축하기

2022. 12. 7. 10:05Infra/DevOps

Kafka Cluster를 Docker-Compose로 구축하는 예제입니다. kafka 이미지를 Docker Hub에서 검색해보면 bitnami에서 제공하는 이미지가 가장 다운로드 횟수가 많습니다. 하지만 찾아보니 현재 kafka는 confluent라는 회사에서 실질적으로 유지관리 및 기능 개발을 진행하고 있다고 합니다. 그리고 Apache 재단에서 하는 kafka와 동일한 기능을 제공하지만, 버전 매핑 방식등이 조금 차이가 있어서 어떤 이미지를 사용할까 고민을 했는데, 일단 저는 현재 해당 오픈소스를 관리하는 회사의 이미지를 사용해야 된다고 생각하여 'confluentinc/cp-kafka' 이미지를 사용하였습니다. 이것도 일단 다운로드 횟수가 적지 않기에 사용에 무방하다고 생각합니다.

 

( bitnami 이미지가 사실 설명이 조금 더 상세하게 되어있고, 관리가 되고 있다는 생각이 들기는 합니다. 둘다 동작 시켜보았는데, 개발과정에서 테스트 정도는 문제가 없다고 판단되었고, 운영적인 측면에서 좀 더 상세하게 디테일을 설정할 때 아마도 영향이 있지 않을까 싶습니다.  bitnami 테스트 yaml 링크)

 


구축에 필요한 오픈소스 및 이미지

  • docker-compse : version 1.29.1, build c34c88b2
  • zookeeper : confluentinc/cp-zookeeper:latest
  • kafka : confluentinc/cp-kafka:latest
  • kafdrop : obsidiandynamics/kafdrop:latest

설명

로컬에 구축한 환경입니다. 주키퍼 인스턴스 하나와 카프카 브로커 인스턴스 세대, 그리고 kafdrop 인스턴스 하나를 띄웠습니다. 카프카 브로커는 내부적으로는 9092 포트를 사용하고, 외부 포트는 9093, 9094, 9095를 사용하고 있습니다. 

 

docker-compose.yaml

version: "3.9"

networks:
  kafka-cluster:
    driver: bridge

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      # ZOOKEEPER_SERVER_ID: 1
      ZOOKEEPER_CLIENT_PORT: 2181
      # ZOOKEEPER_TICK_TIME: 2000
      # ZOOKEEPER_SERVERS: "zookeeper:22888:23888"
      KAFKA_OPTS: "-Dzookeeper.4lw.commands.whitelist=*"
    ports:
      - 2181:2181
    restart: unless-stopped
    networks:
      - kafka-cluster

  kafka1:
    image: confluentinc/cp-kafka:latest
    container_name: kafka1
    depends_on:
      - zookeeper
    ports:
      - "9093:9093"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: CLIENT://:9092,EXTERNAL://:9093
      KAFKA_ADVERTISED_LISTENERS: CLIENT://kafka1:9092,EXTERNAL://localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: CLIENT
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
    restart: unless-stopped
    networks:
      - kafka-cluster

  kafka2:
    image: confluentinc/cp-kafka:latest
    container_name: kafka2
    depends_on:
      - zookeeper
    ports:
      - "9094:9094"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: CLIENT://:9092,EXTERNAL://:9094
      KAFKA_ADVERTISED_LISTENERS: CLIENT://kafka2:9092,EXTERNAL://localhost:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: CLIENT
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
    restart: unless-stopped
    networks:
      - kafka-cluster

  kafka3:
    image: confluentinc/cp-kafka:latest
    container_name: kafka3
    depends_on:
      - zookeeper
    ports:
      - "9095:9095"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: CLIENT://:9092,EXTERNAL://:9095
      KAFKA_ADVERTISED_LISTENERS: CLIENT://kafka3:9092,EXTERNAL://localhost:9095
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: CLIENT
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
    restart: unless-stopped
    networks:
      - kafka-cluster

  kafdrop:
    image: obsidiandynamics/kafdrop:latest
    container_name: kafdrop
    ports:
      - "9000:9000"
    environment:
      KAFKA_BROKERCONNECT: kafka1:9092,kafka2:9092,kafka3:9092
      JVM_OPTS: "-Xms320M -Xmx640M -XX:-TieredCompilation -XX:+UseStringDeduplication -noverify"
      SERVER_PORT: 9000
      MANAGEMENT_SERVER_PORT: 9000
    depends_on:
      - kafka1
    networks:
      - kafka-cluster

 


동작 확인

CLI 명령어를 사용해서 확인가능하겠지만, kafdrop을 함께 사용하기에 kafdrop 인스턴스 외부 포트로 접속하면 아래와 같이 정상적으로 브로커가 동작함을 확인할 수 있습니다. 토픽 생성도 가능한데, 토픽을 생성했을 때 정상적으로 토픽 생성도 가능함을 확인했습니다.