본문 바로가기
Devops/Kubernetes

[Kubernetes] 쿠버네티스 내 헬름 차트(Helm Chart)로 Apache Kafka 설치(bitnami)

by dev_ss 2023. 8. 22.

쿠버네티스 환경에서 MSA기반의 EDD(Event-Driven-Development)를 구축하는데 있어, 다양한 메시지 큐가 존재하는데, 대중적으로 많이 쓰이는 Kafka를 Helm을 이용하여 설치해 볼 것이다.

 

 

1. 헬름(Helm) 설치

헬름(Helm)이란, 쿠버네티스의 패키지 관리자이며, 간단한 명령어를 통하여 패키지를 쉽게 내려받고 이용할 수 있다.

 

공식 Docs : https://helm.sh/docs/

 

Docs Home

Everything you need to know about how the documentation is organized.

helm.sh

 

설치 또한, 아래 명령어를 통하여 간단하게 할 수 있다.

# Ubuntu/Debian
# apt 이용
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

# ============================================================================ #

# macOS
# brew 이용
brew install helm

# ============================================================================ #

# Windows
# choco 이용
choco install kubernetes-helm

# ============================================================================ #

# Shell Script
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

# ============================================================================ #

 


 

2. 헬름 차트(bitnami) - Kafka설치

 

헬름 차트로 kafka를 설치할 때, bitnami 또는 strimzi 등의 다양한 프로젝트들이 존재하는데, 그 중 한 가지를 선택하여 설치해야 하고, 본 글에서는 bitnami 프로젝트 기반으로 설치할 것이다.

 

 

bitnami 설치 Docs : https://bitnami.com/stack/kafka/helm

 

Helm Charts to deploy Apache Kafka in Kubernetes

Apache Kafka packaged by Bitnami Helm Charts Trademarks: This software listing is packaged by Bitnami. The respective trademarks mentioned in the offering are owned by the respective companies, and use of them does not imply any affiliation or endorsement.

bitnami.com

 

 

위 사이트를 참조하자면, 단 한 줄의 명령어로 설치가 가능하다.

# bash
helm install [NAME] oci://registry-1.docker.io/bitnamicharts/kafka


# 특정 네임스페이스에 설치
helm install -n [NAMESPACE] [NAME] oci://registry-1.docker.io/bitnamicharts/kafka


# mkdir permission denied 시
helm install [NAME] --set volumePermissions.enabled=true oci://registry-1.docker.io/bitnamicharts/kafka

 

 

특정 네임스페이스에 설치하거나 권한 문제가 발생했을 때의 명령어도 추가했다.

 

위의 명령어를 실행하게 된다면 아래 내용이 출력될 것이다.

 

# 출력 내용
NAME: kafka
LAST DEPLOYED: Tue Aug 22 01:43:01 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: kafka
CHART VERSION: 24.0.14
APP VERSION: 3.5.1

** Please be patient while the chart is being deployed **

Kafka can be accessed by consumers via port 9092 on the following DNS name from within your cluster:

    kafka.default.svc.cluster.local

Each Kafka broker can be accessed by producers via port 9092 on the following DNS name(s) from within your cluster:

    kafka-controller-0.kafka-controller-headless.default.svc.cluster.local:9092
    kafka-controller-1.kafka-controller-headless.default.svc.cluster.local:9092
    kafka-controller-2.kafka-controller-headless.default.svc.cluster.local:9092

The CLIENT listener for Kafka client connections from within your cluster have been configured with the following security settings:
    - SASL authentication

To connect a client to your Kafka, you need to create the 'client.properties' configuration files with the content below:

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
    username="user1" \
    password="$(kubectl get secret kafka-user-passwords --namespace default -o jsonpath='{.data.client-passwords}' | base64 -d | cut -d , -f 1)";

