Jaeger

양승현·2023년 5월 9일
1

OpenSource

목록 보기
7/7

1. 예거 (Jaeger)

1.1 예거 (Jaeger)란

  • Jaeger는 Micro Service간의 트랜잭션을 추적하여 모니터링하고 문제를 해결하는 데 사용할 수 있는 오픈소스 소프트웨어입니다.
  • Micro Service 같은 경우 사용자가 애플리케이션에 요청을 보내면 요청에 맞는 개별의 Micro Service가 이에 응답하여 결과를 생성하기 때문에 로그가 분산되어 있고,
    각 서버 간의 요청 관계가 복잡 해질수록 장애 및 병목 지점을 찾아내는 것이 어려
    워집니다.
  • 이때 문제가 발생한 경우 문제의 원인을 파악할 수 있도록 Jaeger를 사용해 복잡한
    분산 시스템에서 트랜잭션에 대하여 각 구간별 응답 시간을 모니터링하여 서버 내
    부의 어느 함수에서 시간을 많이 소요하는지, 어느 경우에 레이턴시가 튀는지 등 문
    제 지점을 파악해 문제 해결을 위한 근본 원인 분석을 할 수 있습니다.
  • Jaeger는 일련의 Micro Service 상호 작용 내의 요청 경로를 따라가거나 추적하기
    때문에 Jaeger Tracing이라고도 불립니다.

1.2 예거 (Jaeger) 용어

Span (스팬)

  • 분산 추척에서는 가장 기본이 되는 블록 단위로 분산 시스템에서 실행되는 작업 단위를 나타냅니다.
    - ex. HTTP request, call to DB
  • Span은 다음과 같은 구성 요소가 있습니다.
    - 작업 이름
    - 시작 시간과 중지 시간
    - 개발자가 Span 을 분석하는 데 도움이 되는 태그 또는 값
    - Micro service 가 생성하는 메시지를 저장하는 로그
    - Span 컨텍스트 또는 Span 에 대한 추가 설명

Trace (추적)

  • Trace는 시스템 전반에서 데이터/실행 경로를 나타냅니다.
  • 1개 이상의 Span으로 이루어져 있고 여러 개의 Span이 모여서 하나의 Trace를 완성하게 됩니다. 특정 시간 동안 발생하는 이벤트를 나타냅니다.
  • Trace를 이용해서 어플리케이션이 어떤 경로를 이용해 이벤트끼리 상호작용하고, 얼마만큼의 레이턴시를 가지며, 어떤 부분에서 문제가 발생할 수 있는지 파악할 수 있습니다.

※ 구성 환경

  • 사전에 bookinfo app, Envoy proxy, Istio 배포 후 진행

    @ Envoy의 “분산 추적 기능”을 활성화하여 자동으로 분산 추적을 할 수 있으며 jaeger 백엔드와 통합이 가능하다.
    @ Istio 프록시는 자동으로 span을 보낼 수 있지만 전체 추적을 연결하려면 몇 가지가 필요하다.
    @ 애플리케이션은 프록시가 span 정보를 보낼 때 span이 단일 trace를 올바르게 상관될 수 있도록 적절한 HTTP 헤더를 전파 해야합니다.
    1. 들어오는 요청에 대해 istio 인그레스 게이트웨이(또는 Envoy 프록시)가 tracing 헤더를 생성합니다.
    1. tracing 헤더는 업스트림 서비스로 전파됩니다.
    1. Envoy는 tracing 헤더를 애플리케이션에 전달합니다.
    1. 애플리케이션은 들어오는 요청에서 나가는 요청으로 다음 헤더를 수집하고 전파해야 합니다.
    1. Envoy 프록시는 tracing server로 trace를 push하여 단일 요청에 연결합니다.

2. 예거 (Jaeger) addon 설치

  • 아래와 같이 kubectl 명령으로 설치
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.14/samples/addons/jaeger.yaml

deployment.apps/jaeger created
service/tracing created
service/zipkin created
service/jaeger-collector created
  • 예거 설치가 완료되면 istio-system 네임스페이스에 디플로이먼트, 파드, 서비스 등이 생성된 것 확인
