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 доступен сторонним сервисам.
Процедура#
Процедура интеграции:
Создайте namespace
observability, введите команду:kubectl create namespace observabilityСоздайте файл манифеста dapp-jaeger-operator.yaml
Выполните команду:
kubectl apply -f ./dapp-jaeger-operator.yamlВыполните команду:
kubectl rollout status deployment.apps/jaeger-operator -n observabilityПроверьте что в выводе содержится фраза
successfully rolled out.Создайте файл манифеста 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: ""Выполните команду:
kubectl apply -f ./dapp-jaeger-all-in-one.yamlВыполните команду:
kubectl get jaeger my-jaeger -n observability -o jsonpath='{.status.phase}'Убедитесь, что Jaeger CRD с именем
my-jaegerимеет в описании статусRunning.Выполните команду:
kubectl get jaeger -n observabilityПроверьте, что в выводе есть jaeger с именем
my-jaeger,strategy = all-in-oneиstorage = memory.Убедитесь в том что
my-jaegerrollout успешен - выполните команду:kubectl rollout status deployment.apps/my-jaeger -n observabilityПроверьте что в выводе содержится фраза
successfully rolled out.Сделайте port-forward для сервиса
my-jaeger-queryнаlocalhost, выполните команду:kubectl port-forward service/my-jaeger-query -n observability --address localhost 16686:16686Выполните команду
curl -L localhost:16686Откройте в браузере адрес
http://localhost:16686, убедитесь что на странице отображается кнопка Find Traces.