Infrastructure

Apache Kafka를 Kubernetes, 로컬 환경에 쉽게 배포하는 방법

Written by 개발자서동우 · 1 min read >
카프카 쿠버네티스에 배포

안녕하세요! Devloo 입니다. 🙂 Kafka를 Kubernetes에 배포하거나 Docker Compose를 사용하는 것은 Kafka 클러스터를 관리하고 운영하는 데 유연하고 확장 가능한 솔루션을 제공합니다. Kubernetes는 프로덕션 배포에 적합한 견고한 컨테이너화 환경을 제공하여 원활한 확장, 리소스 최적화, 관리 용이성을 보장합니다. 반면, 로컬 Docker Compose 설정은 개발 및 테스트 용도로 이상적이며, 단일 머신에서 빠르고 리소스 효율적인 구성을 할 수 있게 해줍니다. 분산 클라우드 환경이든 로컬 개발 환경이든, 이러한 배포 옵션을 통해 사용자는 Kafka의 강력한 기능을 활용하면서 자신의 필요에 맞게 설정을 조정할 수 있습니다.

Kubernetes 클러스터에서

간단하게 하기 위해 일부 설정은 생략되었습니다. Kafka 배포 옵션에 대한 포괄적이고 상세한 설정은 공식 Bitnami Helm Chart 저장소를 참조하세요.

Kubernetes 클러스터로 이동한 후, 다음 명령어를 실행하여 Bitnami Kafka Helm 차트를 사용해 Apache Kafka를 설치하세요.

helm install kafka oci://registry-1.docker.io/bitnamicharts/kafka

이 명령어는 Kubernetes 클러스터에 Kafka 브로커를 설정합니다. 이 Helm 차트는 필요한 Kafka 서비스와 상태 저장 파드를 포함한 여러 Kubernetes 리소스를 설치합니다.

설치가 완료되면, Kafka 브로커는 kafka 서비스를 통해 접근할 수 있습니다. 동일한 네임스페이스 내의 클라이언트는 kafka:9092 TCP 엔드포인트를 통해 이 서비스에 연결할 수 있습니다. Kafka 브로커 네임스페이스 외부의 클라이언트는 kafka.<kafka-namespace>.svc.cluster.local:9092 엔드포인트를 통해 연결할 수 있습니다.

다음 명령어로 필요한 서비스가 설치되었는지 확인할 수 있습니다:

# Kafka를 설치한 네임스페이스를 지정하세요
kubectl get services --namespace default

아래와 같은 서비스가 표시된다면, Kubernetes에 Kafka 설정이 완료된 것입니다. 그렇지 않다면 위의 구성과 명령어를 다시 확인하세요. 특히 네임스페이스, Helm 차트 및 버전과 같은 세부 사항을 주의 깊게 확인해야 합니다.

NAME                        TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
kafka                       ClusterIP      10.105.147.230   <none>        9092/TCP   20d
kafka-console               ClusterIP      10.101.153.191   <none>        8080/TCP   20d
kafka-controller-headless   ClusterIP      None             <none>

Kafka 서비스 외에도, Kubernetes 클러스터 콘솔에서 Helm 설치 출력에 표시되는 sasl.client.userssasl.client.passwords 값을 확인해야 합니다. 기본적으로 Bitnami Helm 차트에서는 sasl.client.users 값이 ‘user1’로 설정됩니다. 다음 명령어를 사용하여 Kubernetes 클러스터에서 kafka-user-passwords 시크릿의 client-passwords 키에서 비밀번호 값을 가져올 수 있습니다:

# Kafka를 설치한 네임스페이스를 지정하세요
kubectl get --namespace default secrets/kafka-user-passwords -o jsonpath='{.data.client-passwords}' | base64 --decode

이후에 이러한 값들은 마이크로서비스 애플리케이션의 설정 파일, 예를 들어 Spring Boot의 application.properties 파일에서 사용되어 Kafka 브로커에 연결하는 데 활용될 수 있습니다 (관련 글 확인):

# Spring Boot Kafka Producer 마이크로서비스의 application.properties
spring.kafka.bootstrap-servers=kafka:9092
spring.kafka.properties.security.protocol=SASL_PLAINTEXT
spring.kafka.properties.sasl.mechanism=PLAIN
spring.kafka.properties.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="user1" password="*******";

이 설정을 통해 마이크로서비스는 Kafka 브로커와 안전하게 연결할 수 있습니다.

로컬 Docker 머신에서

개발 툴을 열고, 아래 kafka-compose.yml 파일의 내용을 복사하여 붙여넣고 저장하세요.

