Jaeger#

Jaeger используется для мониторинга и устранения неполадок распределенных систем на основе микросервисов, включая:

  • распределенное распространение контекста;

  • распределенный мониторинг транзакций;

  • анализ причин;

  • анализ зависимости сервисов;

  • оптимизация производительности и задержки.

Интерфейс Jaeger поддерживает два типа графов сервисов: системную архитектуру и график глубоких зависимостей.

Инструмент Jaeger версии 1.52.0 содержит следующие образы:

  • all-in-one - исполняемый файл, предназначенный для быстрого локального тестирования. Включает в себя пользовательский интерфейс Jaeger, jaeger-collector - компонент, который получает трассировки от агентов и прогоняет их по конвейеру обработки, jaeger-query - сервис, который извлекает трассировки из хранилища и отображает их в пользовательском интерфейсе, jaeger-agent - сетевой демон, который принимает spans (спаны) по UDP-протоколу;

  • jaeger-ingester - сервис, который извлекает трассировки из Kafka и записывает их в хранилище на сервере;

  • jaeger-operator - компонент, который управляет жизненным циклом Jaeger в кластере DropApp. Автоматически создает и управляет необходимыми ресурсами, такими как Deployments, Services и PersistentVolumes, чтобы обеспечить корректную работу Jaeger;

  • jaeger-es-index-cleaner - компонент, который отвечает за очистку старых индексов. Автоматически удаляет старые данные трассировки, чтобы освободить место в хранилище данных и улучшить производительность Jaeger.

Граф системной архитектуры показывает зависимости сервисов, наблюдаемых в архитектуре. Граф представляет только зависимости между сервисами с одним переходом, аналогично тому, что можно получить из телеметрии, создаваемой сетками сервисов. Например, граф A - B - C означает, что есть некоторые трассировки, содержащие сетевые вызовы между A и B, а также некоторые трассировки с вызовами между B и C. Однако это не означает, что существуют следы, содержащие полную цепочку A - B - C, то есть нельзя сделать вывод, что это A зависит от C.

Детализация nodes этого графа касается только сервисов, а не конечных точек сервисов.

Граф системной архитектуры можно построить из хранилища в памяти или с помощью команд Spark или Flink при использовании распределенного хранилища.

Граф глубоких зависимостей также известен как «график транзитивной зависимости», где цепочка A -> B -> C означает транзитивную зависимость A от C. Для одного графика требуется «фокусный» сервис и отображаются только пути, проходящие через этот сервис. Обычно этот тип графика не отражает полную архитектуру системы, если только не существует службы, которая подключена ко всем сервисам, например шлюз API, и выбрана в качестве фокусной службы.

Детализация узлов этого графа может быть изменена между службами и конечными точками служб. В последнем режиме разные конечные точки одной и той же службы будут отображаться как отдельные узлы, например A::op1 и A::op2.

Серверная часть Jaeger не имеет единых точек отказа и может масштабироваться.

Jaeger-operator может быть установлен в кластерах на базе DropApp и способен отслеживать новые пользовательские ресурсы Jaeger (CR Jaeger) в определенных namespace или во всем кластере. Обычно в кластере имеется только один Jaeger-operator, но в многопользовательских сценариях может быть не более одного Jaeger-operator на namespace. При обнаружении нового CR Jaeger оператор попытается назначить себя владельцем ресурса, установив метку jaegertracing.io/operated-by для нового CR, используя namespace и имя оператора в качестве значения метки.

При настройке режима кластера оператор может:

  • отслеживать события, связанные с ресурсами Jaeger, во всех namespaces;

  • наблюдать за namespaces в поисках аннотации sidecar.jaegertracing.io/inject;

  • просматривать все развертывания, добавлять или удалять Sidecar (сайдкары) на основе аннотации sidecar.jaegertracing.io/inject;

  • при необходимости создавать привязки ролей кластера.

Если ресурсы всего кластера не используются (ClusterRole и ClusterRoleBinding), задайте WATCH_NAMESPACE для параметра разделенного запятыми списка namespaces, в которых Jaeger-operator должен отслеживать события, связанные с ресурсами. Допустимо запустить Jaeger-operator в одном namespace (например, observability) и управлять ресурсами Jaeger в другом (например, myproject). Для этого используйте RoleBinding для каждого namespace, за которым оператор должен следить за ресурсами:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: jaeger-operator-in-myproject
  namespace: myproject
subjects:
- kind: ServiceAccount
  name: jaeger-operator
  namespace: observability
roleRef:
  kind: Role
  name: jaeger-operator
  apiGroup: rbac.authorization.k8s.io

Следующие инструкции создадут namespace observability и установят туда Jaeger-operator. По умолчанию оператор будет отслеживать все namespaces.

Сценарий интеграции в кластер компонентов Jaeger со стратегией all-in-one#

Предварительные условия#

Предварительные условия интеграции:

  • cоздан манифест файл dapp-cert-manager.yaml и выполнена команда kubectl apply -f ./dapp-cert-manager.yaml;

  • cert-manager установлен;

  • cert-manager-webhook установлен;

  • cert-manager-cainjector установлен;

  • cert-manager-webhook доступен сторонним сервисам.

Процедура#

Процедура интеграции:

  1. Создайте namespace observability, введите команду:

    kubectl create namespace observability
    
  2. Создайте файл манифеста dapp-jaeger-operator.yaml

  3. Выполните команду:

    kubectl apply -f ./dapp-jaeger-operator.yaml
    
  4. Выполните команду:

    kubectl rollout status deployment.apps/jaeger-operator -n observability
    

    Проверьте что в выводе содержится фраза successfully rolled out.

  5. Создайте файл манифеста dapp-jaeger-all-in-one.yaml следующего содержания:

    apiVersion: jaegertracing.io/v1
    kind: Jaeger
    metadata:
      name: my-jaeger
      namespace: observability
    spec:
      strategy: allInOne
      allInOne:
        image: /example/1.3.0/dapp-jaeger-2/all-in-one:1.49.0
        options:
          log-level: debug
      storage:
        type: memory
        options:
          memory:
            max-traces: 100000
      ingress:
        enabled: false
      agent:
        strategy: DaemonSet
        image: /example/1.3.0/dapp-jaeger-2/jaeger-agent:1.49.0
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ""
    
  6. Выполните команду:

    kubectl apply -f ./dapp-jaeger-all-in-one.yaml
    
  7. Выполните команду:

    kubectl get jaeger my-jaeger -n observability -o jsonpath='{.status.phase}' 
    

    Убедитесь, что Jaeger CRD с именем my-jaeger имеет в описании статус Running.

  8. Выполните команду:

    kubectl get jaeger -n observability
    
  9. Проверьте, что в выводе есть jaeger с именем my-jaeger, strategy = all-in-one и storage = memory.

  10. Убедитесь в том что my-jaeger rollout успешен - выполните команду:

    kubectl rollout status deployment.apps/my-jaeger -n observability
    

    Проверьте что в выводе содержится фраза successfully rolled out.

  11. Сделайте port-forward для сервиса my-jaeger-query на localhost, выполните команду:

    kubectl port-forward service/my-jaeger-query -n observability --address localhost 16686:16686
    
  12. Выполните команду

    curl -L localhost:16686
    
  13. Откройте в браузере адрес http://localhost:16686, убедитесь что на странице отображается кнопка Find Traces.