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

홈서버에서 그라파나를 통해 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를 꼼꼼히 읽어야 겠다는 것을 느꼈습니다. 👍