4. OpenTelemetry Collector 部署:Docker、Kubernetes DaemonSet 与配置文件结构

OpenTelemetry Collector 是观测数据管道的核心组件,负责接收、处理并导出遥测数据。本章聚焦三种主流部署方式:Docker 单机部署、Kubernetes DaemonSet 部署,以及配置文件结构(receivers / processors / exporters)。掌握这些内容后,你可以在任何环境中快速搭建 Collector 并接入 Runbook 故障闭环。

4.1 部署方式对比

部署方式 适用场景 数据采集范围 资源隔离 扩展性
Docker 单机 开发测试、边缘节点、轻量采集 单主机 容器级 手动扩展
Kubernetes DaemonSet 生产集群、K8s 原生观测 每个 Node 一个 Pod Pod 级 + 节点级 自动随节点扩缩
Kubernetes Deployment 集中式网关、数据聚合 全局 / 命名空间级 Pod 级 HPA 自动扩缩
选型建议:生产 K8s 环境优先使用 DaemonSet 采集节点指标和日志,配合 Deployment 模式部署集中式 Collector 做数据聚合与转发,形成两级管道架构。

4.2 Docker 部署 Collector

Docker 部署适合快速验证和边缘场景。以下命令启动一个完整的 Collector 实例,并挂载本地配置文件:

# 拉取官方镜像
docker pull otel/opentelemetry-collector-contrib:0.116.0

# 启动 Collector(挂载配置 + 暴露端口)
docker run -d \
  --name otel-collector \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 8888:8888 \
  -v $(pwd)/otel-config.yaml:/etc/otel/config.yaml \
  otel/opentelemetry-collector-contrib:0.116.0 \
  --config /etc/otel/config.yaml

端口说明:

  • 4317:gRPC 接收端点(OTLP)
  • 4318:HTTP 接收端点(OTLP)
  • 8888:Prometheus 指标暴露端口(用于自监控)
验证部署:访问 http://localhost:8888/metrics 可查看 Collector 自身指标,确认进程正常运行。

4.3 Kubernetes DaemonSet 部署

DaemonSet 确保每个 K8s 节点运行一个 Collector Pod,适合采集节点级指标、容器日志和 kubelet 指标。以下是核心 YAML 配置片段:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: otel-collector-daemon
  namespace: observability
spec:
  selector:
    matchLabels:
      app: otel-collector
  template:
    metadata:
      labels:
        app: otel-collector
    spec:
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      containers:
      - name: otel-collector
        image: otel/opentelemetry-collector-contrib:0.116.0
        args: ["--config", "/etc/otel/config.yaml"]
        ports:
        - containerPort: 4317
          hostPort: 4317
          name: otlp-grpc
        - containerPort: 4318
          hostPort: 4318
          name: otlp-http
        volumeMounts:
        - name: config-volume
          mountPath: /etc/otel
        - name: varlog
          mountPath: /var/log
          readOnly: true
        - name: varlibdocker
          mountPath: /var/lib/docker/containers
          readOnly: true
      volumes:
      - name: config-volume
        configMap:
          name: otel-collector-config
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdocker
        hostPath:
          path: /var/lib/docker/containers
关键配置说明:
  • hostNetwork: true 使 Pod 直接使用节点网络,避免端口映射冲突。
  • 挂载 /var/log 和 /var/lib/docker/containers 用于采集节点日志和容器标准输出。
  • ConfigMap 管理 Collector 配置文件,更新后需滚动重启 DaemonSet。

4.4 配置文件结构:Receivers / Processors / Exporters

Collector 配置文件采用 YAML 格式,核心由三大组件构成:receivers(数据接收)、processors(数据处理)、exporters(数据导出)。数据在 pipeline 中按顺序流动。

OpenTelemetry Collector 数据管道架构 Receivers OTLP Receiver Prometheus Receiver Filelog Receiver Kubeletstats Receiver 数据入口 Processors Batch Processor Memory Limiter Attributes Processor Filter Processor 数据处理与增强 Exporters OTLP Exporter Prometheus Exporter Loki Exporter Tempo Exporter 数据出口 Pipeline 定义:service.pipelines 中串联 receivers → processors → exporters,形成完整数据流 支持 traces / metrics / logs 三条独立 pipeline