$ kubectl get deploy,po,svc -n istio-system

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/grafana                1/1     1            1           22h
deployment.apps/istio-egressgateway    1/1     1            1           26h
deployment.apps/istio-ingressgateway   1/1     1            1           26h
deployment.apps/istiod                 5/5     5            5           6d23h
deployment.apps/jaeger                 1/1     1            1           6d23h
deployment.apps/kiali                  1/1     1            1           6d23h
deployment.apps/prometheus             1/1     1            1           22h

NAME                                       READY   STATUS    RESTARTS   AGE
pod/grafana-b854c6c8-z5prv                  1/1     Running   0          22h
pod/istio-egressgateway-89bcb88bb-n8cct     1/1     Running   0          26h
pod/istio-ingressgateway-75ffbf99d6-d8g7v   1/1     Running   0          26h
pod/istiod-c564cfff6-zgz27                  1/1     Running   0          20h
pod/jaeger-97ccd4cfb-t4f5g                  1/1     Running   0          168m
pod/kiali-7d7ffb49d8-k2rmh                  2/2     Running   0          22h
pod/prometheus-7b8b9dd44c-4dh5q             2/2     Running   0          22h


NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)       >                                                               AGE
service/grafana             ClusterIP      10.187.200.198   <none>        3000/TCP                                                                     22h
service/istio-egressgateway  ClusterIP      10.187.35.153    <none>        80/TCP,443/TCP                                                               26h
service/istio-ingressgateway  LoadBalancer   10.187.213.233   <pending>     15021:31282/TCP,80:30257/TCP,443:30893/TCP,31400:32477/TCP,15443:30889/TCP   26h
service/istiod                ClusterIP      10.187.162.207   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP                                        6d23h
service/jaeger-collector       ClusterIP      10.187.75.34     <none>        14268/TCP,14250/TCP,9411/TCP                                                 6d23h
service/kiali                  ClusterIP      10.187.82.152    <none>        20001/TCP,443/TCP,9090/TCP                                                   6d23h
service/prometheus             ClusterIP      10.187.81.77     <none>        9090/TCP                                                                     22h
service/svc-grafana             ClusterIP     10.187.93.208    <none>        3000/TCP                                                               21h
service/svc-jaeger              ClusterIP     10.187.88.104    <none>        16686/TCP                                                              21h
service/svc-kiali                ClusterIP      10.187.203.6     <none>        20001/TCP                                                              21h
service/svc-prometheus         ClusterIP     10.187.54.253    <none>        9090/TCP                                                               21h
service/tracing                ClusterIP      10.187.22.76     <none>        80/TCP,16685/TCP                                                             6d23h
service/zipkin                 ClusterIP      10.187.251.234   <none>        9411/TCP

3. 예거 (Jaeger) Dashboard 확인

  • Istio Dashboard에 대해 클러스터 외부에서 접속할 수 있도록 Nordport Service 생성
$ kubectl apply -f istio_dashboard_nodeport.yaml

# jaeger nodeport 설정 yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-jaeger
  namespace: istio-system
spec:
  type: NodePort
  ports:
  - port: 16686
    targetPort: 16686
    nodePort: 30003
  selector:
    app: jaeger
  • URL로 접속하면 예거 초기 화면을 볼 수 있다.
  • Bookinfo 어플리케이션을 curl 명령을 이용하여 1초마다 productpage를 호출합니다.
$ watch -n 1 curl http://192.168.60.240:30257/productpage

  • 이후 Jaeger Dashboard로 돌아오면 업데이트되고 있음을 확인할 수 있습니다.

4. 예거 (Jaeger) Dashboard 설명

  • 왼쪽의 Service 목록에서 모니터링 하려는 서비스를 선택하면 옵션을 선택하고, 해당 서비스의 트레이스 목록을 볼 수 있습니다. 현재 productpage.default(purple)를 선택했습니다.
  • Productpage의 호출 기록을 보면 화면 상단에는 호출별로 응답 시간 분포(blue)가 나오고 하단에는 개별 트레이스에 대한 히스토리(red)가 나옵니다.

4.1.2 Search > Deep Dependency Graph

※ Topology diagrams 보기

  • Deep Denpendency Graph 클릭
  • 원본(분홍색)으로 집중할 서비스를 설정하고 다이어그램의 수준을 확장 및 축소할 수 있습니다.
  • 검색 상자에 서비스 또는 작업을 입력하여 깊은 종속성 그래프에서 강조(노랑색) 표시합니다.

