用 OpenTelemetry Collector 把 K8s 集群接入 OBSERVE:DaemonSet+Deployment 双层架构、Helm 配置、容器日志采集、应用无侵入埋点与常见排障。
把 K8s 集群接进 OBSERVE,推荐用 OpenTelemetry Collector 分两类部署:
这个分层的好处是:节点级数据就近采集,避免跨节点搬运;应用级数据集中接收入口,方便统一加采样、脱敏、过滤。
用 Helm 安装官方 chart,再覆盖关键配置:
mode: daemonset
config:
receivers:
filelog:
include: [/var/log/pods/*/*/*.log]
operators:
- type: json_parser
otlp:
protocols: { grpc: {}, http: {} }
prometheus:
config:
scrape_configs:
- job_name: kubelet
scheme: https
exporters:
otlp:
endpoint: "otel.example.com:4317"
service:
pipelines:
logs: [filelog, otlp]
metrics: [prometheus, otlp]
traces: [otlp, otlp]
关键点:filelog 的 include 指向 /var/log/pods,配合 json_parser 把容器日志拆字段;OTLP exporter 统一指向 OBSERVE 网关。
容器日志走 stdout,采集器从节点日志目录抓取,不需要应用改代码。对于写文件到持久卷的应用,DaemonSet 里给 hostPath 挂载业务日志目录,再配一条 filelog 规则即可。多行堆栈(Java/Go panic)用 multiline 配置按首行正则合并。
应用无侵入接入链路,给 Pod 加环境变量即可:
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://otel-collector:4317"
- name: OTEL_SERVICE_NAME
value: order-service
搭配 Java/Python/Go 的自动埋点 Agent,链路数据自动上报到集群内的 Collector,再由 Deployment 层统一转发。
部署完先查 Collector 自身指标(otelcol_receiver_accepted_spans 等)确认数据在流动;再看 OBSERVE 侧是否有 service.name 出现。常见坑:DaemonSet 的 hostPath 权限不足、OTLP endpoint 写成了集群外地址导致跨网超时、Pod 的 OTEL_SERVICE_NAME 没设导致服务名全是 unknown。