Istio |不使用Istio入口网关的TLS双向身份验证

时间:2020-10-05 10:41:24

标签: kubernetes google-cloud-platform google-kubernetes-engine istio envoyproxy

我想在kubernetes集群中运行的不同服务之间实现TLS相互认证,我发现Istio是实现此目标的好方法,而无需更改任何代码。

我正在尝试使用Istio sidecar注入在群集中运行的服务之间进行TLS相互身份验证。

  • 外部流量通过nginx入口控制器进入网格。我们希望继续使用它而不是Istio入口控制器(我们希望进行尽可能少的更改)。
  • 禁用Istio Sidecar注入后,这些服务能够正确地相互通信。但是,一旦我在应用程序的名称空间中启用了sidecar,该应用程序便不再能够处理请求(我猜是传入的请求已由特使sidecar代理丢弃)。

My architecture looks like this

我想做什么:

  • 在名称空间2(nginx入口控制器,服务1和服务2)上启用istio sidecar代理注入,以便所有服务都通过TLS相互认证相互通信。

我不想做什么:

  • 在nginx入口控制器上启用istio sidecar代理注入(我不想对其进行任何更改,因为它可以作为其他多个工作负载的前端)。

几周以来一直没有运气,我一直在努力使其运行。社区的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我的目标是至少启用service-1和service-2之间的TLS相互认证

AFAIK如果您已在命名空间2中启用了注入,则此处的服务已启用了mTLS。从istio 1.5版本开始默认启用。有与此相关的docs

默认情况下现在启用自动双向TLS。边车之间的流量会自动配置为相互TLS。如果您担心加密开销,可以通过添加选项-在安装过程中设置values.global.mtls.auto = false来显式禁用此功能。有关更多详细信息,请参阅automatic mutual TLS

在这里查看有关服务之间的MTL如何工作的更多信息。

Istio中的相互TLS

Istio提供双向TLS作为服务到服务身份验证的解决方案。

Istio使用sidecar模式,这意味着每个应用程序容器在同一pod中在其旁边运行着sidecar Envoy代理容器。

  • 当服务接收或发送网络流量时,流量始终 首先通过Envoy代理。

  • 在两个服务之间启用mTLS时,客户端和服务器端的Envoy代理在发送请求之前会先验证彼此的身份。

  • 如果验证成功,则客户端代理将对流量进行加密,并将其发送到服务器端代理。

  • 服务器端代理解密流量并将其本地转发到实际的目标服务。

enter image description here

NGINX

但是问题是,来自网格外部的流量在入口资源处被终止。名称空间2中的Nginx反向代理看不到传入的呼叫。

我发现github上存在类似的问题,值得一试。

Answer由@stono提供。

嘿, 这不是一个istio问题,让Nginx与istio一起工作有点困难。问题是因为从根本上nginx是向已从您的主机名foo-bar解析的ip发出出站请求。这不会起作用,因为特使不知道群集ip属于哪个群集,所以它失败了。

我建议您使用ingress-nginx kubernetes项目,然后在您的Ingress配置中使用以下值:

注释: nginx.ingress.kubernetes.io/service-upstream:“ true” 这样做是为了确保nginx不会将上游地址解析为ip,并维护sidecar用于路由到目的地的正确Host头。

我建议使用该项目,因为我将其与Istio一起使用,并具有240个奇怪的服务部署。

如果您不使用ingress-nginx,我认为您可以将proxy_ssl_server_name设置为on;或者您可以尝试的另一种方法是将出站请求上的Host标头强行设置为服务的内部fqdn,因此:

proxy_set_header主机foo-bar; 希望这会有所帮助,但是正如我所说的,这是一个nginx配置,而不是一个istio问题。