【问题标题】:Can we trace external API calls with Istio behind proxy via Kiali?我们可以通过 Kiali 在代理后面使用 Istio 跟踪外部 API 调用吗?
【发布时间】:2021-05-18 16:18:57
【问题描述】:

我们有一个基于 Nodejs 的微服务在我们的本地 kubernetes v1.19 和 Istio v1.8.0 中运行。我想要实现的是在 Kiali 中跟踪或显示外部 API 调用,我们为每个微服务提供 Jaeger 客户端并能够跟踪内部流量。

但到目前为止,我无法跟踪来自任何微服务的任何外部 API 调用命中。我只能在 Kiali 的图表概览中看到代理的流量。

我们有一个合作代理,每个容器都为 http_proxy、https_proxy 设置了 env 代理。任何通过合作代理访问的外部服务因此流量应该首先通过我们的合作代理。我们有一个带 TLS 的安全网关,我们没有 egressgateway,只有 istio-ingressgateway。

那么,是否可以像跟踪集群内部的内部流量一样跟踪外部流量?如果是的话,可能缺少什么?

   $ kubectl get pods -n dev
    NAME                                     READY   STATUS    RESTARTS   AGE
    api-dev-74896ff4f9-slxt5                 3/3     Running   0          7h1m
    auth-dev-98f77d487-qt5zd                 3/3     Running   0          3d5h
    backend-dev-bb7765464-b7bpr              2/2     Running   0          7d3h
    mp-dev-86d6b8b978-slqp7                  3/3     Running   0          5d9h
    ui-dev-d5667946b-sdvlc                   2/2     Running   0          5d4h

这是我创建的 ServiceEntries 和 VirtualServices,我想在其中使用重试功能以及对代理和外部 API 的调用

apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: company-proxy
  namespace: dev
spec:
  hosts:
  - foo-proxy.net
  ports:
  - number: PORT
    name: tcp
    protocol: TCP
  location: MESH_EXTERNAL
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: proxy
  namespace: dev
spec:
  hosts:
    - "foo-proxy.net"
  http:
    - name: "company-proxy"
      match:
        - uri:
            prefix: "/"
      route:
        - destination:
            host: "foo-proxy.com"
      timeout: 90s
      retries:
        retryOn: "5xx"
        attempts: 3
        perTryTimeout: 30s
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: foo-example.com
  namespace: dev
spec:
  hosts:
    - "foo-example.com"
  ports:
    - number: 80
      name: http
      protocol: HTTP
    - number: 443
      name: https
      protocol: HTTPS
  location: MESH_EXTERNAL
  resolution: DNS

---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: foo-example.com
  namespace: dev
spec:
  hosts:
    - "foo-example.com"
  http:
    - name: "developer-api"
      match:
        - uri:
            prefix: "/"
      route:
        - destination:
            host: "foo-example.com"
      timeout: 90s
      retries:
        retryOn: "5xx"
        attempts: 3
        perTryTimeout: 30s

【问题讨论】:

  • @suren 与 envoy / istio,有些部分是自动的(所有入站/出站 HTTP 请求),有些部分仍然取决于您(在您的应用程序中传播上下文以将生成的跨度“链接”在一起)
  • @suren,我们有一个 Jaeger 客户端端点作为我们代码中每个微服务的 env 变量,而不是 kiali,使用 Istio 我们可以跟踪微服务之间的所有流量,而无需在我们的应用程序代码中添加额外的东西。但这对于我认为可以的外部调用无效。我相信正如 Joel 所说,我们需要一个出口网关
  • @suren,在我们使用 Istio 设置服务网格后,他们通过特使代理通过 mTLS 在 k8s 中通过 http 进行通信。不确定您还需要什么
  • @suren 好吧,我没有添加任何用于跟踪或 Jaeger 原因的额外内容,因为我看到它已经为 Istio 提供了我想要的内部通信功能。据我所知,我们可以在不使用 Jaeger 的情况下管理外部 API 调用,对吗?并且能够在 Kiali 中追踪它们
  • @suren,感谢您的回答。如果它不起作用,我将首先尝试使用 egressgateway 和 serviceEntry 执行此操作,然后在不添加您提到的额外代码的情况下没有任何其他选择

标签: kubernetes istio jaeger kiali


【解决方案1】:

我不确定为什么 Istio 不会自动跟踪您对外部 API 的调用。也许它需要使用出口网关,我不确定。另请注意,Istio 为 http(s) 流量创建跟踪,而不是 TCP。

但是,您仍然可以通过编程方式执行此操作。您可以使用任何Jaeger client libraries 来增加“通过附加您自己的跨度来增加 Envoy 已经创建的跟踪。

为此,您需要首先从传入请求的 HTTP 标头中提取跟踪上下文(假设您的外部 API 调用与传入请求是连续的),然后创建一个新跨度作为前一个跨度的子级语境。一个好主意是在标记新跨度时使用OpenTracing semantic conventions。如果 Kiali 等工具遵循此约定,它将能够利用一些信息。

我发现这篇博客文章解释了如何使用 nodejs jaeger 客户端进行操作:https://rhonabwy.com/2019/01/06/adding-tracing-with-jaeger-to-an-express-application/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 2020-07-05
    • 2018-12-27
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多