[Kubernetes] Grafana Tempo 를 구축해보자 - (1)
나는 보통 어플리케이션 분산추적을 위해 오픈소스 APM 가 필요할때면 네이버에서 릴리즈한 Pinpoint 를 사용한다
하지만 메트릭들의 모니터링은 대부분 Grafana 를 사용하는데
Pinpoint 를 사용하게 되면 한 곳에서 모니터링 정보를 관리하기 어렵다
일명 Single Pane of Glass 가 안된다..
대안을 찾아보다 마침 Grafana Labs 에서 개발/유지하는 Tempo 를 알게되었다

Grafana Labs 에서 Cloud Managed 버전도 구독형으로 판매하지만
OSS 버전도 제공해서 무료로 구축해 사용해 볼 수 있다!!
K3s 클러스터에 한번 올려보자
구성방법 선택
tempo 는 Single Binary 타입과 Distributed 타입 2개를 제공한다
여기서는 single binary 구성하지만 운영환경에서는 distributed 를 고려해 볼 필요가 있다
Helm 차트 준비
친철하게 Grafana Labs 에서 Helm 차트까지 제공해준다
아래 링크로 접속해서 차트를 준비하자
https://artifacthub.io/packages/helm/grafana/tempo
사이트의 오른쪽 INSTALL 과 DEFAULT VALUES 를 활용하자
각각 Helm 배포 시 사용하는 명령어와 기본 values.yaml 을 제공해준다
Values 파일 수정
기본 values.yaml 로 배포해도 동작은 하지만 먼저 일부 설정을 수정해주자
1. tempo 는 단순히 trace 만 수집한다
trace 가 가진 span 들에는 수많은 속성들이 있는데 이를 metrics 으로 변환해야 지연시간이나 호출횟수 같은 수치들을 집계하고 가공이 가능하다
하지만 tempo 의 기본설정으로는 trace 만 수집할 뿐 metrics 으로 변환은 해주지 않는다
아래 설정으로 span -> metrics 변환기능을 활성화 해주자
당연히 metrics 가 저장될 prometheus 가 사전에 구축되어 있어야 한다
tempo:
metricsGenerator:
# -- If true, enables Tempo's metrics generator (https://grafana.com/docs/tempo/next/metrics-generator/)
enabled: true
remoteWriteUrl: "http://prometheus-stack-kube-prom-prometheus.prometheus:9090/api/v1/write"
2. 필요한 포트만 오픈하자
나는 tempo를 구축하고 OpenTelemetry 를 이용해 trace 를 수집할 예정이니
굳이 필요없는 포트를 열어둘 이유가 없다
쓸 포트만 열고 나머지는 주석처리 하자
tempo:
receivers:
jaeger:
# protocols:
# grpc:
# endpoint: 0.0.0.0:14250
# thrift_binary:
# endpoint: 0.0.0.0:6832
# thrift_compact:
# endpoint: 0.0.0.0:6831
# thrift_http:
# endpoint: 0.0.0.0:14268
opencensus:
otlp:
protocols:
grpc:
endpoint: "0.0.0.0:4317"
http:
endpoint: "0.0.0.0:4318"
3. 데이터 보관을 위한 스토리지를 할당하자
이 부분은 선택적인 부분이지만
나는 tempo 가 사용할 별도 스토리지를 PV 로 만들어 마운트 했다
아래 설정을 변경해서 persistence를 활성화하자
내가 사용하는 K3s 클러스터에는 nfs 를 이용한 StorageClass 가 있어
그걸 사용하도록 설정했지만 상황에 맞춰 변경해주자
persistence:
enabled: true
storageClassName: nfs-client
4. 필요한 설정은 입맛에 맞게
values.yaml 를 쭉 살펴보면 의외로 다양한 옵션들이 노출되어있다
필요에 따라 변경해서 사용하자
클러스터에 릴리즈
설정이 다 수정되었다면 아래 명령어로 namespace를 만들고 배포해보자
INSTALL 에서 제공된 명령어 + 수정한 values.yaml을 먹여서 사용하자
kubectl create namespace tempo
helm repo add grafana https://grafana.github.io/helm-charts
helm install tempo grafana/tempo --version 1.14.0 -f values.yaml
배포결과 확인
아래와 같이 명령어 결과가 출력된다면 배포 성공!!
[root@k3s-server1 ~]# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
tempo tempo 1 2024-12-04 21:08:57.168582755 +0900 KST deployed tempo-1.14.0 2.6.1
서비스 주소 확인
아래 명령어로 배포된 tempo 의 서비스명을 확인해주자
나는 tempo 라는 namespace에 tempo라는 서비스가 있으니
접속주소는 tempo.tempo:3100 이 되겠다
[root@k3s-server1 ~]# kubectl get svc -n tempo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tempo ClusterIP 10.43.166.24 <none> 3100/TCP,6831/UDP,6832/UDP,14268/TCP,14250/TCP,9411/TCP,55680/TCP,55681/TCP,4317/TCP,4318/TCP,55678/TCP 57m
배포가 되었다면 이제 Grafana 에서 연동을 해볼차례
Grafana 의 datasource 탭으로 이동해서 tempo 를 선택해주고 아래와 같이 위에서 찾아둔 주소를 입력해주자

스크롤을 내려서 Trace to metrics 부분도 기입해주자

마지막으로 제일 하단에 Additional settings 부분도 확장해서
Service graph 와 Node graph 도 활성화 해주자

그리고 Save & test 를 눌러 연결이 확인되면 끝!

Helm 차트가 제공되어서 설치가 너무 간단하다
이제 Tempo 설치는 끝났으니 다음 글에서는 OpenTelemetry 를 이용해서 에이전트를 주입하고 trace 데이터를 수집해보자
