Skip to content

全链路状态跟踪 程序插桩

后端Jaeger

资源清单

yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jaeger
  namespace: otel
spec:
  replicas: 1
  selector:
    matchLabels: 
      app: jaeger
  template:
    metadata:
      labels:
        app: jaeger
    spec:
      containers:
      - name: jaeger
        image: jaegertracing/jaeger:2.3.0
        env:
          - name: COLLECTOR_OTLP_ENABLED
            value: "true" 
          # - name: SPAN_STORAGE_TYPE  # 生产环境需要配置存储
          #   value: elasticsearch
          # - name: ES_SERVER_URLS
          #   value: http://elasticsearch.jaeger.svc.cluster.local:9200
        ports:
          - containerPort: 16686
          - containerPort: 4317
          - containerPort: 4318
          - containerPort: 5778
          - containerPort: 9411
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    # openELB靠注解来绑定
    lb.kubesphere.io/v1alpha1: openelb
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip
  name: jaeger
  namespace: otel
spec:
  selector:
    app: jaeger
  ports:
    - name: ui
      protocol: TCP
      port: 16686
      targetPort: 16686
    - name: grpc
      port: 4317
      targetPort: 4317
    - name: http
      port: 4318
      targetPort: 4318
    - port: 5778
      targetPort: 5778
    - port: 9411
      targetPort: 9411
  type: LoadBalancer

在k8s中快速使用Jaeger和OpenTelemetry 安装cert-manager和OpenTelemetry Operator 官方指南

cert-manager

自动化 Kubernetes 集群中 TLS 证书的颁发和管理

bash
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml

OpenTelemetry Operator

简化 OpenTelemetry 组件 (例如 Collector、Agent) 的部署、配置和管理

bash
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml

OpenTelemetry Collector

collector接受数据推送到后端,比如jaeger

yml
kind: OpenTelemetryCollector
metadata:
  name: otel
  namespace: otel
spec:
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:
      memory_limiter:
        check_interval: 15
        limit_percentage: 75
        spike_limit_percentage: 15
      batch:
        send_batch_size: 10000
        timeout: 105
    exporters:
      otlp/jaeger:
        endpoint: "jaeger.otel.svc.cluster.local:4317"
        tls:
          insecure: true
    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [otlp/jaeger]

endpoint根据实际地址修改

Instrumentation配置(插桩)

Instrumentation 是 Otel Operator 的另一个 CRD,用于自动安装 Otel 探针和配置:

  • propagators 用于配置跟踪信息在上下文的传递方式。
    • tracecontext:用于传递跟踪信息的标准格式。
    • baggage:允许将额外的信息与请求一起传递,通常用于实现一些额外的元数据传递。
    • b3:一种流行的分布式跟踪格式,支持多种上下文传播方式。
  • sampler 采样器
  • env 和 [language].env添加到容器的境変量
yml
apiVersion: opentelemetry.io/v1alpha1  
kind: Instrumentation
metadata:
  name: instrumentation-sample
spec:
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: always_on
  env:
    # 环境变量 指定收集器ENDPOINT
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: otel-collector.otel.svc.cluster.local:4317
  java:
    env:
      # 这里必须有http协议,端口必须是grpc端口
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: http://otel-collector.otel.svc.cluster.local:4317
      # 测试用,关闭了metrics收集
      - name: OTEL_METRICS_EXPORTER
        value: none

java项目示例

注解插桩,会自动使用Instrumentation配置,在pod内部多运行一个init container推送给otel-collector

yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-sample
spec:
  replicas: 1
  selector:
    matchLabels:
      app: java-sample
  template:
    metadata:
      labels:
        app: java-sample
      annotations:
        # 注解插桩
        instrumentation.opentelemetry.io/inject-java: "true"
    spec:
      containers:
        - name: java-sample
          image: chompujaa/spring-boot-web:v1
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: java-sample
  annotations:
    lb.kubesphere.io/v1alpha1: openelb
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip
spec:
  selector:
    app: java-sample
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  type: LoadBalancer