[英]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.