Apache Kafka Helm 배포
Apache Kafka를 Kubernetes에 배포하는 방법에는 여러 가지가 있지만, 일반적으로 Helm 차트를 사용하는 것이 가장 간편하고 효율적입니다. 여기서는 Helm을 이용한 Kafka 배포 방법을 설명하겠습니다.
Apache Kafka 설치
1. Helm 설치
먼저, Helm이 설치되어 있어야 합니다. Helm이 설치되지 않았다면 다음 명령어로 설치할 수 있습니다.
curl <https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3> | bash
2. Kafka Helm Chart 추가
Kafka의 Helm 차트를 추가합니다. Bitnami에서 제공하는 차트를 사용할 수 있습니다.
helm repo add bitnami <https://charts.bitnami.com/bitnami>
helm repo update
3. Kafka 배포
다음 명령어로 Kafka를 설치합니다. 기본 설정으로 설치할 수 있으며, 필요에 따라 values.yaml 파일을 수정하여 설정을 변경할 수 있습니다.
helm install kafka bitnami/kafka
kafka는 배포할 Kafka의 이름입니다.
4. Kafka 설정
Helm 차트를 설치한 후, 필요에 따라 Kafka의 설정을 조정할 수 있습니다.
helm fetch bitnami/kafka --untar
values.yaml 파일을 생성하여 필요한 설정을 추가할 수 있습니다. 예를 들어, Zookeeper와 함께 Kafka를 설정할 수 있습니다. 여기서는 Zookeeper와 함께 배포시 이슈가 있어 Zookeeper 설정은 꺼놓고 배포하겠습니다.
zookeeper:
enabled: false
controller:
replicaCount: 3
volumePermissions:
## @param volumePermissions.enabled Enable init container that changes the owner and group of the persistent volume
##
enabled: true
listeners:
client:
containerPort: 9092
protocol: PLAINTEXT ## <- failed authentication due to: Authentication failed during authentication due to invalid credentials with SASL mechanism SCRAM-SHA-256 이슈가 있어 변경
controller:
name: CONTROLLER
containerPort: 9093
protocol: PLAINTEXT
interbroker:
containerPort: 9094
protocol: PLAINTEXT
name: INTERNAL
sslClientAuth: ""
external:
containerPort: 9095
protocol: PLAINTEXT
name: EXTERNAL
sslClientAuth: ""
persistence:
enabled: true
size: 50Gi
저의 경우에는 nfs storageclass를 사용하고 있어 StorageClass를 변경합니다.
global:
...
defaultStorageClass: nfs
storageClass: nfs
이 파일을 사용하여 Kafka를 설치하려면 다음과 같은 명령어를 사용합니다.
helm install kafka bitnami/kafka -f values.yaml -nkafka
---
NAME: kafka
LAST DEPLOYED: Sun Oct 27 12:49:42 2024
NAMESPACE: kafka
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: kafka
CHART VERSION: 30.1.6
APP VERSION: 3.8.0
** 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.kafka.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.kafka.svc.cluster.local:9092
kafka-controller-1.kafka-controller-headless.kafka.svc.cluster.local:9092
kafka-controller-2.kafka-controller-headless.kafka.svc.cluster.local:9092
kafka-broker-0.kafka-broker-headless.kafka.svc.cluster.local:9092
kafka-broker-1.kafka-broker-headless.kafka.svc.cluster.local:9092
kafka-broker-2.kafka-broker-headless.kafka.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 kafka -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.8.0-debian-12-r5 --namespace kafka --command -- sleep infinity
kubectl cp --namespace kafka /path/to/client.properties kafka-client:/tmp/client.properties
kubectl exec --tty -i kafka-client --namespace kafka -- bash
PRODUCER:
kafka-console-producer.sh \\
--producer.config /tmp/client.properties \\
--bootstrap-server kafka.kafka.svc.cluster.local:9092 \\
--topic test
CONSUMER:
kafka-console-consumer.sh \\
--consumer.config /tmp/client.properties \\
--bootstrap-server kafka.kafka.svc.cluster.local:9092 \\
--topic test \\
--from-beginning
WARNING: There are "resources" sections in the chart not set. Using "resourcesPreset" is not recommended for production. For production installations, please set the following values according to your workload needs:
- broker.resources
- controller.resources
+info <https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/>
정상 동작되는지 확인합니다.
kubectl get all -nkafka
5. Kafka 접근
Kafka에 접근하기 위해서는 서비스의 IP 주소와 포트를 확인해야 합니다. 다음 명령어를 사용하여 Kafka 서비스의 IP와 포트를 확인할 수 있습니다.
kubectl get svc --namespace default -w
Kafka의 기본 포트는 9092입니다.
6. Kafka 클라이언트 설치
Kafka에 메시지를 보내거나 소비하려면 Kafka 클라이언트가 필요합니다. Kafka 클라이언트를 생성합니다.
2개의 터미널로 kafka-client에 접속해 producer.sh, consumer.sh 를 실행합니다.
kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:3.8.0-debian-12-r5 --namespace kafka --command -- sleep infinity
kubectl exec --tty -i kafka-client --namespace kafka -- bash
---
kafka-console-producer.sh \\
--bootstrap-server kafka.kafka.svc.cluster.local:9092 \\
--topic test
kafka-console-consumer.sh \\
--bootstrap-server kafka.kafka.svc.cluster.local:9092 \\
--topic test \\
--from-beginning
7. 모니터링 및 관리
Kafka를 모니터링하고 관리하기 위해 Prometheus와 Grafana와 같은 도구를 사용할 수 있습니다. Kafka의 메트릭을 수집하여 시각화하는 데 유용합니다.
Apache Kafka UI 설치하기
1. Helm Repository 추가
먼저 Kafka UI의 Helm 차트를 제공하는 리포지토리를 추가합니다.
helm repo add kafka-ui <https://provectus.github.io/kafka-ui-charts>
2. Kafka UI 설치
Kafka UI를 설치하기 위해 기본 명령어를 사용하거나, 필요에 따라 설정 파일을 생성하여 커스터마이즈할 수 있습니다.
helm install kafka-ui kafka-ui/kafka-ui -nkafka
커스터마이즈된 설치를 위해 다음의 명령어를 입력하고 values.yaml을 수정합니다.
helm fetch kafka-ui/kafka-ui --untar
cd kafka-ui
vi values.yaml
---
yamlApplicationConfig:
kafka:
clusters:
- name: kafka
bootstrapServers: kafka.kafka.svc.cluster.local:9092
# spring:
# security:
# oauth2:
auth:
type: disabled
management:
health:
ldap:
enabled: false
위의 values.yaml을 기반으로 배포합니다.
helm install kafka-ui kafka-ui/kafka-ui -f values.yaml -nkafka
kubectl get all -nkafka
---
pod/kafka-ui-69f78cb865-7v5cc 1/2 Running 0 49s
kubectl -nkafka port-forward kafka-ui-69f78cb865-7v5cc 38080:8080
----
Forwarding from 127.0.0.1:38080 -> 8080
Forwarding from [::1]:38080 -> 8080
Handling connection for 38080
Handling connection for 38080
브라우저로 이동해봅니다.
Brokers에는 Replica 개수 만큼 보여집니다.
Topics에는 아까 테스트로 주고 받은 토픽이 보입니다.
토픽 이름을 클릭하면 주고 받은 메시지도 확인 가능합니다.
참고 자료
이 방법으로 Kubernetes 클러스터에 Apache Kafka를 손쉽게 배포할 수 있습니다. 필요에 따라 추가적인 설정을 조정하여 최적화할 수 있습니다.
'Apache Kafka' 카테고리의 다른 글
Apache Kafka의 오프셋 offset (0) | 2024.10.28 |
---|---|
Apache Kafka 메시지 중복 처리 관련 EOS (0) | 2024.10.27 |
Apache Kafka Partitioning (1) | 2024.10.27 |
Apache Kafka 과금 처리 설계 (0) | 2024.10.27 |