To create a pod that you can use as a Kafka client run the following commands:

    kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:3.5.1-debian-11-r25 --namespace default --command -- sleep infinity
    kubectl cp --namespace default client.properties kafka-client:/tmp/client.properties
    kubectl exec --tty -i kafka-client --namespace default -- bash

    PRODUCER:
        kafka-console-producer.sh \
            --producer.config /tmp/client.properties \
            --broker-list kafka-controller-0.kafka-controller-headless.default.svc.cluster.local:9092,kafka-controller-1.kafka-controller-headless.default.svc.cluster.local:9092,kafka-controller-2.kafka-controller-headless.default.svc.cluster.local:9092 \
            --topic test

    CONSUMER:
        kafka-console-consumer.sh \
            --consumer.config /tmp/client.properties \
            --bootstrap-server kafka.default.svc.cluster.local:9092 \
            --topic test \
            --from-beginning

 

Name을 kafka로, Namespace를 default로 했기 때문에, 위와 같은 출력이 나오게 된다.

 

출력된 내용대로, 첫 번째로 할 것은, kafka의 client를 실행하는 것이고, 명령어가 친절하게 출력되어 있다.

 

# kafka client 파드 생성
kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:3.5.1-debian-11-r25 --namespace default --command -- sleep infinity

 

 

다음으로, client.properties파일을 만들고 출력된 내용을 넣어준다.

# client.properties 파일 생성
vi client.properties

# ==================================================================== #
# 아래 내용 입력 후 저장

security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-256
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
    username="user1" \
    password="$(kubectl get secret kafka-user-passwords --namespace default -o jsonpath='{.data.client-passwords}' | base64 -d | cut -d , -f 1)";

# ==================================================================== #

 

Name과 Namespace에 따라 내용이 달라지니 주의

 

 

마지막으로 생성된 client.properties를 생성된 kafka-client 파드에 복사해준다.

# properties 파드 내부로 복사
kubectl cp --namespace [NAMESPACE] [client.properties 경로]/client.properties kafka-client:/tmp/client.properties

 

이로써, 설치가 완료다고 생각할 수 있지만 마지막 할 것이 남았다.

 

헬름 차트를 이용하여 kafka를 설치하게 되면 Persistent Volume Claim자동으로 생성되는데, 이에 이용되는 Persistant Volume이 없기 때문에 Pending 상태가 되고 volumeMode와 Storageclass에 따라 동적으로 binding이 될 수 있다.

 


3. Persistent Volume 생성

아래 명령어로 pvc를 확인해보면 3개 생성된 것을 볼 수 있을 것이다.

# bash
kubectl get pvc

# 특정 네임스페이스
kubectl get pvc -n [NAMESPACE]

 

이는 Replicas가 3이기 때문에 pvc도 3개 생성된 것이고, pvc와 바인딩할 pv를 3개 생성해주면 된다(필요 시).

 

 

[Persistent Volume]

# kafka-pv-1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: kafka-pv-1
spec:
  capacity:
    storage: 8Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
    path: /var/log/kafka-data-1
    
# ================================================================ #

# PV 생성
kubectl create -f kafka-pv-1.yaml

 

name과 hostPath가 다른 PV와 중복되지 않게 주의하여 생성한다.

 

PV와 PVC의 Bind가 성공적으로 이루어졌다면 모든 설치가 끝난 것이다.

 

 

 

 

+ SASL Protocol 관련 에러가 발생하면, 아래 글을 참조하면 될 것이다.

https://ssnotebook.tistory.com/entry/Kubernetes-bitnamikafka-Helm-Chart-SASL-Authentication-%EC%97%90%EB%9F%AC

 

[Kubernetes] bitnami/kafka (Helm Chart) SASL Authentication 에러

1. 에러 발생 헬름 차트를 이용하여 bitnami의 kafka 프로젝트 설치 후 kafka-client 내부에서 Producer의 동작을 확인하는 과정에서 다음의 에러가 발생했다. # kafka-client 내부 Producer 토픽 확인 시 에러 [202

ssnotebook.tistory.com

 

 

 

반응형