允许使用Istio CNI插件从初始化容器向Kubernetes API发出请求 与应用程序初始化容器的兼容性

问题描述

我配置了istio,但未启用CNI插件

那时候,我有一个带有服务帐户的init容器,该容器将调用Kubernetes API来验证几件事(通过kubectl)。

自从我启用CNI插件以来,此初始化容器失败,并显示以下消息:

与服务器10.23.64.1:443的连接被拒绝-您是否指定了正确的主机或端口?

我尝试删除所有网络策略以查看是否是问题所在,但结果相同。 我还提供了该Pod使用cluster-admin角色的服务帐户,但没有成功。

我使用Istio的1.6和1.7分支进行了测试。

这里是什么问题?没有此init容器的其他容器也可以正常工作。

解决方法

要在启用istio cni的情况下启用初始化容器网络连接,请遵循istio documentation上的指南以获取变通方法:

与应用程序初始化容器的兼容性

Istio CNI插件可能会导致任何应用程序initContainers的网络连接问题。使用Istio CNI时,kubelet通过以下步骤启动注入的pod:

  1. Istio CNI插件将流量重定向到Pod中的Istio Sidecar代理。
  2. 所有初始化容器都将成功执行并完成。
  3. Istio Sidecar代理与容器的其他容器一起在容器中启动。

初始化容器在Sidecar代理启动之前执行,这可能导致执行期间流量丢失。使用以下一项或两项设置来避免这种流量丢失:

  • 设置traffic.sidecar.istio.io/excludeOutboundIPRanges批注以禁用将流量重定向到初始化容器与之通信的任何CIDR。
  • 设置traffic.sidecar.istio.io/excludeOutboundPorts批注以禁用将流量重定向到初始化容器使用的特定出站端口。