我想在kubernetes集群中运行的不同服务之间实现TLS相互认证,我发现Istio是实现此目标的好方法,而无需更改任何代码。
我正在尝试使用Istio sidecar注入在群集中运行的服务之间进行TLS相互身份验证。
我想做什么:
我不想做什么:
几周以来一直没有运气,我一直在努力使其运行。社区的任何帮助将不胜感激。
答案 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使用sidecar模式,这意味着每个应用程序容器在同一pod中在其旁边运行着sidecar Envoy代理容器。
当服务接收或发送网络流量时,流量始终 首先通过Envoy代理。
在两个服务之间启用mTLS时,客户端和服务器端的Envoy代理在发送请求之前会先验证彼此的身份。
如果验证成功,则客户端代理将对流量进行加密,并将其发送到服务器端代理。
服务器端代理解密流量并将其本地转发到实际的目标服务。
但是问题是,来自网格外部的流量在入口资源处被终止。名称空间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问题。