4.1.3 Search >Trace 클릭

  • 개별 트레이스 중 하나를 선택해 확인해보면, 아래 그림과 같이 게이트웨이에서 2개의 서비스가 순차적으로 호출되는 것을 확인할 수 있습니다.
  • 아래 그림을 보면 호출이 istio-ingressgateway로 들어와서 Productpage를 호출하였습니다.
  • 그 후 productpage는 순차적으로 productpage → detail 서비스를 호출하였고, 다음 productpage→ reviews 서비스를 호출한 것을 볼 수 있습니다.
  • 위 사진을 보면 총 4개의 Services 호출과 6개의 span으로 이루어져 있으며, 각 스팬마다 가지고 있는 duration 값을 통해 어떤 이벤트에서 얼마만큼의 지연시간이 있었는지 파악할 수 있습니다.
  • 각 스팬을 클릭함으로써 이벤트의 세부 사항을 알 수 있습니다.
  • productpage에서 detail로 HTTP GET 요청을 보내는 이벤트는 2.04ms의 레이턴시가 있는 것을 확인할 수 있습니다. 이런 이벤트들의 집합으로 하나의 요청이 어떤 경로를 통해, 얼마만큼의 레이턴시로 이루어져 있는지 알 수 있습니다.
  • 이러한 정보를 관측함으로써 어떤 서비스의 지연 시간이 큰 영향을 미치는지, 어떤 이벤트가 경로 상에 존재하는 지 알 수 있으며, 이 같은 정보를 통해 잠재된 문제의 원인을 파악할 수 있는 점이 트레이싱 관측 가능성의 큰 장점입니다.

4.2 Compare

  • 구조적 측면으로 trace를 비교할 수 있습니다.
  • 범위를 노드로 그룹화하면 trace 비교를 이해하기 쉽게 만들어 분석에 도움이 됩니다.
  • Search page에서 비교를 위해 두개의 trace를 선택합니다.
  • 트리에서 노드의 존재 또는 특정 개체수의 비율의 차이 강조를 위해 색상으로 구분됩니다.
    - 회색 - 두 트레이스 모두 동일한 노드와 동일한 수의 범위를 가집니다.
    - 짙은 녹색 - 트레이스 B에는 트레이스 A에 포함되지 않은 노드가 있습니다.
    - 진한 빨간색 - 트레이스 A에는 트레이스 B에 포함되지 않은 노드가 있습니다.
    - 연한 녹색 - 두 트레이스 모두 노드가 있지만 스팬 수가 다릅니다. 트레이스 B는 노드에 대해 트레이스 A보다 더 많은 스팬을 가지고 있습니다.
    - 밝은 빨간색 - 두 트레이스 모두 노드가 있지만 스팬 수가 다릅니다. 트레이스 B는 노드에 대한 트레이스 A보다 스팬이 적습니다.
  • 트레이스 B에는 트레이스 A에 포함되지 않은 노드가 1개 있으며, 트레이스 A에는 트레이스 B에 포함되지 않은 노드가 2개 있습니다.
  • 트레이스 B에는 트레이스 A에 포함되지 않은 노드가 2개 있으며, 트레이스 A에는 트레이스 B에 포함되지 않은 노드가 1개 있습니다.

4.3 System Architecture

  • 시스템 아키텍처 다이어그램은 시스템의 모든 추적 데이터를 기반으로 하며 지정된 기간 동안 컴파일되고 주기적으로 새로 고쳐집니다.

4.3.1 System Architecture 보기 - Force Directed 그래프

  • 이미지를 드래그하여 확대하여 Force Directed Graph에서 특정 서비스에 집중할 수 있습니다.
  • 노드 중 하나를 클릭하여 서비스 종속성을 확인하고 해당 노드와 관련된 스팬을 강조 표시합니다.

4.3.2 System Architecture 보기 - 방향성 비순환 그래프(DAG) 보기

  • 이미지를 끌어서 확대하여 그래프에서 셀의 세부 정보를 볼 수 있습니다.
  • 각 줄은 연결된 서비스 간의 상호 작용 요청을 나타냅니다. 표시되는 숫자는 해당 서비스 간의 상호 작용 요청 수입니다.
  • 그래프에서 값을 더 쉽게 볼 수 있도록 노드를 잡고 드래그하여 재정렬할 수 있습니다.

마지막으로 추후에 jaeger UI 상 monitor 시각화 하는 방법 update 하겠습니다.

0개의 댓글