6 min read

[Kubernetes] Grafana Tempo 를 구축해보자 - (1)

[Kubernetes] Grafana Tempo 를 구축해보자 - (1)

나는 보통 어플리케이션 분산추적을 위해 오픈소스 APM 가 필요할때면 네이버에서 릴리즈한 Pinpoint 를 사용한다

하지만 메트릭들의 모니터링은 대부분 Grafana 를 사용하는데
Pinpoint 를 사용하게 되면 한 곳에서 모니터링 정보를 관리하기 어렵다

일명 Single Pane of Glass 가 안된다..

대안을 찾아보다 마침 Grafana Labs 에서 개발/유지하는 Tempo 를 알게되었다

Grafana Tempo OSS | Distributed tracing backend
Grafana Tempo is an open source, easy-to-use, and high-scale distributed tracing backend.

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

사이트의 오른쪽 INSTALLDEFAULT 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 데이터를 수집해보자