如何用OpenTelemetry采集应用与K8s集群指标并转发至网关Collector?
OpenTelemetry采集K8s集群与应用指标并转发至网关Collector的实操建议
一、接收器选型指南
应用级指标
- otlpreceiver:如果你的应用已集成OpenTelemetry SDK,直接用这个接收器接收应用推送的OTLP标准格式数据,这是最通用的方案,支持指标、日志、链路追踪全类型数据。
- prometheusreceiver:对于未集成OTel SDK的存量应用,只要它暴露了Prometheus格式的指标端点,用这个接收器定时拉取即可。
K8s集群与主机指标
- k8sclusterreceiver:专门采集K8s集群核心元数据与指标,比如节点状态、Pod调度情况、Deployment副本状态等,直接对接K8s API获取数据,无需额外依赖。
- hostmetricsreceiver:以DaemonSet方式部署在每个节点上,采集节点的CPU、内存、磁盘、网络等主机层面基础指标。
- containerdstatsreceiver/cadvisorreceiver:如果需要容器级细粒度指标(比如容器CPU使用率、内存限额使用率),根据容器运行时选择:用containerd选前者,用Docker选cadvisor。
二、集群内数据转发到网关的实现方式
推荐架构
采用Agent + Gateway分层架构:
- 每个K8s节点部署OTel Collector Agent(DaemonSet):负责采集节点、容器指标和日志;
- 应用侧可选Sidecar模式的Collector:单独采集该应用的指标/日志;
- 集群内部署OTel Collector Gateway(Deployment,多副本高可用):接收所有Agent和Sidecar的数据,统一处理后再转发至后端存储。
转发配置示例
在Agent/Sidecar的配置文件中,配置OTLP exporter指向网关地址:
exporters: otlp: endpoint: "otel-gateway.default.svc.cluster.local:4317" # 网关的K8s服务地址,gRPC默认端口4317,HTTP用4318 tls: insecure: true # 测试环境可开启,生产环境务必配置TLS加密
然后在service段将接收器与exporter关联:
service: pipelines: metrics: receivers: [otlp, prometheus, k8scluster, hostmetrics] exporters: [otlp] logs: receivers: [filelog] # 采集容器日志可指定路径为/var/log/containers/*.log exporters: [otlp]
日志采集补充
采集容器日志时,filelog接收器是最直接的方式,只需在Agent配置中指定日志文件路径;若不想直接操作宿主机文件,也可使用containerlogs接收器通过容器运行时API拉取日志。
三、关键注意事项
- 网关Collector必须开启
otlpreceiver,监听对应端口,并确保Agent/Sidecar能访问到网关的服务地址; - 大规模集群下,建议在Agent层面添加
batch处理器批量发送数据、filter处理器过滤无用指标、memory_limiter限制内存使用,避免网关压力过大; - 生产环境一定要配置TLS加密和身份认证,防止数据传输过程中被篡改或泄露。
内容的提问来源于stack exchange,提问作者skp15
相关产品推荐
相关产品推荐

