簡體   English   中英

我們可以通過 Kiali 在代理后面使用 Istio 跟蹤外部 API 調用嗎?

[英]Can we trace external API calls with Istio behind proxy via Kiali?

我們有一個基於 Nodejs 的微服務在我們的本地 kubernetes v1.19 和 Istio v1.8.0 中運行。 我想要實現的是在 Kiali 中跟蹤或顯示外部 API 調用,我們為每個微服務提供 Jaeger 客戶端並能夠跟蹤內部流量。

但到目前為止,我無法跟蹤來自任何微服務的任何外部 API 調用命中。我唯一能在 Kiali 的圖表概覽中看到代理流量的情況。

我們有一個合作代理,每個容器都為 http_proxy、https_proxy 設置了 env 代理。任何可以通過合作代理訪問的外部服務,因此流量應該首先通過我們的合作代理 go。 我們有一個帶有 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,我想在其中使用重試功能以及對代理和 externalAPI 的調用

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

我不確定為什么 Istio 不會自動跟蹤您對外部 API 的調用。 也許它需要使用出口網關,我不確定。 另請注意,Istio 為 http(s) 流量創建跟蹤,而不是 TCP。

但是,您仍然可以通過編程方式執行此操作。 您可以使用任何Jaeger 客戶端庫通過附加您自己的 span 來擴充 Envoy 已經創建的跟蹤。

為此,您首先需要從傳入請求的 HTTP 標頭中提取跟蹤上下文(假設您的外部 API 調用與傳入請求連續),然后創建一個新跨度作為該先前跨度上下文的子級。 一個好主意是在標記新跨度時使用OpenTracing 語義約定 如果遵循這個約定,像 Kiali 這樣的工具將能夠利用一些信息。

我發現這篇博客文章解釋了如何使用 nodejs jaeger 客戶端: https://rhonabwy.com/2019/01/06/adding-tracing-with-jaeger-to-an-express-application/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM