프로젝트/프로젝트 과정

[Prometheus] Kubernetes 환경에서 Kafka 모니터링 구축하기 (by Kafka Exporter)

예슬 2024. 10. 26. 22:26

홈서버에서 그라파나를 통해 Kafka 모니터링을 설정하면서 겪은 문제 해결 과정을 공유합니다.

 

기본적으로 리소스가 제한된 환경에서 작업하기 때문에 메모리와 CPU 사용량을 제어하고, Kafka와 Prometheus Exporter 간 연결 설정에서 SASL 인증을 추가하는 방법을 다룹니다.

 

1. Prometheus-Kafka-Exporter 설치

exporter 설치 후 연결이 지속적으로 실패하는 문제가 발생했는데,

원인을 분석해보니 Kafka SASL 인증 설정 누락과 Kafka 서버 주소를 자동으로 찾지 못하는 두 가지 문제가 있었습니다.

 

따라서 아래와 같이 인증 정보와 Kafka 서버 주소를 명시적으로 설정하여 Helm으로 설치를 진행했습니다.

# 해당 명령어로 어떤 value 들을 설정할 수 있는지 볼 수 있습니다.
helm show values prometheus-community/prometheus-kafka-exporter | grep sasl

 

helm install kafka-exporter prometheus-community/prometheus-kafka-exporter \\
  --set kafkaServer[0]="kafka.kafka.svc.cluster.local:9092" \\
  --set sasl.enabled=true \\
  --set sasl.handshake=true \\
  --set sasl.scram.enabled=true \\
  --set sasl.scram.mechanism="scram-sha256" \\
  --set sasl.scram.username="user1" \\
  --set sasl.scram.password=""<PASSWORD>" \\
  --set resources.requests.memory="50Mi" \\
  --set resources.requests.cpu="50m" \\
  --set resources.limits.memory="100Mi" \\
  --set resources.limits.cpu="100m" \\
  --set scrapeInterval="1m" \\
  --namespace kafka

 

해당 설정은 제한된 리소스를 고려하여 메모리와 CPU 요청/제한 값을 최소화했으며,

SASL 인증 방식으로 scram-sha256을 적용했습니다.

또한 Kafka 서버와의 안정적인 연결을 위해 브로커 주소를 명시적으로 지정했습니다.

 

*명령어 중 scrapeInterval="1m" 는 메트릭 수집 주기를 1분으로 지정하는 것입니다.

 

2. 그라파나 플러그인 설치 및 Kafka 모니터링 설정

Kafka Exporter와 Prometheus를 연동하는 과정에서, 대부분의 문서들은 prometheus.yml이나 values.yaml 파일을 수정하고 Prometheus를 재시작하는 방법을 제시하고 있었습니다.

 

하지만 이미 잘 운영 중인 Prometheus 서버를 재시작하는 것은 적절하지 않다고 판단했습니다.

 

Redis의 경우 플러그인을 통해 쉽게 연결할 수 있기 때문에 Prometheus에서도 Kafka 모니터링을 위한 플러그인이 있는지 찾아보았습니다.

다행히 Prometheus에 적합한 플러그인을 찾을 수 있었고, 이를 활용하여 재시작 없이 문제를 해결할 수 있었습니다

 

플러그인 목록에서 'kafka'를 검색해 다운로드 및 설치한 후, 연결 설정에서 정보를 입력하면 됩니다.

  • servers: 서비스IP:포트 (Kafka 브로커의 ClusterIP와 포트)
  • API Key: user1:<PASSWORD>

API Key는 JSON 형식으로 입력하라고 적혀 있었지만, Kafka SASL 인증 정보를 그대로 입력하면 됩니다.

 

서버 IP는 kubectl get svc 명령어로 확인할 수 있습니다.

$ k get svc
NAME                                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
kafka                                      ClusterIP   10.98.148.10     <none>        9092/TCP                     24h
kafka-controller-headless                  ClusterIP   None             <none>        9094/TCP,9092/TCP,9093/TCP   24h
kafka-exporter-prometheus-kafka-exporter   ClusterIP   10.107.240.208   <none>        9308/TCP                     21m

 

저는 처음에 서버 IP(Kafka 브로커 서비스 IP)를 잘못 설정하는 바람에 연결이 계속 실패했습니다.

이 점을 꼭 주의하시기 바랍니다…😅

 


오늘도 결국 docs를 꼼꼼히 읽어야 겠다는 것을 느꼈습니다. 👍