4.5 完整配置示例

以下是一个生产级 Collector 配置,同时处理 traces、metrics 和 logs:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
  prometheus:
    config:
      scrape_configs:
        - job_name: 'kubelet'
          scrape_interval: 30s
          static_configs:
            - targets: ['localhost:10250']
  filelog:
    include: [/var/log/pods/*/*/*.log]
    start_at: beginning

processors:
  batch:
    timeout: 5s
    send_batch_size: 1024
  memory_limiter:
    check_interval: 1s
    limit_mib: 512
  attributes:
    actions:
      - key: environment
        value: production
        action: upsert
  filter:
    error_mode: ignore
    metrics:
      exclude:
        match_type: regexp
        metric_names:
          - 'container.*cpu.*'

exporters:
  otlp:
    endpoint: tempo.monitoring:4317
    tls:
      insecure: true
  prometheus:
    endpoint: 0.0.0.0:8889
  loki:
    endpoint: http://loki.monitoring:3100/loki/api/v1/push

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch, attributes]
      exporters: [otlp]
    metrics:
      receivers: [otlp, prometheus]
      processors: [memory_limiter, batch, filter]
      exporters: [prometheus]
    logs:
      receivers: [otlp, filelog]
      processors: [memory_limiter, batch, attributes]
      exporters: [loki]

4.6 组件详解

4.6.1 Receivers(数据接收器)

Receiver 是数据进入 Collector 的入口,支持多种协议和数据源:

  • OTLP Receiver:接收原生 OpenTelemetry 协议数据(gRPC / HTTP)
  • Prometheus Receiver:抓取 Prometheus 指标端点
  • Filelog Receiver:采集容器和节点日志文件
  • Kubeletstats Receiver:从 kubelet API 拉取节点和 Pod 指标
  • Host Metrics Receiver:采集主机 CPU、内存、磁盘等指标

4.6.2 Processors(数据处理处理器)

Processor 在数据导出前执行过滤、增强、批处理等操作:

Processor 功能 典型配置参数
batch 合并数据为批次,减少导出请求次数 timeout, send_batch_size
memory_limiter 防止 Collector OOM,达到阈值时丢弃数据 limit_mib, check_interval
attributes 添加、修改或删除属性(标签) actions: key, value, action
filter 根据条件包含/排除指标、span 或日志 metrics/traces/logs: include/exclude
transform 使用 OTTL 语言对数据进行复杂转换 statements: context, statements[]

4.6.3 Exporters(数据导出器)

Exporter 将处理后的数据发送到后端存储或分析系统:

  • OTLP Exporter:转发到另一个 Collector 或后端(如 Tempo、Jaeger)
  • Prometheus Exporter:暴露 /metrics 端点供 Prometheus 抓取
  • Loki Exporter:推送日志到 Loki
  • Elasticsearch Exporter:写入 Elasticsearch
  • Debug Exporter:将数据打印到控制台,用于调试
生产最佳实践:始终在 pipeline 中配置 memory_limiter 和 batch processor,前者保障 Collector 稳定性,后者提升导出吞吐量。建议将 memory_limiter 放在 processor 列表首位。

4.7 部署验证与自监控

部署完成后,通过以下方式验证 Collector 是否正常工作:

  1. 检查 Pod 状态:kubectl get pods -n observability -l app=otel-collector
  2. 查看 Collector 日志:kubectl logs -n observability <pod-name> --tail=50
  3. 访问自监控指标:kubectl port-forward -n observability <pod-name> 8888:8888 然后访问 http://localhost:8888/metrics
  4. 发送测试数据:使用 telemetrygen 工具发送模拟 trace 或 metric
# 使用 telemetrygen 发送测试 trace
telemetrygen traces --otlp-endpoint localhost:4317 --duration 5s

# 验证数据是否到达后端(以 Prometheus 为例)
curl http://localhost:8889/metrics | grep otelcol
常见问题:
  • DaemonSet 中 hostNetwork: true 可能导致端口冲突,建议使用非标准端口或调整 hostPort。
  • Filelog Receiver 需要挂载宿主机日志目录,确保 Pod 有读取权限。
  • Memory Limiter 的 limit_mib 建议设置为容器内存 limit 的 70%。