Kubernetes Istio |不使用Istio入口网关的TLS相互身份验证

Kubernetes Istio |不使用Istio入口网关的TLS相互身份验证,kubernetes,google-cloud-platform,google-kubernetes-engine,istio,envoyproxy,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,Istio,Envoyproxy,我想在kubernetes集群中运行的不同服务之间实现TLS相互身份验证,我发现Istio是一个很好的解决方案,可以在不更改代码的情况下实现这一点 我试图使用Istio sidecar注入在集群内运行的服务之间进行TLS相互身份验证 外部流量通过nginx入口控制器进入网格。我们希望继续使用它,而不是Istio入口控制器(我们希望做尽可能少的更改) 当Istio侧车喷射被禁用时,服务能够彼此正确通信。但是,一旦我在应用程序的名称空间中启用sidecar,应用程序就不再能够为请求提供服务(我猜传

我想在kubernetes集群中运行的不同服务之间实现TLS相互身份验证,我发现Istio是一个很好的解决方案,可以在不更改代码的情况下实现这一点

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

  • 外部流量通过nginx入口控制器进入网格。我们希望继续使用它,而不是Istio入口控制器(我们希望做尽可能少的更改)
  • 当Istio侧车喷射被禁用时,服务能够彼此正确通信。但是,一旦我在应用程序的名称空间中启用sidecar,应用程序就不再能够为请求提供服务(我猜传入的请求会被特使sidecar代理丢弃)

我想做的是:

  • 在namespace-2(nginx入口控制器、服务1和服务2)上启用istio sidecar代理注入,以便所有服务通过TLS相互验证相互通信
我不想做的事:

  • 在nginx入口控制器上启用istio sidecar代理注入(我不想对其进行任何更改,因为它作为多个其他工作负载的前端)
几周以来,我一直在努力让它发挥作用,但运气不佳。我们将非常感谢社区的任何帮助


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


AFAIK如果您已经在namespace-2中启用了注入,那么这里的服务已经启用了MTL。从istio 1.5版本开始,默认情况下已启用。关于这一点,有很多相关的问题

自动相互TLS现在默认启用。侧车之间的交通自动配置为相互TLS。如果担心加密开销,可以通过在安装过程中添加选项--set values.global.mtls.auto=false显式禁用此选项。有关更多详细信息,请参阅

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

Istio中的相互TLS Istio提供相互TLS作为服务对服务身份验证的解决方案

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

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

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

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

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

NGINX 但问题是,来自网格外部的流量在入口资源处终止。命名空间2中的nginx反向代理未看到传入调用


我发现在这方面也有类似的问题,值得尝试一下

由@stono提供

哎,, 这不是istio问题,让nginx使用istio有点困难。问题在于,从根本上讲,nginx正在向已从主机名foo栏解析的ip发出出站请求。这不起作用,因为特使不知道集群ip属于什么,所以它失败了

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

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

我建议使用这个项目,因为我使用它,使用Istio,使用240多个服务部署

如果您没有使用ingress nginx,我认为您可以将proxy\u ssl\u server\u name设置为on;或者您可以尝试的另一件事是强制将出站请求上的主机头设置为服务的内部fqdn,以便:

代理设置头主机foo-bar; 希望这有帮助,但正如我所说,这是一个nginx配置,而不是一个istio问题


这两周你已经试过什么了?您是否尝试过使用
kubectl label namespace namespace-2 istio injection=enabled
只打开namespace-2?我在namespace-2上打开了侧车注入,但在namespace-1上没有打开。由于nginx入口控制器有多个其他入口资源,我不想受到影响。我的目标是至少在服务1和服务2之间启用TLS相互身份验证。如果您有istio以外的任何解决方案,可以在不更改服务代码的情况下实现,我也想探讨一下。ThanksAFAIK如果您已经在namespace-2中启用了注入,那么这里的服务已经启用了MTL。自istio 1.5.0起默认启用。查看有关服务间MTL工作原理的更多信息。我发现在这方面也存在类似的问题,您能试试吗?