본문 바로가기
클라우드/Kubernetes

[Kubernetes] Grafana 에서 Kafka 모니터링 하기 #Prometheus #kafka-exporter

by 정권이 내 2022. 4. 1.

asf - Revision 1898851: /kafka/site/logos

[Kubernetes] Grafana에서 Kafka 모니터링하기

 

Kubernetes 에서 PLG 스택 사용해보기 라는 주제로 작년 10월쯤에 포스팅을 작성했었습니다. 그동안 팀에서진행 하는 프로젝트에도 많은 변화가 있었는데 Kafka를 도입하여 데이터 처리를 본격적으로 하게 되었고 그에따라서 Kafka 모니터링 역시 필요하게 되었습니다.

 

 

[Kubernetes] PLG(Prometheus, Loki, Grafana) Stack 설치, 운영하기

쿠버네티스에 PLG 스택 운영하기 쿠버네티스상에 PLG 스택을 호환성있게 운영하기위해서 처음에는 Promethes, Loki, Grafana를 모두 각각 Deployment 를 만들어서 설정을 맞춰 보았는데 생각만큼 잘 맞물려

ksr930.tistory.com

 

일반적인 쿠버네티스 기반의 메트릭정보들은 node-exporter 에서 대부분 수집하여 Prometheus에서 가져가는데 Kafka 파드에 대한 메트릭정보는 알수있지만 내부적인 메시지 처리량이나 토픽, 파티션, 컨슈머등에 대한 자세한 정보는 node-exporter가 아닌 kafka-exporter를 따로 사용해야 수집할수 있습니다.

 

Kafka exporter

kafka exporter는 아파치 라이선스 2.0 기반의 오픈소스 프로그램입니다. github 는 아래에서 참조하면 됩니다.

https://github.com/danielqsj/kafka_exporter

 

사용방식은 Binary와 Docker 두가지가 있는데 저는 클라우드 환경에서 사용해야 하니 Docker 버전으로 사용하면서 Kubernetes에 실행하는 방법까지 설명하겠습니다.

 

Docker 실행

쿠버네티스에 파드로 띄우기전에 먼저 테스트를 위해 도커 이미지를 받고 실행해보겠습니다.

$ docker pull danielqsj/kafka-exporter
$ docker run -ti --rm -p 9308:9308 danielqsj/kafka-exporter --kafka.server=kafka:9092

 

kafka.server 옵션에는 본인 환경에 맞는 Kafka 브로커 서버 주소를 입력하면 되는데 여러대일 경우 kafka.server 옵션을 여러개 사용하면 됩니다.

--kafka.server=kafka1:9092 --kafka.server=kafka2:9092 --kafka.server=kafka3:9092

 

실행후 다음과같이 Listening on HTTP :9308 라는 내용이 출력되면 정상적으로 컨테이너가 실행된것입니다.

I0401 01:26:29.291929       1 kafka_exporter.go:778] Starting kafka_exporter (version=1.4.2, branch=HEAD, revision=6e14e80ce290636effe67dbb598d95fdb59be762)
I0401 01:26:29.300890       1 kafka_exporter.go:938] Listening on HTTP :9308

 

터미널에서 URL 요청으로 메트릭정보를 받아보겠습니다. 아래처럼 Kafka에 관련된 메트릭정보가 출력됩니다.

$ curl localhost:9308/metrics
...
...
kafka_topic_partitions{topic="topic_test1"} 1
kafka_topic_partitions{topic="topic_test2"} 1
kafka_topic_partitions{topic="topic_test3"} 1
kafka_topic_partitions{topic="topic_test4"} 1
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 0.71
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1.048576e+06
...
...

 

쿠버네티스 Pod 실행 (helm)

node-exporter 는 각 노드의 메트릭정보를 수집해야하기 때문에 데몬셋으로 실행하지만 kafka-exporter는 브로커 서버에 대해 수집하므로 데몬셋으로 실행할 필요가 없기때문에 단일 파드로 실행하겠습니다.

 

