【发布时间】: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