
1. 서론
docker-compose 를 사용하여 kafka를 생성해보도록 하겠습니다.
docker를 이용하여 kafka를 구성할 경우 크게 bitnami와 apache를 사용하는데 이번에는 bitnami를 사용하여 구성하도록 하겠습니다.
apache를 이용하여 구성하고 싶었지만 현재 kafka 내부적으로 주키퍼의 의존성을 제거하고 KRaft를 사용하도록 방침이 바뀌면서 구성에 변경점이 많이 생겼습니다.
현재시점에서 비트나미와 아파치 모두 최신 버전으로 구성을 할 경우 아파치 버전에서 주키퍼에 대한 오류가 발생하고 있으므로 docker-compose를 구성해보고 사용해보도록 하겠습니다.
해당 docker-compose를 사용한 환경은 ubuntu 입니다.
2. docker-compose 구성
# https://github.com/bitnami/containers/blob/main/bitnami/kafka/docker-compose.yml
services:
kafka:
# 사용 이미지 지정
image: docker.io/bitnami/kafka:latest
# 컨테이너 명 지정
container_name: kafka
# 사용 포트 지정
ports:
- "9092:9092"
# 재시작 설정
restart: always
volumes:
- ./kafka-data:/opt/bitnami/kafka/data
environment:
#- KAFKA_ADVERTISED_HOST_NAME=127.0.0.1
# KRaft settings
- KAFKA_CFG_NODE_ID=0
- KAFKA_CFG_PROCESS_ROLES=controller,broker
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
# Listeners
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
# 토픽 생성
- KAFKA_CREATE_TOPICS="test.topics.first:1:1,test.topics.seconde:1:1"
기본적인 구성은 비트나미 깃허브에 있는 내용과 동일하며 토픽 생성 부분만 추가되어있습니다.
2.1. docker-compose 설명
사용한 내용에 대한 출처는 다음과 같으며 더 자세한 내용은 해당 깃허브 설명을 참고하시기 바랍니다.
https://github.com/bitnami/containers/blob/main/bitnami/kafka/README.md
containers/bitnami/kafka/README.md at main · bitnami/containers
Bitnami container images. Contribute to bitnami/containers development by creating an account on GitHub.
github.com
KAFKA_CFG_ 로 시작하는 구문은 KRaft 설정을 할 때 사용하는 명령어 이며 각 설정에 대한 설명은 다음과 같습니다.
KFAKA_CFG_NODE_ID : KRaft 노드의 고유 ID
KAFKA_CFG_PROCES : KRaft 역활에 대한 쉼표로 구분된 목록 허용되는 값은 [controller,broker]. [controller], [broker]
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS : 클러스터 설정에 대한 값으로 쉼표 구분된 호스트:포트 쌍으로 각각 Kfaka 컨트롤러 연결에 사용됩니다.
KAFKA_CFG_LISTENERS : Kfaka 리스터 목록으로 노드가 controller 역활로 설정된 경우 리스터에 CONTROLLER를 포함 해야 합니다.
KAFKA_CFG_ADVERTISED_LISTENERS : 특정 브로커에 대한 주소 목록으로 쉼표로 구분된다.
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP : 각 리스너를 Kafka 보안 프로토콜과 매핑합니다. 노드에 대한 설정이 controller로 설정된 경우 CONTROLLER에 대한 보안프로토콜 할당이 필요합니다.
- 해당 설정에 대한 내용이 복잡하므로 설명 문서를 한번 읽어보시는 것을 추천합니다.
KAFKA_CFG_CONTROLLER_LISTENER_NAMES : 컨테이너와 브로커 간의 통신에 사용할 리스너 이름
KAFKA_CFG_INTER_BROKER_LISTENER_NAME : 브로커간 통신에 사용하는 리스너 이름
KAFKA_CREATE_TOPICS : 토픽을 생성하며 규칙은 topick명:partition개수:replica개수 입니다.
3. 결론
아파치가 추후 업데이트 되어 주키퍼에 대한 레거시를 완전히 제거하면 비트나미에서 아파치로 이미지 소스를 변경할 예정입니다. 그렇게 되면 아파치 버전으로 다시 한번 올리도록 하겠습니다.