【发布时间】:2020-11-20 23:25:20
【问题描述】:
我正在使用 Jaeger Operator 将 Jaeger Query 和 Collector 服务部署到 Kubernetes(实际上是 K3S)以及用于存储后端的 ElasticSearch 实例。
Jaeger Operator 为 Jaeger Query 服务创建一个 Ingress 实例,但它假定您的所有 Jaeger 代理也将在 Kubernetes 集群内运行。不幸的是,我的情况并非如此,因为我正在跟踪的一些应用程序不在集群中运行,所以我需要能够从外部访问我的 Jaeger 收集器。
This Jaeger GitHub issue discusses a potential enhancement to the Jaeger Operator for this functionality,它建议在 Operator 之外创建自己的 Ingress 以公开 Jaeger Collector,但不详述。
我还想利用 gRPC 在集群外的 Agent 和集群内的 Collector 和 this article describes how to set up an Ingress for gRPC 之间进行通信(尽管它不是 Jaeger 特有的)。我使用了example ingress spec there,对我的场景进行了一些调整,并将其部署到我的集群中:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
name: simple-prod-collector
namespace: monitoring
spec:
rules:
- host: jaeger-collector.my-container-dev
http:
paths:
- backend:
serviceName: simple-prod-collector
servicePort: 14250
这会在 Jaeger Operator 创建的 simple-prod-query 入口旁边为我创建一个入口:
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
monitoring simple-prod-query <none> jaeger-query.my-container-dev 10.128.107.220 80 6h56m
monitoring simple-prod-collector <none> jaeger-collector.my-container-dev 80 4h33m
以下是入口背后的服务:
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
monitoring simple-prod-collector ClusterIP 10.43.20.131 <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP 7h5m
monitoring simple-prod-query ClusterIP 10.43.141.211 <none> 16686/TCP 7h5m
monitoring simple-prod-collector-headless ClusterIP None <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP 7h5m
不幸的是,我的 Jaeger 代理似乎仍然无法与它说话......我实际上是通过 docker-compose 部署我的 Jaeger 代理,正如您在此处看到的那样,我正在将其配置为连接到 jaeger-collector.my -container-dev:80:
version: "3"
services:
jaeger-agent:
image: jaegertracing/jaeger-agent
hostname: jaeger-agent
command: ["--reporter.grpc.host-port=jaeger-collector.my-container-dev:80"]
ports:
- "6831:6831/udp" # UDP | accept jaeger.thrift in compact Thrift protocol used by most current Jaeger clients
- "5778:5778" # HTTP | serve configs, sampling strategies
- "14271:14271" # HTTP | admin port: health check at / and metrics at /metrics
restart: on-failure
我可以看到连接有问题,因为当我使用 HTTP GET to http://localhost:5778/sampling?service=myservice 访问 Jaeger 代理的采样策略服务时,我收到一条错误消息,内容如下:
collector error: rpc error: code = Unimplemented desc = Not Found: HTTP status code 404; transport: received the unexpected content-type "text/plain; charset=utf-8"
我的 Ingress 规范有问题吗?似乎没有跟踪数据从我的代理传输到收集器,并且在访问 Jaeger 代理采样服务时出现错误。另外,我觉得kubectl get ing 输出中没有列出 IP 地址有点奇怪,但这可能是一个红鲱鱼。
如上所述,我正在使用 K3S,它似乎使用 traefik 作为其入口控制器(而不是 nginx)。我检查了 traefik 控制器的日志,也没有发现任何有用的信息。
【问题讨论】:
标签: kubernetes traefik jaeger traefik-ingress