文档首页/ 应用服务网格 ASM/ 常见问题/ 流量治理/ Istio CNI与Init容器兼容性问题
更新时间:2024-09-24 GMT+08:00

Istio CNI与Init容器兼容性问题

问题背景

Istio CNI 插件可能会导致使用了 initContainer 的应用出现网络连通性问题。 使用 Istio CNI 时,kubelet 会通过以下步骤启动一个注入的 Pod:

  1. Istio CNI 插件在 Pod 内设置流量重定向到 Istio Sidecar。
  2. 等待所有的 Init 容器成功执行完毕。
  3. Istio Sidecar 跟随 Pod 的其它容器一起启动。

由于 initContainer 在 Sidecar 启动之前执行,initContainer 发出的请求会被重定向到尚未启动的 Sidecar 上,这会导致 initContainer 执行期间出现流量丢失。

解决方案

可以通过以下任意方式来防止流量丢失:

  • 使用 runAsUser 将 Init 容器的 uid 设置为 1337。 1337 是 Sidecar 代理使用的 uid。 这个 uid 发送的流量并非通过 Istio 的 iptables 规则进行捕获。 应用容器流量仍将像往常一样被捕获。
  • 对 initContainer 所访问的目标 CIDR,通过设置 traffic.sidecar.istio.io/excludeOutboundIPRanges 注解以使访问该网段的流量不会被重定向到 Sidecar。
  • 对 initContainer 所访问的目标端口,通过设置 traffic.sidecar.istio.io/excludeOutboundPorts 注解以使访问该端口的流量不会被重定向到 Sidecar。

请谨慎使用注解方式排除流量拦截,因为 IP/端口排除注解不仅适用于 Init 容器流量,还适用于应用容器流量。 即发送到配置的 IP/端口的应用流量将绕过 Istio Sidecar。

更多详情参考:https://istio.io/latest/docs/setup/additional-setup/cni/