Istio CNI与Init容器兼容性问题
问题背景
Istio CNI 插件可能会导致使用了 initContainer 的应用出现网络连通性问题。 使用 Istio CNI 时,kubelet 会通过以下步骤启动一个注入的 Pod:
- Istio CNI 插件在 Pod 内设置流量重定向到 Istio Sidecar。
- 等待所有的 Init 容器成功执行完毕。
- 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/