Otel Collector无法接收K8s中.NET应用日志问题排查求助
我有一个.NET应用,负责向Otel Collector推送日志。在本地通过Docker Compose部署时一切正常,但部署到Kubernetes环境后,仅能接收到链路追踪数据,无法获取日志。
在Collector日志中发现以下相关错误:
info zapgrpc/zapgrpc.go:178 [transport] [server-transport 0xc002c53520] Closing: connection error: desc = "transport: http2Server.HandleStreams failed to receive the preface from client: read tcp 172.16.1.45:4317->172.16.1.43:44348: read: connection reset by peer" {"grpc_log": true}
其中IP .45对应Collector,.43对应应用程序。连接方向显示Collector指向应用,这与应用应向Collector推送日志的预期不符,请问可能的原因是什么?
本地与Kubernetes部署的唯一差异是应用在K8s中使用HTTPS而非HTTP监听。
Collector配置如下:
receivers: otlp/app: protocols: grpc: http: exporters: logging: loglevel: debug prometheus: # metrics endpoint: "0.0.0.0:8889" send_timestamps: true resource_to_telemetry_conversion: enabled: true const_labels: exported: "collector" otlp/tempo: endpoint: tempo:4317 tls: insecure: true loki: endpoint: http://loki:3100/loki/api/v1/push service: telemetry: logs: level: "debug" pipelines: metrics: receivers: [ otlp/app ] exporters: [ prometheus ] traces: receivers: [ otlp/app ] exporters: [ otlp/tempo ] logs: receivers: [ otlp/app ] exporters: [ logging, loki ]
TLS配置不匹配
.NET应用在K8s中启用了HTTPS,但Collector的OTLP gRPC接收器默认未开启TLS。链路追踪可能使用了HTTP端口(4318)正常通信,而日志推送用了gRPC端口(4317)时因TLS握手失败导致连接被重置。要么给Collector的OTLP gRPC接收器配置TLS参数,要么让.NET应用推送日志时禁用TLS(集群内部允许的情况下)。连接方向是日志格式误解
日志里的172.16.1.45:4317->172.16.1.43:44348是Collector作为服务端,监听4317端口接收来自应用44348端口的连接请求,属于正常的服务端日志格式——显示的是服务端端口指向客户端发起连接的端口,并非Collector主动连接应用,这个方向描述无需纠结。.NET应用日志推送配置未同步更新
本地HTTP环境下,应用的OTLP配置可能指向Collector的HTTP端口;切换到K8s的HTTPS环境后,可能没同步修改日志推送的协议、端口或TLS参数。比如链路追踪适配了HTTPS端口,但日志推送仍用gRPC端口却未配置TLS相关选项,导致连接失败。检查.NET应用的OpenTelemetryLoggerOptions配置,确认推送地址、TLS启用状态、证书验证规则等参数。Kubernetes网络策略限制
虽然链路追踪能正常通信,但日志使用的gRPC端口(4317)可能被K8s网络策略拦截。检查应用所在命名空间的网络策略规则,确保应用Pod有权限访问Collector的4317端口。Collector日志管道验证
当前Collector的logs管道配置看起来没问题,但可以重启Collector并查看更详细的debug日志,确认是否有日志数据进入接收器但未被正确导出到Loki或logging exporter。
内容的提问来源于stack exchange,提问作者user1842278

