Kubernetes 向集群外的客户端公开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在集群外部的代

我正在使用Jaeger操作符将Jaeger查询和收集器服务部署到Kubernetes(实际上是K3S)以及存储后端的ElasticSearch实例

Jaeger操作符为Jaeger查询服务创建入口实例,但它假定所有Jaeger代理也将在Kubernetes集群内运行。不幸的是,我的情况并非如此,因为我正在跟踪的一些应用程序不是在集群内运行的,所以我需要从外部访问我的Jaeger收集器

它还建议您在运营商之外创建自己的入口,以暴露Jaeger收集器,但没有详细说明

我还想利用gRPC在集群外部的代理和集群中的收集器之间进行通信,并且(尽管它不是特定于Jaeger的)。我使用了,对我的场景进行了一些调整,并将其部署到我的集群:

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
以下是我所做的更改:

  • 更改了
    元数据/注释
    (我确信这是实际需要的更改)
  • 我还更新了spec版本,使用
    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