쿠버네티스 환경에서 MSA기반의 EDD(Event-Driven-Development)를 구축하는데 있어, 다양한 메시지 큐가 존재하는데, 대중적으로 많이 쓰이는 Kafka를 Helm을 이용하여 설치해 볼 것이다.
1. 헬름(Helm) 설치
헬름(Helm)이란, 쿠버네티스의 패키지 관리자이며, 간단한 명령어를 통하여 패키지를 쉽게 내려받고 이용할 수 있다.
공식 Docs : https://helm.sh/docs/
설치 또한, 아래 명령어를 통하여 간단하게 할 수 있다.
# 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
위 사이트를 참조하자면, 단 한 줄의 명령어로 설치가 가능하다.
# 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 관련 에러가 발생하면, 아래 글을 참조하면 될 것이다.
'Devops > Kubernetes' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 노드(Node) 및 파드(Pod) 사용 중 컴퓨터 자원(Resource) 확인 (0) | 2023.08.30 |
---|---|
[Kubernetes] bitnami/kafka (Helm Chart) SASL Authentication 에러 (2) | 2023.08.24 |
[Kubernetes] 파드 간 통신 방법과 FQDN/DNS 요청 시 발생한 에러 처리 (0) | 2023.08.21 |
[Kubernetes] 쿠버네티스 Ec2(Kubeadm) 환경에서 Master-Worker Node 구축 (1) | 2023.08.11 |
[Kubernetes] The connection to the server [IP]:6443 was refused (0) | 2023.08.07 |