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 헤더를 전파 해야합니다.
- 들어오는 요청에 대해 istio 인그레스 게이트웨이(또는 Envoy 프록시)가 tracing 헤더를 생성합니다.
- tracing 헤더는 업스트림 서비스로 전파됩니다.
- Envoy는 tracing 헤더를 애플리케이션에 전달합니다.
- 애플리케이션은 들어오는 요청에서 나가는 요청으로 다음 헤더를 수집하고 전파해야 합니다.
- Envoy 프록시는 tracing server로 trace를 push하여 단일 요청에 연결합니다.
- 아래와 같이 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
- 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.1 Search
- 왼쪽의 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.1 System Architecture 보기 - Force Directed 그래프
- 이미지를 드래그하여 확대하여 Force Directed Graph에서 특정 서비스에 집중할 수 있습니다.
- 노드 중 하나를 클릭하여 서비스 종속성을 확인하고 해당 노드와 관련된 스팬을 강조 표시합니다.
4.3.2 System Architecture 보기 - 방향성 비순환 그래프(DAG) 보기
- 이미지를 끌어서 확대하여 그래프에서 셀의 세부 정보를 볼 수 있습니다.
- 각 줄은 연결된 서비스 간의 상호 작용 요청을 나타냅니다. 표시되는 숫자는 해당 서비스 간의 상호 작용 요청 수입니다.
- 그래프에서 값을 더 쉽게 볼 수 있도록 노드를 잡고 드래그하여 재정렬할 수 있습니다.
마지막으로 추후에 jaeger UI 상 monitor 시각화 하는 방법 update 하겠습니다.