Jaeger Collector Ingress配置异常:外部应用无法上报Trace
解决外部应用上报Jaeger Trace失败的问题
核心问题分析
Jaeger Collector的4317端口为gRPC协议,而默认Ingress通常仅支持HTTP/1.1,无法处理gRPC流量;另外,直接修改K8s YAML会被Helm升级覆盖,且可能遗漏协议适配等关键配置。
步骤1:用Helm Values规范配置Ingress(杜绝手动改YAML)
不要直接修改K8s资源,通过Helm values配置Collector的Ingress,确保配置持久化且符合Chart规则:
- 创建自定义配置文件(比如
jaeger-custom-values.yaml):
collector: ingress: enabled: true hosts: - collector.example.com ports: - port: 80 targetPort: 4318 # 若用OTLP HTTP选此端口;用gRPC则改为4317 annotations: # Nginx Ingress适配配置,根据所选端口调整 # 若用4317(gRPC): # nginx.ingress.kubernetes.io/backend-protocol: "GRPC" # nginx.ingress.kubernetes.io/ssl-redirect: "false" # 若用4318(OTLP HTTP): nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
- 执行Helm升级应用配置:
helm upgrade jaeger jaegertracing/jaeger -n observability -f jaeger-custom-values.yaml
步骤2:匹配.NET应用的OTLP导出器配置
根据所选端口,调整.NET应用的OpenTelemetry配置:
情况A:使用OTLP HTTP(新手推荐,Ingress配置更简单)
修改导出器指向HTTP协议的4318端口,注意必须带/v1/traces路径:
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddOtlpExporter(options => { options.Endpoint = new Uri("http://collector.example.com/v1/traces"); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.HttpProtobuf; }));
情况B:使用OTLP gRPC(需Ingress支持gRPC)
若坚持用4317端口,需同时满足:
- Ingress已添加
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"注解 - .NET应用配置gRPC导出器:
builder.Services.AddOpenTelemetry() .WithTracing(tracing => tracing .AddOtlpExporter(options => { options.Endpoint = new Uri("http://collector.example.com:80"); options.Protocol = OpenTelemetry.Exporter.OtlpExportProtocol.Grpc; }));
注:部分Ingress Controller要求gRPC使用HTTPS,若80端口不通,可尝试配置TLS改用443端口。
步骤3:排查Ingress流量转发问题
- 确认Ingress绑定状态:
kubectl get ingress -n observability
检查ADDRESS字段是否有值,确保Ingress已关联负载均衡器。
2. 查看Ingress Controller日志(以Nginx为例):
kubectl logs -n ingress-nginx deployment/ingress-nginx-controller
搜索collector.example.com相关日志,排查是否存在协议不匹配、端口转发错误等信息。
3. 模拟外部流量测试:
若用OTLP HTTP,用curl验证连通性:
curl -X POST http://collector.example.com/v1/traces \ -H "Content-Type: application/x-protobuf" \ -d "$(echo '{}' | base64)"
返回400属于正常(数据格式无效),若返回502/503则说明Ingress转发失败。
常见坑点
- 直接修改K8s YAML会被Helm覆盖,必须通过Helm values管理配置。
- 4317是gRPC端口,不能用HTTP客户端访问,需严格匹配导出器协议。
- 部分云厂商Ingress默认禁用HTTP/2,需添加
nginx.ingress.kubernetes.io/http2-push-preload: "true"注解开启。
内容的提问来源于stack exchange,提问作者Daniel Pace
相关产品推荐
相关产品推荐

