本文主要记录了如何在生产环境中部署 Jaeger各个组件,包括 Agent、Collector、Query、Storage 等等。

1. 概述

测试部署时有官方提供的 all-in-one 的镜像,同时直接将数据存储在内存中,所以部署起来比较方便。

但是线上则建议单独部署各个组件和存储后端(这里采用ES存储)。

1. 架构

jaeger-architecture.png

完整架构包含如下组件:

  • 1)jaeger-agent
  • 2)jaeger-collector
  • 3)jaeger-query
  • 4)jaeger-ingester
  • 5)elasticsearch
  • 6)kafka

2. 数据流

具体流程如下:

  • 1)客户端通过 6831 端口上报数据给 agent
  • 2)agent通过 14250 端口将数据发送给 collector
  • 3)collector 将数据写入 kafka
  • 4)Ingester 从 kafka中读取数据并写入存储后端
  • 5)query 从存储后端查询数据并展示

2. 各组件介绍

暂时只部署collectoragentqueryes这四个组件。

其中collectorqueryes可以只部署一个。

但是agent则建议部署在每一台需要追踪的主机上,这样可以离 client 近一点。

1. agent

jaeger-agent 是客户端代理,需要部署在每台主机上。

Port Protocol Function
6831 UDP 客户端上报jaeger.thrift compact协议数据,大部分客户端都使用这个
6832 UDP jaeger.thrift binary协议数据。为node客户端单独开的一个端口,因为node 不支持jaeger.thrift compact协议
5778 HTTP 服务器配置
5775 UDP zipkin.thrift compact 兼容zipkin的
14271 HTTP 健康检查和 metrics

2. collector

收集器,可以部署多个。收集 agent 发来的数据并写入 db 或 kafka。

Port Protocol Function
14250 gRPC jaeger-agent通过该端口将收集的 span以 model.proto 格式发送到 collector
14268 HTTP 客户端可以通过该端口直接将 span发送到 collector。
9411 HTTP 用于兼容 zipkin
14269 HTTP 健康检查和 metrics

3. query

UI 界面,主要做数据展示。

Port Protocol Function
16686 HTTP 默认url localhost:16686
16686 gRPC gRPC查询服务?
16687 HTTP 健康检查和 metrics

4. ingester

主要从 kafka 中读取数据并写入存储后端。

Port Protocol Function
14270 HTTP 健康检查和 metrics

5. Storage Backends

用于存储收集的数据。

支持 Cassandra 和 Elasticsearch。

6.Kafka

可以在收集器和后端存储之间做缓冲。

3. docker-compose

使用 docker-compose进行部署。

首先创建一个 docker network。

1
docker network create jaeger

然后将各个组件都放到一个网络里,这样会比较方便。

collector-query

这里暂时collector query 放在一起。

测试完成后可以把 LOG_LEVEL=debug 这个删掉。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '3.2'
services:
  # jaeger-collector 收集器
  jaeger-collector:
    image: jaegertracing/jaeger-collector
    container_name: jaeger-collector
    environment:
      - SPAN_STORAGE_TYPE=elasticsearch
      - ES_SERVER_URLS=http://jaeger-es:9200
      - ES_USERNAME=elastic
      - LOG_LEVEL=debug
    ports:
      - 9411:9411
      - 14250:14250
      - 14268:14268
      - 14269:14269
  # jaeger-query UI
  jaeger-query:
    image: jaegertracing/jaeger-query
    container_name: jaeger-query
    environment:
      - SPAN_STORAGE_TYPE=elasticsearch
      - ES_SERVER_URLS=http://jaeger-es:9200
      - ES_USERNAME=elastic
      - LOG_LEVEL=debug
    ports:
      - 16686:16686
      - 16687:16687

networks:
  default:
    external:
      name: jaeger

es

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.2'
services:
  # elasticsearch jaeger存储后端 单独部署
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
    container_name: jaeger-es
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.type=single-node
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./data:/usr/share/elasticsearch/data
    ports:
      - 9201:9200

networks:
  default:
    external:
      name: jaeger

kibana

为了方便管理ES中的数据还是部署一个kibana吧

注意:Kibana的版本必须和ES一致

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
version: '3.2'
services:
  # kibana 方便观察es中的数据
  kibana:
    image: 'kibana:7.8.0'
    container_name: jaeger-kibana
    environment:
      SERVER_NAME: kibana.local
      ELASTICSEARCH_HOSTS: http://jaeger-es:9200
      I18N_LOCALE: zh-en
    ports:
      - 5602:5601

networks:
  default:
    external:
      name: jaeger

agent

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
version: '3.2'
services:
  # jaeger-agent 单独部署到各个需要采集的机器上
  jaeger-agent:
    image: jaegertracing/jaeger-agent
    container_name: jaeger-agent
    environment:
      - REPORTER_GRPC_HOST_PORT=jaeger-collector:14250
      - LOG_LEVEL=debug
    ports:
      - 5775:5775/udp
      - 5778:5778
      - 6831:6831/udp
      - 6832:6832/udp
      - 14271:14271

networks:
  default:
    external:
      name: jaeger

REPORTER_GRPC_HOST_PORT 用于指定collector的地址,这里是同一个网络所以能直接通过container_name 访问。

4. Metrics

默认情况下,Jaeger microservices以Prometheus格式公开指标。

只需要对外暴露相应端口号即可。

默认端口号如下

Component Port
jaeger-agent 14271
jaeger-collector 14269
jaeger-query 16687
jaeger-ingester 14270
all-in-one 14269

也可以自定义

  • 1)--admin-http-port 指定端口号
  • 2)--metrics-backend指定指标数据格式,默认为Prometheus格式,可选格式为expvar.
  • 3)--metrics-http-route指定路由,默认为/metrics

一般用默认格式的就可以了。

在 Prometheus 中增加相应采集任务即可。

5. 参考

https://www.jaegertracing.io/docs/1.20/deployment/