将不带 Istio 的命名空间之间的流量路由到带 Istio 的命名空间

Routing traffic between namespace without Istio to namespace with Istio

在我的集群中,我有多个命名空间。我所有的第一方服务都 运行 在一个命名空间中,所有第 3 方服务都在它们自己的命名空间中 运行。

我在我的第一方命名空间上启用了 Istio(我们称之为 ns-1)。我的任何第 3 方命名空间均未启用 Istio。

我有一个第 3 方服务需要连接到我的第 1 方服务。 3rd 方服务将使用像 service1.ns-1.svc.cluster.local 这样的 k8s DNS 来连接到我的服务。第 3 方服务可以在没有 TLS 的情况下与我的第 1 方服务通信。当我在服务之间启用 TLS 失败时,我不知道 how/where 终止 TLS?

是否可以定义一个可以在命名空间之间路由流量的 Gateway?或者可以通过 Istio IngressGateway

在命名空间之间路由流量

在通过 echo-server 考试使用 Istio 和 Minikube 之后,这就是我的发现。首先让我定义名称空间和服务,以便于解释

  • ns-1 - 启用 Istio 的命名空间 1
  • ns-2 - 命名空间 2 没有 Istio
  • service-1 - ns-1 命名空间中的服务 1
  • service-2- ns-2 命名空间中的服务 2

以下是这两个服务之间的连接状态

  • service-1 可以在没有 TLS
  • 的情况下与 service-2.ns-2.svc.cluster.local 通信
  • service-2 可以在没有 TLS
  • 的情况下与 service-1.ns-1.svc.cluster.local 通信
  • service-1 可以使用 TLS
  • service-2.ns-2.svc.cluster.local 通信
  • service-2 无法 使用 TLS
  • service-1.ns-1.svc.cluster.local 通信

您可能已经知道在上面的第 4 种情况下(service-2 使用 TLS)TLS 没有被任何导致失败的 Istio 对象终止。

如果 TLS 可以被 sidecar 终止,这就可以工作。 added tls to sidecar api 是我要找的东西,但它不在当前的 Istio 版本中(1.12.2 作为这个答案)

我最后做了什么?

我部署了另一个 istio-ingressGateway,服务类型为 ClusterIP,将其设置为为我的端口路由流量。这将是我所有第 3 方服务到达我的第 1 方服务的网关,它将终止传入流量的 TLS,并对 istio 命名空间 (ns-1) 中的服务执行 mTLS。由于这是一个 ClusterIP,因此它仅在集群内部可见。然后,我配置了 Istio GatewayVirtualService 对象,以根据端口号将流量路由到我的服务。