Programming/Java

[DevOps] Kubernetes로 채팅을 위한 Kafka와 Zookeeper 배포하기

디아쿠 2025. 1. 9. 12:17

다음 사진은 채팅 기능에 Kafka 기술을 적용한 것입니다.

 

Kafka를 도입한 이유로는,

 

확장성 및 신뢰성: STOMP 기반의 세션 관리는 단일 서버 환경에서는 한계가 있었습니다.

다중 서버 환경에서 메시지 손실과 확장성 문제를 해결하기 위해 Kafka를 도입하였습니다.

Kafka는 사용자가 다른 서버에 접속해도 메시지를 안정적으로 전달받을 수 있도록 해줍니다.


세션 관리: 여러 서버를 운영하는 환경에서 Kafka를 통해 서버 간 세션을 관리하여, 메시지의 일관성과 신뢰성을 보장하였습니다.

 

적용 예시로는, 

Kafka의 Pub-Sub 모델을 활용하여 동일한 토픽을 구독한 클라이언트들에게 안정적으로 메시지를 전송하고, 여러 서버 간의 세션 관리 문제를 해결하였습니다.

 

이제 이러한 기능을 K8S에서 배포를 해보려고 합니다. 

 

그 전에,  Kafka와 Zookeeper 배포의 필요성에 대해서 알아보도록 하겠습니다.

 

(1) Kafka 배포 이유

Kafka는 분산 스트리밍 플랫폼으로, 주로 대용량 데이터의 실시간 전송과 처리에 사용됩니다. 기업에서는 실시간 데이터 처리, 로그 수집, 이벤트 처리, 메시징 시스템 등을 위해 Kafka를 사용합니다.

  • 메시징 시스템: Kafka는 메시지를 토픽에 게시(publish)하고, 이를 구독(subscribe)하는 시스템을 제공합니다. 이로써 비동기식 메시징을 통해 시스템 간의 데이터 전송을 효율적으로 처리할 수 있습니다.
  • 실시간 데이터 처리: 실시간 로그 수집 및 데이터 스트리밍에서 중요한 역할을 합니다.
  • 분산 처리: Kafka는 분산 환경에서 수많은 프로듀서와 컨슈머가 데이터를 전송하고 수신하는 데 필요한 기능을 제공합니다. 이를 통해 시스템의 확장성내구성을 보장합니다.
  • 장애 내성: 여러 브로커에 데이터가 복제되어 장애 발생 시에도 데이터 손실을 방지하고 안정적인 서비스 운영이 가능합니다.

(2) Zookeeper 배포 이유

Zookeeper는 Kafka와 같은 분산 시스템에서 노드 간의 협업상태 관리를 담당하는 중앙 집중형 서비스입니다. Kafka는 Zookeeper를 사용하여 클러스터를 관리하고, 브로커들의 상태를 동기화하며, 분산 처리의 일관성을 유지합니다.

  • 클러스터 관리: Zookeeper는 Kafka 클러스터의 메타데이터를 관리하고, 각 Kafka 브로커의 상태를 모니터링합니다. 이를 통해 브로커 간의 일관성을 유지할 수 있습니다.
  • 리더 선출: Kafka는 Zookeeper를 통해 리더 선출을 수행하여, 데이터의 일관성과 처리 순서를 보장합니다.
  • 분산 락 관리: Kafka에서는 데이터를 처리하는 동안 여러 프로세스가 동시에 작업을 수행할 때 충돌을 방지해야 합니다. Zookeeper는 이를 위해 분산 락을 제공합니다.

(3) Kafka와 Zookeeper 배포 방법

 

1. Zookeeper 배포

apiVersion: apps/v1
kind: Deployment
metadata:
  name: zookeeper-deployment
  labels:
    app: zookeeper
spec:
  replicas: 1  # Zookeeper 인스턴스 수
  selector:
    matchLabels:
      app: zookeeper
  template:
    metadata:
      labels:
        app: zookeeper
    spec:
      containers:
        - name: zookeeper
          image: zookeeper:3.8.0
          ports:
            - containerPort: 2181  # Zookeeper 클라이언트 포트
          env:
            - name: ALLOW_ANONYMOUS_LOGIN
              value: "yes"  # 익명 로그인 허용 (기본 설정)
            - name: ZOOKEEPER_CLIENT_PORT
              value: "2181"  # Zookeeper 클라이언트 연결 포트
            - name: ZOOKEEPER_SERVER_ID
              value: "1"  # Zookeeper 서버 ID
---
apiVersion: v1
kind: Service
metadata:
  name: zookeeper-service
  labels:
    app: zookeeper
spec:
  ports:
    - port: 2181
      targetPort: 2181
  selector:
    app: zookeeper

 

2. Kafka 배포

 

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-deployment
  labels:
    app: kafka
spec:
  replicas: 1  # Kafka 브로커의 수 (하나의 브로커로 설정)
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
        - name: kafka
          image: confluentinc/cp-kafka:7.4.6
          ports:
            - containerPort: 9092  # Kafka 브로커 포트
          env:
            - name: KAFKA_BROKER_ID
              value: "1"  # Kafka 브로커의 ID
            - name: KAFKA_ZOOKEEPER_CONNECT
              value: "zookeeper-service:2181"  # Zookeeper 서비스와 연결
            - name: KAFKA_ADVERTISED_LISTENERS
              value: "PLAINTEXT://kafka-service:9092"  # Kafka의 광고 주소
            - name: KAFKA_LISTENERS
              value: "PLAINTEXT://0.0.0.0:9092"  # 모든 인터페이스에서 수신 대기
            - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
              value: "PLAINTEXT:PLAINTEXT"  # 보안 프로토콜 설정
            - name: KAFKA_INTER_BROKER_LISTENER_NAME
              value: "PLAINTEXT"  # 브로커 간 통신에 사용할 리스너 이름
            - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR
              value: "1"  # 카프카 토픽 오프셋 복제 계수
            - name: KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS
              value: "0"  # 초기 리밸런스 지연 시간
---
apiVersion: v1
kind: Service
metadata:
  name: kafka-service
  labels:
    app: kafka
spec:
  ports:
    - port: 9092  # Kafka 브로커가 클라이언트에게 노출될 포트
  selector:
    app: kafka

 

배포 후에 정상적으로 두 개가 연결되는지 확인해야 합니다.

Kafka 로그에서 Zookeeper의 연결 상태를 확인하고, 연결 문제가 발생하면 Zookeeper 서비스나 설정을 점검해야 합니다.

또한 Kafka 클러스터가 정상적으로 배포 되었다면, 필요한 토픽을 생성하고 해당 토픽에 데이터가 정상적으로 게시되고 있는지 확인합니다.

 

 

잘 실행됐는지 알기 위해 Pod 이벤트를 확인 해 보았습니다.

 

Kafka와 Zookeeper 배포는 분산 시스템을 구축할 때 매우 중요한 작업입니다.

Kafka는 실시간 메시징, 이벤트 스트리밍, 대규모 데이터 처리 등에 활용되고 있으며, Zookeeper는 이러한 분산 시스템에서 클러스터 관리와 데이터 일관성을 보장하는 역할을 합니다.

 

다들 확장성과 안정성을 제공하는 중요한 부분을 꼭 챙기시길 바라겠습니다. 감사합니다 !

728x90