向集群外的客户端公开Jaeger收集器



我正在使用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

这些是我所做的改变:

  1. 更改了metadata/annotations(我确信这是实际需要的更改(
  2. 我还更新了规范版本,使用networking.k8s.io/v1而不是networking.k8s.io/v1beta1,因此有一些结构变化,但实际内容都没有改变AFAIK

希望这能帮助其他陷入同样困惑的人。

相关内容

  • 没有找到相关文章

最新更新