Kubernetes 向集群外的客户端公开Jaeger收集器
我正在使用Jaeger操作符将Jaeger查询和收集器服务部署到Kubernetes(实际上是K3S)以及存储后端的ElasticSearch实例 Jaeger操作符为Jaeger查询服务创建入口实例,但它假定所有Jaeger代理也将在Kubernetes集群内运行。不幸的是,我的情况并非如此,因为我正在跟踪的一些应用程序不是在集群内运行的,所以我需要从外部访问我的Jaeger收集器 它还建议您在运营商之外创建自己的入口,以暴露Jaeger收集器,但没有详细说明 我还想利用gRPC在集群外部的代理和集群中的收集器之间进行通信,并且(尽管它不是特定于Jaeger的)。我使用了,对我的场景进行了一些调整,并将其部署到我的集群:Kubernetes 向集群外的客户端公开Jaeger收集器,kubernetes,traefik,jaeger,traefik-ingress,Kubernetes,Traefik,Jaeger,Traefik Ingress,我正在使用Jaeger操作符将Jaeger查询和收集器服务部署到Kubernetes(实际上是K3S)以及存储后端的ElasticSearch实例 Jaeger操作符为Jaeger查询服务创建入口实例,但它假定所有Jaeger代理也将在Kubernetes集群内运行。不幸的是,我的情况并非如此,因为我正在跟踪的一些应用程序不是在集群内运行的,所以我需要从外部访问我的Jaeger收集器 它还建议您在运营商之外创建自己的入口,以暴露Jaeger收集器,但没有详细说明 我还想利用gRPC在集群外部的代
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操作员创建的简单产品查询入口一起:
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
我可以看出连接有问题,因为当我用httpget-to点击Jaeger代理的采样策略服务时http://localhost:5778/sampling?service=myservice
,我得到一个错误,上面说:
collector error: rpc error: code = Unimplemented desc = Not Found: HTTP status code 404; transport: received the unexpected content-type "text/plain; charset=utf-8"
我的入门规范有问题吗?似乎没有跟踪数据从我的代理发送到收集器,我在点击Jaeger代理采样服务时出错。另外,我觉得有点奇怪,kubectl get ing
输出中没有列出IP地址,但这可能是一种误导
如上所述,我正在使用K3S,它似乎将traefik用于其入口控制器(与nginx相反)。我查看了traefik控制器的日志,也没有发现任何有用的信息。好的,我在这里找到了问题所在,这对于那些拥有更多专业知识的人来说可能是显而易见的。特定于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"
因此,我在上面找到并修改了我的原始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
以下是我所做的更改:
元数据/注释
(我确信这是实际需要的更改)networking.k8s.io/v1
而不是networking.k8s.io/v1beta1
,因此有一些结构上的变化,但实际内容没有变化metadata:
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "GRPC"
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