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 中按顺序流动。
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 是否正常工作:
- 检查 Pod 状态:
kubectl get pods -n observability -l app=otel-collector - 查看 Collector 日志:
kubectl logs -n observability <pod-name> --tail=50 - 访问自监控指标:
kubectl port-forward -n observability <pod-name> 8888:8888然后访问http://localhost:8888/metrics - 发送测试数据:使用
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%。