2022. 12. 7. 10:05ㆍInfra/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 인스턴스 외부 포트로 접속하면 아래와 같이 정상적으로 브로커가 동작함을 확인할 수 있습니다. 토픽 생성도 가능한데, 토픽을 생성했을 때 정상적으로 토픽 생성도 가능함을 확인했습니다.
'Infra > DevOps' 카테고리의 다른 글
[kafka] 카프카(kafka) 오픈소스 주요 개념정리 (0) | 2022.12.07 |
---|---|
[ERROR] kafka cluster 구성 후 --zookeeper 옵션 사용 시 에러 발생 (0) | 2022.12.07 |
Docker Compose로 MySQL Replication 구축 (1) | 2022.11.25 |