jaeger部署

前言:

  jaeger有两个大版本,一个是1.x,另一个是2.x。对于部署镜像来说,1.x拆分成了collector、query等多个镜像;而2.x版本则是打包成了一个镜像,部署时可以通过配置文件指定其是collector还是query。

 

以下部署方案是2.x的

 

1.jaeger部署,all-in-one模式,使用opensearch作为存储后端

配置文件参考https://github.com/jaegertracing/jaeger/tree/v2.3.0/cmd/jaeger目录下的

auth.basic和tls的配置都是网上找的,官方示例并没有

apiVersion: v1
data:
config-ui.json: |-
{
"monitor": {
"menuEnabled": true ##开启monitor的页面
}
} config.yaml: | service: extensions: [jaeger_storage, jaeger_query, healthcheckv2] ##可以通过这个配置指定是query还是collector,两个pod(可调副本)都是用一个镜像,可以配不同svc。collector把jaeger_query去掉即可,但query需要保留所有。otel-agent往collector吐数据就行 pipelines: traces: receivers: [otlp] processors: [batch] exporters: [jaeger_storage_exporter] telemetry: resource: service.name: jaeger metrics: level: detailed readers: - pull: exporter: prometheus: host: 0.0.0.0 port: 8888 logs: level: debug # TODO Initialize telemetry tracer once OTEL released new feature. # https://github.com/open-telemetry/opentelemetry-collector/issues/10663 extensions: healthcheckv2: use_v2: true http: jaeger_query: storage: traces: some_storage traces_archive: another_storage
metrics: some_storage #monitor的tag页面指标 ui: config_file: /etc/config/config-ui.json jaeger_storage: backends: some_storage: &opensearch_config opensearch: server_urls: - https://100.10.10.10:9200 auth: basic: username: "admin" password: "admin" tls: insecure_skip_verify: true ###跳过opensearch的tls认证 indices: index_prefix: "jaeger-main" spans: date_layout: "2006-01-02" rollover_frequency: "day" shards: 5 replicas: 1 services: date_layout: "2006-01-02" rollover_frequency: "day" shards: 5 replicas: 1 dependencies: date_layout: "2006-01-02" rollover_frequency: "day" shards: 5 replicas: 1 sampling: date_layout: "2006-01-02" rollover_frequency: "day" shards: 5 replicas: 1 another_storage: opensearch: server_urls: - https://100.10.10.10:9200 auth: basic: username: "admin" password: "admin" tls: insecure_skip_verify: true ###跳过opensearch的tls认证 indices: index_prefix: "jaeger-archive"
metric_backends some_storage: *opensearch_config ###指标也配置使用opensearch存储 receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 jaeger: protocols: grpc: endpoint: 0.0.0.0:14250 thrift_compact: endpoint: 0.0.0.0:6831 thrift_binary: endpoint: 0.0.0.0:6832 processors: batch: exporters: jaeger_storage_exporter: trace_storage: some_storage kind: ConfigMap metadata: name: xdd-jaeger-cm namespace: pero --- apiVersion: apps/v1 kind: Deployment metadata: name: xdd-jaeger-deployment namespace: pero spec: replicas: 2 selector: matchLabels: name: xdd-jaeger strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% template: metadata: labels: name: xdd-jaeger spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: name operator: In values: - xdd-jaeger topologyKey: "kubernetes.io/hostname" containers: - args: - --config=/etc/config/config.yaml image: jaegertracing/jaeger:v2.3.0 imagePullPolicy: Always name: xdd-jaeger-container ports: - containerPort: 16685 name: port-1 protocol: TCP - containerPort: 16686 name: port-2 protocol: TCP - containerPort: 5778 name: port-3 protocol: TCP - containerPort: 5779 name: port-4 protocol: TCP - containerPort: 27777 name: port-5 protocol: TCP - containerPort: 27778 name: port-6 protocol: TCP - containerPort: 4317 name: port-7 protocol: TCP - containerPort: 4318 name: port-8 protocol: TCP - containerPort: 6831 name: port-9 protocol: TCP - containerPort: 6832 name: port-10 protocol: TCP - containerPort: 14268 name: port-11 protocol: TCP - containerPort: 14250 name: port-12 protocol: TCP volumeMounts: - mountPath: /etc/config name: xdd-jaeger-cm dnsPolicy: ClusterFirst volumes: - configMap: defaultMode: 420 name: xdd-jaeger-cm name: xdd-jaeger-cm --- apiVersion: v1 kind: Service metadata: name: xdd-jaeger-svc namespace: pero spec: ipFamilies: - IPv4 - IPv6 ipFamilyPolicy: RequireDualStack ports: - name: port-1 port: 16685 protocol: TCP targetPort: 16685 - name: port-2 port: 16686 protocol: TCP targetPort: 16686 - name: port-3 port: 5778 protocol: TCP targetPort: 5778 - name: port-4 port: 5779 protocol: TCP targetPort: 5779 - name: port-5 port: 27777 protocol: TCP targetPort: 27777 - name: port-6 port: 27778 protocol: TCP targetPort: 27778 - name: port-7 port: 4317 protocol: TCP targetPort: 4317 - name: port-8 port: 4318 protocol: TCP targetPort: 4318 - name: port-9 port: 6831 protocol: TCP targetPort: 6831 - name: port-10 port: 6832 protocol: TCP targetPort: 6832 - name: port-11 port: 14268 protocol: TCP targetPort: 14268 - name: port-12 port: 14250 protocol: TCP targetPort: 14250 selector: name: xdd-jaeger sessionAffinity: None type: ClusterIP

 

 

