我正在使用Jaeger Operator将Jaeger Query和Collector服务部署到Kubernetes(实际上是K3S(以及存储后端的ElasticSearch实例。
Jaeger Operator为Jaeger Query服务创建了一个Ingress实例,但它假设您的所有Jaeger Agent也将在Kubernetes集群中运行。不幸的是,我的情况并非如此,因为我正在跟踪的一些应用程序没有在集群中运行,所以我需要从外部访问我的Jaeger Collector。
这个Jaeger GitHub问题讨论了Jaeger Operator对此功能的潜在增强,并建议在Operator之外创建自己的Ingress来公开Jaeger Collector,但没有详细说明。
我还想利用gRPC在集群外的Agent和集群中的Collector之间进行通信,本文描述了如何为gRPC设置Ingress(尽管它不是Jaeger特有的(。我在那里使用了示例ingress规范,对我的场景进行了一些调整,并将其部署到我的集群:
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
这为我创建了一个Ingress,以及由Jaeger Operator创建的简单prod查询入口:
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
不幸的是,我的杰格特工似乎仍然无法与它说话。。。实际上,我正在通过docker compose部署我的Jaeger Agent,正如你在这里看到的,我正在将其配置为连接到Jaeger收集器
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 Agent的采样策略服务时,我会返回一个错误,显示如下:
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规格有什么问题吗?从我的Agent到Collector似乎没有任何跟踪数据,并且在访问Jaeger Agent Sampling Service时出错。此外,我发现kubectl get ing
输出中没有列出IP地址有点奇怪,但这可能是转移注意力。
如上所述,我使用的K3S似乎使用traefik作为其入口控制器(与nginx相反(。我检查了traefik控制器的日志,也没有发现任何有用的东西。
好吧,我在这里解决了这个问题,对于那些有更多专业知识的人来说,这可能是显而易见的。我链接到上面的指南描述了如何为gRPC制定Ingress规范,它是NGINX特有的。同时,我使用的是开箱即用的K3S,Traefik是入口控制器。因此,我在Ingress规范中使用的注释没有影响:
metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
因此,我发现了另一篇讨论Traefik和gRPC的Stack Overflow帖子,并对上面的原始Ingress规范进行了一些修改,以包括上面提到的注释:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-prod-collector
namespace: monitoring
annotations:
kubernetes.io/ingress.class: traefik
ingress.kubernetes.io/protocol: h2c
traefik.protocol: h2c
spec:
rules:
- host: jaeger-collector.my-container-dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: simple-prod-collector
port:
number: 14250
这些是我所做的改变:
- 更改了
metadata/annotations
(我确信这是实际需要的更改( - 我还更新了规范版本,使用
networking.k8s.io/v1
而不是networking.k8s.io/v1beta1
,因此有一些结构变化,但实际内容都没有改变AFAIK
希望这能帮助其他陷入同样困惑的人。