Grafana에서 Jaeger 데이터 원본을 설정하고 귀속 유틸리티를 사용하여 네트워크를 디버깅하는 방법


고사


mentor for a Udacity nanodegree 학생으로서 나는 대부분의 학생들이 Jaeger 추적data source을 추가할 때docs 쿠베르네트스 성계군에서 운행하는 그라파나와 프로메테우스가 어렵다는 것을 깨달았다.
근거 post:

Jaeger is a distributed tracing system released as open source by Uber Technologies. It is used for monitoring and troubleshooting microservices-based distributed systems, including distributed context propagation, distributed transaction monitoring, root cause analysis, service dependency analysis and performance/latency optimization


이때 사람들은 분포식 추적이 무엇인지 알고 싶어 할지도 모른다.

An understanding of application behaviour can be a fascinating task in a microservice architecture. This is because incoming requests may cover several services, and on this request, each intermittent service may have one or more operations. This makes it more difficult and requires more time to resolve problems.

Distributed tracking helps gain insight into each process and identifies failure regions caused by poor performance.


1. 따라서 Jaeger 설치를 안내하고 Grafana 및 문제 해결에 포함시킬 이 설명서를 아래에 기록하기로 결정했습니다.
참고: Jaeger를 사용한 분산 추적 및 백엔드/프런트엔드 어플리케이션 성능/지연 최적화는 논의되지 않습니다.만약 이것이 네가 흥미를 느끼는 물건이라면, 이것을 봐라. install Prometheus & Grafana using Helm 3 on Kubernetes cluster running on Vagrant VM 아주 유용하다.
참고: 이 문서에서는 다음을 가정합니다.
  • 당신은 쿠베르네트스
  • 를 잘 알고 있습니다.
  • 실행 중인 Kubernetes 클러스터와
  • 당신은 이미 집단
  • 에 그라파나와 프로메테우스를 설치하였습니다
    없는 경우 이전 게시물 참조

    Kubernetes에 Jaeger 연산자 설치 누비다


    이 섹션은
  • Access Jaeger UI on Browser
  • Configuring Jaeger Data Source on Grafana
  • Debugging and Troubleshooting
  • 제이그 계산 Kubernetes에 Jaeger 연산자 설치


    우선 설치CRD가 필요합니다.

    The Jaeger Operator is an implementation of a Kubernetes Operator. Operators are pieces of software that ease the operational complexity of running another piece of software. More technically, Operators are a method of packaging, deploying, and managing a Kubernetes application.


    다음 명령은 이름 공간을 만들고 같은 이름 공간에 Jaeger 연산자 (( for observability 를 설치합니다.
    export namespace=observability
    kubectl create namespace ${namespace}
    kubectl create -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/crds/jaegertracing.io_jaegers_crd.yaml
    kubectl create -n ${namespace} -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/service_account.yaml
    kubectl create -n ${namespace} -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/role.yaml
    kubectl create -n ${namespace} -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/role_binding.yaml
    kubectl create -n ${namespace} -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/operator.yaml
    
    kubectl create -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/cluster_role.yaml
    kubectl create -f https://raw.githubusercontent.com/jaegertracing/jaeger-operator/master/deploy/cluster_role_binding.yaml
    
    apiVersion: jaegertracing.io/v1 구축 후 Jaeger 인스턴스를 만들어야 합니다. 다음 코드 세그먼트를 참조하십시오.
    mkdir -p jaeger-tracing
    cat >> jaeger-tracing/jaeger.yaml <<EOF
    apiVersion: jaegertracing.io/v1
    kind: Jaeger
    metadata:
      name: my-traces
      namespace: ${namespace}
    EOF
    kubectl apply -n ${namespace} -f jaeger-tracing/jaeger.yaml
    
    jaeger-operator라는 Jaeger 인스턴스를 만든 후 다음 명령을 실행하여 POD와 서비스가 성공적으로 실행되었는지 확인할 수 있습니다.
    kubectl get -n ${namespace} pods,svc
    
    Ingress
    Jaeger 사용자 인터페이스는 를 통해 제공됩니다.

    An Ingress exposes HTTP and HTTPS routes from outside the cluster to services within the cluster. We can verify that an ingress service exists, by running:


    kubectl get -n ${namespace} ingress -o yaml | tail
    

    참고: 나중에 Grafana에서 데이터 원본을 설정할 때 서비스 이름과 포트 번호가 매우 유용할 것입니다.

    항구 전진 브라우저에서 Jaeger 사용자 인터페이스 액세스


    테스트 목적으로에 액세스하여 다음 명령을 실행하여 로컬 호스트에서 액세스할 수 있습니다.
    kubectl port-forward -n ${namespace} \
        $(kubectl get pods -n ${namespace} -l=app="jaeger" -o name) 16686:16686
    
    그런 다음 브라우저에서 Jaeger UI에 액세스하여 설치가 성공했는지 확인할 수 있습니다.

    Jaeger 쿼리 Grafana에서 Jaeger 데이터 소스 구성


    Jaeger를 데이터 원본으로 설정하려면, Kubernetes 서비스와 포트의 DNS 기록을 조회하는 데 사용할 서비스 이름을 검색해야 합니다.

    Query is a service that retrieves traces from storage and hosts a UI to display them.


    근거 Kubernetes docs:

    Every Service defined in the cluster (including the DNS server itself) is assigned a DNS name. By default, a client Pod's DNS search list includes the Pod's namespace and the cluster's default domain.


    우리는 Jaeger Query 단점의 전체 DNS 이름을 검색할 수 있으며,Grafana의 데이터 원본 URL로 사용할 수 있습니다
    근거 Kubernetes docs:

    A DNS query may return different results based on the namespace of the pod making it. DNS queries that don't specify a namespace are limited to the pod's namespace. Access services in other namespaces by specifying them in the DNS query.


    다음 코드는 Jaeger 쿼리 service 의 DNS를 컴파일합니다. 이 쿼리는 로컬 그룹에서 실행되는 my-traces 이름 공간에 존재합니다.

    In Kubernetes, a Service is an abstraction that defines a logical set of Pods and a policy by which to access them (sometimes this pattern is called a micro-service).


    참고, 모드observability
    ingress_name=$(kubectl get -n ${namespace} ingress -o jsonpath='{.items[0].metadata.name}'); \
    ingress_port=$(kubectl get -n ${namespace} ingress -o jsonpath='{.items[0].spec.defaultBackend.service.port.number}'); \
    echo -e "\n\n${ingress_name}.${namespace}.svc.cluster.local:${ingress_port}"
    

    위의 리셋 URL(포트 번호 포함)을 복사하고 Grafana UI를 열어 데이터 원본을 추가합니다. 선택<service_name>.<namespace>.svc.cluster.local을 통해 링크가 성공했는지 확인합니다.

    "Jaeger: Bad Gateway. 502. Bad Gateway"또는 유사한 오류가 발생하면 debugging and troubleshooting
    다음 그림은 Grafana의 JaegerSpan 흔적을 조회할 수 있는 성공적인 통합을 보여 준다.

    A span represents a logical unit of work in Jaeger that has an operation name, the start time of the operation, and the duration. Spans may be nested and ordered to model causal relationships.



    디버그 및 문제 해결

  • Jaeger 문서에는 자주 묻는 질문의 목록이 포함되어 있습니다. 여기link를 클릭하여 더 많은 정보를 얻으십시오.
  • 질문이 DNS와 관련이 있는 경우save&test가 실행 중인지 확인하십시오. 모든 서비스 객체의 클러스터 DNS 이름은 kube-dns입니다. 따라서 다른 모든 항목은 <service_name>.<namespace>.svc.cluster.local에서 주소를 찾습니다<service_name>.
  • 다음 작업에 대해 우리는 그룹에서 Docker 용기를 실행해야 한다. 이 용기는 그룹에서 유용한 BIND 실용 프로그램 목록을 제공한다. 예를 들어 <namespace>, dighost 등이다.
  • 구글에서 몇 차례 검색한 후에, 나는 아래에서 이 유행하는 용기를 찾았다. 구글에 악성 소프트웨어 패키지가 있는지 조사하고 검사한 후에, 나는 그것을 사용하여 디버깅을 하기로 결정했다.
    자세히 보기how to harden the security of your Docker environment

    다음 명령을 실행하면 nslookup Docker 이미지에 따라 새로 만든pod에서 bash 셸을 호출합니다.
    vagrant@dashboard:~> kubectl run dnsutils --image tutum/dnsutils -ti -- bash
    
    주의: 나는 한 유랑자의 상자 위에서 달리기k3s를 했다.이런 상황에서 당신은 k3s에 익숙하지 않습니다.

    K3s, is designed to be a single binary of less than 40MB that completely implements the Kubernetes API. To achieve this, they removed a lot of extra drivers that didn't need to be part of the core and are easily replaced with add-ons.

    K3s is a fully CNCF (Cloud Native Computing Foundation) certified Kubernetes offering. This means that you can write your YAML to operate against a regular "full-fat" Kubernetes, and they'll also apply against a k3s cluster.


    어쨌든 우리는 정상적인 궤도에서 벗어나지 말아야 한다.이전에 Docker를 사용한 적이 있다면 dnsutils를 대체kubectl run로 사용하십시오.그것은 콩꼬투리에서 특정한 그림을 만들고 실행합니다.
    다음 명령은 docker run (Domain Information Groper) 유틸리티를 사용하여 각종 DNS 기록을 조회합니다. 이 유틸리티는 Kubernetes 필드 dig 에 존재하는 A Record IP 주소 목록을 되돌려주고, 전체 호스트 이름을 *.*.svc.cluster.local 명명 공간을 포함하는 stdOUT 기록에 출력합니다.
    root@dnsutils:/# namespace=observability
    root@dnsutils:/# for IP in $(dig +short *.*.svc.cluster.local); do
        HOSTS=$(host $IP)
        if grep -q "${namespace}" <<< "$HOSTS"; then
            echo "${HOSTS}";
        fi;
    done
    
    다음은 관심 있는 특정 서비스의 호스트 이름observability을 강조한 사진입니다.

    그런 다음 nmap 유틸리티를 사용하여 호스트 이름의 포트를 확인합니다. my-traces-query.observability.svc.cluster.local.그러나 16686 용기에 미리 설치되지 않았기 때문에 우리는 수동으로 설치할 수 있다.
    root@dnsutils:/# apt update -qq && apt install -y nmap
    
    이 유틸리티를 설치한 후, 우리는 Jaegerquery가 실행해야 할 포트를 스캔할 수 있습니다. Configuring Jaeger Data Source on Grafana 와 같습니다.
    root@dnsutils:/# nmap -p 16686 my-traces-query.observability.svc.cluster.local
    
    다음 그림은 포트nmap가 열려 있음을 보여 줍니다. 이 명령을 실행하면 UI를 실행하거나 Grafana 데이터 원본으로 Jaeger 조회에 접근할 수 있는지 확인합니다.

    내가 쿠베르네트스, 제이그, 그라파나 주변에서 자신의 방법을 찾게 됨에 따라, 나는 새로운 디버깅 방법으로 이 글을 업데이트하려고 한다.
    만약 당신에게 어떤 건의가 있다면, 아래에 메시지를 남겨 주십시오. 우리는 당신에게 연락할 것입니다.

    참고 문헌

  • Grafana Data Sources
  • Jaeger: Operator for Kubernetes
  • What are Custom Resource Definitions?

  • A Guide to Deploying Jaeger on Kubernetes in Production
  • Distributed Tracing with Jaeger on Kubernetes
  • Build a monitoring infrastructure for your Jaeger installation
  • How To Implement Distributed Tracing with Jaeger on Kubernetes
  • An Introduction to the Kubernetes DNS Service
  • Kubernetes DNS for Services and Pods
  • How To Use Nmap to Scan for Open Ports
  • How to Scan & Find All Open Ports with Nmap
  • 좋은 웹페이지 즐겨찾기