Contents

分布式链路追踪教程(五)---Jaeger线上环境部署

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

1. 概述

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

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

1. 架构

https://github.com/lixd/blog/raw/master/images/tracing/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 是客户端代理,需要部署在每台主机上。

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

2. collector

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

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

3. query

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

PortProtocolFunction
16686HTTP默认url localhost:16686
16686gRPCgRPC查询服务?
16687HTTP健康检查和 metrics

4. ingester

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

PortProtocolFunction
14270HTTP健康检查和 metrics

5. Storage Backends

用于存储收集的数据。

支持 Cassandra 和 Elasticsearch。

6.Kafka

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

3. docker-compose

使用 docker-compose进行部署。

首先创建一个 docker network。

docker network create jaeger

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

collector-query

这里暂时collector query 放在一起。

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

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

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一致

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

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格式公开指标。

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

默认端口号如下

ComponentPort
jaeger-agent14271
jaeger-collector14269
jaeger-query16687
jaeger-ingester14270
all-in-one14269

也可以自定义

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

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

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

5. 参考

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