【问题标题】:Expose Jaeger Collector to clients outside of cluster将 Jaeger Collector 暴露给集群外的客户端
【发布时间】: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


    【解决方案1】:

    好的,我发现了这里的问题,这对于具有更多专业知识的人来说可能是显而易见的。 The guide I linked to above that describes how to make an Ingress spec for gRPC 特定于 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"
    

    所以我找到了another Stack Overflow post discussing Traefik and 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
    

    这些是我所做的更改:

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

    希望这可以帮助遇到同样困惑的其他人。

    【讨论】:

      猜你喜欢
      • 2020-01-28
      • 1970-01-01
      • 2011-02-07
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2023-03-17
      相关资源
      最近更新 更多