2.部署完成后,可以访问opensearch查看索引,可以看到有jaeger开头的索引

curl https://100.10.10.10:9200/_cat/indices --insecure -u'admin:admin'

 

3.访问jaeger页面

100.10.10.10:16686

 

4.otel发送数据到jaeger

receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
          http:
            endpoint: 0.0.0.0:4318
    exporters:
      otlp/jaeger:
        endpoint: 100.10.10.10:4317  ###配置jaeger的4317端口,通过grpc协议发送otel格式的数据
        tls:
          insecure: true
    processors:
      #batch:
      k8sattributes:
      resource:
        attributes:
          - key: app.host.ip
            from_attribute: k8s.pod.ip
            action: insert
    #extensions:
    #  zpages: {}
    #  memory_ballast:
    #    # Memory Ballast size should be max 1/3 to 1/2 of memory.
    #    size_mib: 165
    service:
      #extensions: [zpages, memory_ballast]
      pipelines:
        traces:
          receivers: [otlp]
          processors: [k8sattributes, resource]
          exporters: [otlp/jaeger]  ###配置jaeger生效

 

手动发送数据到otel

#!/bin/bash

# 生成当前时间戳(纳秒)
current_time=$(date +%s000000000)
start_time=$((current_time - 150000000))  # 150ms前
end_time=$current_time

# 创建临时JSON文件
cat > /tmp/trace_payload.json << EOF
{
  "resourceSpans": [
    {
      "resource": {
        "attributes": [
          {
            "key": "service.name",
            "value": {
              "stringValue": "xdd-service"
            }
          }
        ]
      },
      "scopeSpans": [
        {
          "scope": {
            "name": "manual-instrumentation"
          },
          "spans": [
            {
              "traceId": "$(openssl rand -hex 16)",
              "spanId": "$(openssl rand -hex 8)",
              "name": "GET /api/v1/users/{id}",
              "kind": 2,
              "startTimeUnixNano": "$start_time",
              "endTimeUnixNano": "$end_time",
              "attributes": [
                {
                  "key": "http.method",
                  "value": {
                    "stringValue": "GET"
                  }
                },
                {
                  "key": "http.route",
                  "value": {
                    "stringValue": "/api/v1/users/:id"
                  }
                },
                {
                  "key": "http.status_code",
                  "value": {
                    "intValue": 200
                  }
                }
              ],
              "status": {
                "code": 0
              }
            }
          ]
        }
      ]
    }
  ]
}
EOF

# 发送到OpenTelemetry Collector
curl -X POST http://197.166.76.242:4318/v1/traces \
  -H "Content-Type: application/json" \
  -d @/tmp/trace_payload.json

echo "Trace sent with duration: 150ms"

 

查看索引里面的数据

curl -XGET --insecure -u 'admin:admin' \
  'https://100.10.10.10:9200/jaeger-main-jaeger-service-2025-11-07/_search' \
  -H 'Content-Type: application/json' \
  -d '{
    "query": {
      "term": {
        "process.serviceName": "xdd-service"
      }
    },
    "size": 5
  }'

 

 

 5.定时删除opensearch的数据和索引

apiVersion: batch/v1
kind: CronJob
metadata:
  name: jaeger-index-cleaner
  namespace: pero
spec:
  schedule: "0 2 * * *"
  successfulJobsHistoryLimit: 1
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: jaeger-index-cleaner
            image: jaeger:2.3.0
            imagePullPolicy: Always
            command:
            - /bin/sh
            - -c
            - sh /apps/jaeger-index-cleaner.sh
            volumeMounts:
            - mountPath: /apps/
              name: jaeger-index-cleaner-config
          volumes:
          - configMap:
              defaultMode: 420
              name: jaeger-index-cleaner-config
            name: jaeger-index-cleaner-config
          restartPolicy: OnFailure
---
apiVersion: v1
data:
  jaeger-index-cleaner.sh: |-
    current_time=$(date "+%Y-%m-%d %H:%M:%S")
    echo "----------------------$current_time------------------------"

    ##删除索引中的数据
    curl -s -XPOST --insecure -u 'admin:admin' 'https://100.10.10.10:9200/jaeger-main*/_delete_by_query?pretty' -H 'Content-Type: application/json' -d'{
      "query": {
        "range": {
          "startTimeMillis": {
            "lt": "now-2d"
          }
        }
      }
    }'

    echo -e '\n'

    ##删除索引
    LAST_DATA=`date -d "-3 days" "+%Y-%m-%d"`
    echo "curl -s -XDELETE --insecure -u 'admin:admin' 'https://100.10.10.10:9200/jaeger-main-jaeger-span-${LAST_DATA}'" | bash -x

    echo -e '\n'

    echo "curl -s -XDELETE --insecure -u 'admin:admin' 'https://100.10.10.10:9200/jaeger-main-jaeger-service-${LAST_DATA}'" | bash -x
kind: ConfigMap
metadata:
  name: jaeger-index-cleaner-config
  namespace: pero

 

posted @ 2025-02-26 09:28  wdgde  阅读(257)  评论(0)    收藏  举报