# kafka-compose.yml
---
version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
  kafka-ui:
    container_name: kafka-ui
    image: provectuslabs/kafka-ui:latest
    ports:
      - "9000:8080"
    environment:
      KAFKA_CLUSTERS_0_NAME: dev-local
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092
      KAFKA_CLUSTERS_0_METRICS_PORT: 9997
      DYNAMIC_CONFIG_ENABLED: true
    depends_on:
      - "kafka"
  kafka:
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
      - "9997:9997"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_JMX_PORT: 9997

그런 다음, 동일한 폴더에서 아래 명령어를 실행하여 설정을 완료하세요:

docker-compose -f kafka-compose.yml up

이 명령어는 Kafka 브로커 인스턴스와 함께 kafka-ui를 시작하여 Kafka 환경 내의 토픽과 메시지를 시각적으로 확인할 수 있게 합니다.

새로 설치된 Kafka 브로커를 탐색하려면, 브라우저를 열고 http://localhost:9000으로 이동하세요. Producer/Consumer 마이크로서비스를 개발하면서 이 페이지를 통해 실시간 Kafka 메시지를 모니터링하는 것이 편리해집니다.

kafka-ui 대시보드

개발 환경에서는 로컬 Kafka 브로커에 연결할 때 사용자 이름과 비밀번호가 필요하지 않습니다. 따라서 이러한 설정은 마이크로서비스 애플리케이션의 설정 파일, 예를 들어 Spring Boot의 application.properties 파일의 개발 프로필에서 생략할 수 있습니다:

# Spring Boot Kafka Producer 개발 프로필의 application.properties
spring.kafka.bootstrap-servers=localhost:9092
# Spring 마이크로서비스의 kafka-admin 클라이언트와 연결하기 위해
# security.protocol 및 sasl.mechanism을 정의합니다.
spring.kafka.properties.security.protocol=PLAINTEXT
spring.kafka.properties.sasl.mechanism=GSSAPI
# kafka-admin 클라이언트가 Kafka 브로커에 연결할 때 사용자 이름과 비밀번호를 비워둡니다.
spring.kafka.properties.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="" password="";

요약하면, Kafka를 Kubernetes에 배포하거나 Docker Compose를 사용하는 것은 Kafka 클러스터를 관리하는 데 유연하고 확장 가능한 솔루션을 제공합니다. Kubernetes는 견고한 컨테이너화 환경을 통해 프로덕션 배포에 적합하며 원활한 확장성과 효율적인 자원 관리를 보장합니다. 반면 Docker Compose 설정은 로컬 머신에서 개발 및 테스트에 이상적인 빠르고 자원 효율적인 구성을 제공합니다.

Kubernetes 배포의 경우, 공식 Bitnami Helm Chart 저장소를 참조하여 포괄적인 Kafka 배포 옵션을 확인하세요. 제공된 Helm 차트는 Kubernetes 클러스터에 Kafka 브로커를 설정하고, 지정된 엔드포인트를 통해 접근할 수 있게 합니다.

로컬에서 Docker Compose를 사용하는 경우, 제공된 kafka-compose.yml 파일을 통해 Kafka 브로커 인스턴스와 KafDrop 웹 UI를 설정할 수 있습니다. 개발 목적으로 로컬 Kafka 브로커에 연결할 때는 사용자 이름이나 비밀번호가 필요하지 않아 마이크로서비스 애플리케이션 설정이 간소화됩니다.

분산 클라우드 환경이든 로컬 개발 환경이든, 이러한 배포 옵션은 사용자가 자신의 필요에 맞게 Kafka 설정을 조정할 수 있게 하여 메시징 인프라에 대한 유연성과 제어를 제공합니다.

이번 시간에는 Apache Kafka를 Kubernetes, 로컬 환경에 쉽게 배포하는 방법을 알아보았습니다.

혹시 궁금하신 사항이 있으시면 댓글 남겨주세요 !! 🙂 감사합니다.

Written by 개발자서동우
안녕하세요! 저는 기술 분야에서 활동 중인 개발자 서동우입니다. 명품 플랫폼 (주)트렌비의 창업 멤버이자 CTO로 활동했으며, AI 기술회사 (주)헤드리스의 공동 창업자이자 CTO로서 역할을 수행했습니다. 다양한 스타트업에서 일하며 회사의 성장과 더불어 비즈니스 상황에 맞는 기술 선택, 개발팀 구성 및 문화 정착에 깊은 경험을 쌓았습니다. 개발 관련 고민은 언제든지 편하게 연락주세요 :) https://linktr.ee/dannyseo Profile

Leave a Reply

Your email address will not be published. Required fields are marked *