Kubernetes集群istio-system命名空间同节点Pod无法通信问题咨询
同节点istio-system命名空间Pod通信故障排查与解决方案
环境信息
- 集群组件版本:Kubernetes 1.21.7、Istio 1.11.4、Flannel 0.14.0
- 节点信息:
kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-d0 Ready control-plane,master 204d v1.21.7 k8s-d1 Ready <none> 204d v1.21.7 k8s-d2 Ready <none> 204d v1.21.7
问题现象
istio-system命名空间下,调度到同一节点的两个Pod无法通过curl等工具正常通信,强制将两个Pod调度到不同节点时通信完全正常,已排除Istio自身代码缺陷。
根因分析
- Flannel与Istio iptables规则冲突:该版本Flannel默认生成的
FLANNEL_FORWARD规则优先级高于Istio sidecar注入生成的iptables规则,同一节点Pod流量在经过主机网络栈转发时,会被Flannel规则拦截后未正确流转到sidecar流量处理链,导致流量丢失。跨节点Pod流量直接走Flannel VXLAN隧道,不经过节点本地转发规则链,因此不受影响。 - 节点本地br-netfilter内核参数配置异常:若节点
net.bridge.bridge-nf-call-iptables参数未设置为1,同一节点Pod间的二层流量不会触发iptables规则匹配,Istio sidecar注入的流量劫持规则不生效,会直接丢弃流量。 - Istio sidecar入站流量绑定配置问题:该版本Istio默认将sidecar的入站监听器绑定到Pod网络命名空间地址,若Flannel本地路由规则将同节点Pod流量直接转发到主机网络栈对应端口,会因为监听器未绑定主机侧地址导致连接被拒绝。
排查步骤
- 验证iptables规则优先级:执行
iptables -t nat -nvL FORWARD查看规则顺序,确认FLANNEL_FORWARD规则是否在ISTIO_FORWARD规则之前,是则判定为规则顺序冲突。 - 检查内核参数配置:执行
sysctl net.bridge.bridge-nf-call-iptables查看返回值,若返回值不是1则判定为配置错误。 - 抓包验证流量走向:在故障节点分别对cni0网卡、目标Pod的虚拟网卡抓包,执行
tcpdump -i cni0 host <pod-a-ip> and host <pod-b-ip>查看流量是否正常转发,确认流量丢弃的具体环节。
解决方案
- 针对iptables规则冲突:修改Flannel启动参数,添加
--iptables-forward=false关闭Flannel生成的FORWARD链规则;也可手动调整规则顺序,将ISTIO_FORWARD规则移到FLANNEL_FORWARD规则之前,执行命令:iptables -t nat -D FORWARD -j FLANNEL_FORWARD iptables -t nat -A FORWARD -j FLANNEL_FORWARD - 针对内核参数配置错误:所有节点执行
sysctl -w net.bridge.bridge-nf-call-iptables=1,并将配置写入/etc/sysctl.conf文件永久生效。 - 针对sidecar绑定配置问题:升级Istio到1.12及以上版本,或者修改Istio Sidecar注入模板,添加入站监听器绑定到0.0.0.0的配置参数。
内容的提问来源于stack exchange,提问作者brgsousa
相关产品推荐
相关产品推荐

