AKS集群中Nginx Ingress暴露OpenTelemetry Collector的问题
问题分析与解决方案
你的问题核心在于gRPC协议特性与Nginx Ingress默认配置不匹配,导致请求无法正确转发到OpenTelemetry Collector。具体原因和解决方法如下:
核心原因
- gRPC依赖HTTP/2:OTel Collector的5555端口是gRPC接收器,gRPC基于HTTP/2协议传输,而Nginx Ingress默认未明确启用HTTP/2支持,会导致协议不兼容。
- 路径匹配不兼容:OTel Collector的gRPC服务使用标准Protobuf路径(如
/opentelemetry.proto.collector.trace.v1.TraceService/Export),你配置的/otel-collector前缀无法匹配这些原生路径,导致请求被拦截或转发错误。
解决方案
方案1:使用独立主机名转发(推荐)
直接绑定专属主机名到OTel Collector服务,避免路径前缀的兼容性问题,这是gRPC服务暴露的常规方式:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: obs-dev-ingress-otlp annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" # 未启用HTTPS时保留,生产环境建议设为"true" nginx.ingress.kubernetes.io/backend-protocol: "GRPC" # 明确告知Nginx后端是gRPC服务 nginx.ingress.kubernetes.io/http2-push-preload: "true" # 强制启用HTTP/2支持 spec: ingressClassName: default rules: - host: otel-collector.dev-obs-k8.he.net http: paths: - path: / backend: service: name: otel-collector-external port: number: 5555 pathType: Prefix
配置完成后,可通过grpc://otel-collector.dev-obs-k8.he.net(或HTTP协议的http://,生产环境推荐HTTPS)向Collector发送gRPC请求。
方案2:保留路径前缀(需客户端配合)
如果必须使用/otel-collector前缀,需配置Nginx路径重写规则,剥离前缀后转发到Collector的原生gRPC路径:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: obs-dev-ingress-otlp annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/backend-protocol: "GRPC" nginx.ingress.kubernetes.io/http2-push-preload: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 # 剥离/otel-collector前缀 spec: ingressClassName: default rules: - host: dev-obs-k8.he.net http: paths: - path: /otel-collector(/|$)(.*) backend: service: name: otel-collector-external port: number: 5555 pathType: ImplementationSpecific
此时客户端需要将请求发送到带前缀的路径,例如:http://dev-obs-k8.he.net/otel-collector/opentelemetry.proto.collector.trace.v1.TraceService/Export,Ingress会自动将路径重写为原生gRPC路径转发到后端。
验证步骤
使用grpcurl工具验证连通性:
# 方案1验证 grpcurl -plaintext otel-collector.dev-obs-k8.he.net:80 list # 方案2验证 grpcurl -plaintext dev-obs-k8.he.net:80 -path-prefix=/otel-collector list
若能返回OTel Collector的gRPC服务列表,说明配置生效。
内容的提问来源于stack exchange,提问作者Narinder Verma
相关产品推荐
相关产品推荐

