Helm으로 Kafka 클러스터 설치 자동화하기

이번 글에서는 Helm Chart를 활용하여 Kafka 클러스터를 자동으로 설치하고 구성하는 방법을 정리해보려 합니다. Kubernetes 환경에서 Kafka를 안정적으로 운영하기 위해 반복 가능한 설치 환경이 중요하다는 점, 다들 공감하시죠? 😎

1. Helm으로 Kafka 설치 준비

Kafka를 설치하기 위해 먼저 Helm Chart 저장소를 추가하고 최신 차트를 가져옵니다:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm pull bitnami/kafka --untar

bitnami/kafka 차트를 기반으로 Helm Chart 디렉토리가 생성되며, 여기에 필요한 커스터마이징을 적용해 나갑니다.

2. 왜 Helm을 사용할까?

Kafka는 분산 시스템이다 보니 브로커 설정, 컨트롤러 구성, PVC, 서비스 설정 등 복잡한 설정이 요구됩니다. 이런 설정을 values.yaml로 정의해두면:

  • 반복적인 설치가 가능하고,
  • 설정 변경 시 GitOps와 같은 DevOps 전략과도 잘 어울리며,
  • 복잡한 설정을 하나의 파일로 관리할 수 있어 유지보수가 쉬워집니다.

그래서 Helm Chart를 커스터마이징하여 Kafka 설치를 자동화한 스크립트를 구성하게 되었죠.

3. 구성 파일 구조 살펴보기

./
├── generator-kafka.sh        # Kafka 설치를 위한 설정 YAML 자동 생성 스크립트
├── run.sh                    # Helm Chart로 Kafka 설치를 수행하는 메인 실행 스크립트
└── kafka/                    # Helm Chart 폴더 (bitnami kafka 차트 기반)

이렇게 나눠 관리하고 있습니다. 핵심은 generator-kafka.shvalues.yaml 파일을 자동 생성해준다는 점이에요.

4. values.yaml 구성 요소 요약

자동 생성되는 values.yaml의 주요 파라미터는 다음과 같습니다:

  • replicaCount: 브로커 복제 수
  • controller.replicaCount: 컨트롤러 복제 수 (KRaft 기반)
  • storage: 각 브로커/컨트롤러의 PV 용량 및 접근 방식
  • listeners: client, inter-broker, external 등 리스너 세팅
  • externalAccess: 외부 연결을 위한 설정 (NodePort 사용)

물론 metrics, podAntiAffinity, tolerations 같은 것도 함께 설정 가능합니다.

externalAccess:
  enabled: true
  broker:
    service:
      type: NodePort
      nodePorts:
        - 30000
        - 30001
        - 30002

이렇게 하면 Helm 설치 시 외부 노드 포트를 고정으로 설정할 수 있어요.

4-2. generator-kafka.sh 구성 요소 요약

generator-kafka.sh는 저자가 생성한 bash 코드 파일입니다. Helm을 이용해 Kafka를 설치할 때 반복적이거나 동적으로 생성해야 하는 값을 자동화하기 위해 사용되며, 입맛에 맞는 구조로 쉽게 커스터마이징이 가능합니다.

#!/bin/bash

# Kafka PV/PVC Generator Script (Bitnami KRaft Mode)
nsc="$1"
controllerCount="${2:-3}"
brokerCount="${3:-3}"

if [[ -z "$nsc" ]]; then
  echo "❌ Usage: ./generator-kafka.sh <namespace> [controller-count] [broker-count]"
  exit 1
fi

rm -f "$baseDir"/pv-kafka-*.yaml "$baseDir"/pv-kafka-log.yaml

cat <<EOF >> "kafka/pv-kafka-broker.yaml"
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: data-kafka-broker-${i}
  labels:
    type: nfs
    kafka-broker-id: "${i}"
spec:
  capacity:
    storage: 8Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.33.02
    path: /mnt/icas/kafka/broker-${i}
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-kafka-broker-${i}
  namespace: \${nsc}
spec:
  storageClassName: ""
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  selector:
    matchExpressions:
      - key: kafka-broker-id
        operator: In
        values:
          - "${i}"
EOF

이 스크립트는 Helm 설치 전 사전에 필요한 PVC 정의를 자동으로 생성하는 핵심 역할을 합니다.

5. 설치 스크립트(run.sh) 예시

#!/bin/bash

# Kafka 설치 스크립트
namespace="kafka-test"
replicaCount=3

./generator-kafka.sh "$namespace" "$replicaCount"

helm install kafka -n "$namespace" ./kafka \
  -f ./kafka/values.yaml \
  --set controller.replicaCount=3 \
  --set replicaCount=3

위처럼 실행하면 자동으로 values.yaml을 생성한 뒤 Helm을 통해 Kafka 클러스터를 배포합니다.✨

6. 마무리하며

이 글에서는 Helm과 Shell Script를 활용해 Kafka를 자동으로 설치하는 전략을 소개했습니다. 다음 글에서는 NodePort 기반 외부 접속 구성에 대해 살펴볼게요. Kafka를 처음 다루거나 Helm Chart를 커스터마이징하려는 분들께 도움이 되었으면 좋겠습니다.


Leave a Comment