먼저 위에 설명한 git 주소에서 전체 소스를 받고 아래 경로로 이동합니다.

$ git clone https://github.com/danielqsj/kafka_exporter.git
$ cd kafka_exporter/charts/kafka-exporter

 

values.yaml 파일을 열어서 Kafka 서버에 대한 옵션을 수정합니다.

kafkaExporter:
kafka:
servers:
- kafka.monitoring.svc:9092

카프카 서버 주소는 IP형식으로 적어도 되지만 실제 운영을 한다고 했을때를 생각해서 DNS 주소를 사용합니다.

Kubernetes DNS : <label><namespace>.svc:port

 

helm 명령어를 이용해 실행합니다. (-n 옵션은 네임스페이스를 뜻하는데 --namespace와 동일합니다.)

$ helm install kafka-exporter . -n monitoring

 

정상적으로 실행되고 있는지 helm, kubernetes 두곳에서 확인합니다.

$ helm list -n monitoring
NAME            NAMESPACE  REVISION  UPDATED    STATUS     CHART                    APP VERSION
kafka-exporter  monitoring 1         2022-04-01 deployed   kafka-exporter-1.2.0     1.0        

 

$ kubectl get -n monitoring pod
NAME                               READY     STATUS      RESTARTS     AGE
kafka-exporter-799b57c64c-6jfbb    1/1       Running     0            12m

 

추가로 Pod 로그도 확인해보겠습니다.

$ kubectl logs -f -n monitoring kafka-exporter-799b57c64c-6jfbb kafka-exporter
I0401 04:22:55.243336       1 kafka_exporter.go:778] Starting kafka_exporter (version=1.4.2, branch=HEAD, revision=6e14e80ce290636effe67dbb598d95fdb59be762)
I0401 04:22:55.253298       1 kafka_exporter.go:938] Listening on HTTP :9308

 

Kafka 메트릭 수집이 되는지 터미널 테스트를 하기위해 kafka-exporter의 ClusterIP를 확인해야 합니다.

$ kubectl get -n monitoring service
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kafka-exporter     ClusterIP   10.43.16.244    <none>        9308/TCP   20m

 

주소를 확인했으면 Docker 방식에서 테스트를 했던것처럼 메트릭 데이터가 출력되는지 확인합니다.

$ curl 10.43.16.244/metrics
...
...
kafka_topic_partitions{topic="topic_test1"} 1
kafka_topic_partitions{topic="topic_test2"} 1
kafka_topic_partitions{topic="topic_test3"} 1
kafka_topic_partitions{topic="topic_test4"} 1
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 0.71
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1.048576e+06
...
...

 

Prometheus & kafka-exporter 연동하기

지난번에 만들어놓은 Prometheus 의 values.yaml 파일을 수정하여 kafka-exporter를 등록해보겠습니다.

additionalScrapeConfigs 항목에 아래와 같이 입력합니다.

prometheus:
...
...
additionalScrapeConfigs:
- job_name: "kafka-exporter"
static_configs:
- targets: ["kafka-exporter.monitoring.svc:9308"]

 

저는 Prometheus가 이미 실행중이므로 helm upgrade 명령어로 변경된 부분만 적용되도록 해보겠습니다.

$ helm upgrade kube-prometheus-stack . -n monitoring

 

helm upgrade 가 수행되면 Prometheus UI화면에서 kafka-exporter가 등록되었는지 확인할수 있습니다. Prometheus UI에서 Status 메뉴의 Targets로 이동하면 Prometheus가 수집하는 타겟 url 목록을 확인할수 있는데 그중에서 kafka-exporter가 정상적으로 등록되어있는지 확인합니다.

img

 

이제 Grafana에서 Kafka를 모니터링할 준비 작업은 끝났습니다.

 

Grafana Dashboard 생성

Grafana 커뮤니티에 올라와있는 대시보드를 사용했습니다. https://grafana.com/grafana/dashboards/7589

UI에서 대시보드 Import를 누르고 7589를 입력해서 대시보드를 받아옵니다.

img

 

img

 

 

반응형

댓글