
# 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。
![](https://support.huaweicloud.com/asm_faq/public_sys-resources/caution_3.0-zh-cn.png)
请谨慎使用注解方式排除流量拦截，因为 IP/端口排除注解不仅适用于 Init 容器流量，还适用于应用容器流量。 即发送到配置的 IP/端口的应用流量将绕过 Istio Sidecar。
更多详情参考：<https://istio.io/latest/docs/setup/additional-setup/cni/>
