Cilium跨节点Pod通信失败的核心原因是隧道/直连模式未正确配置:需检查cilium status确认Tunnel启用、CNI配置中tunnel值非disabled、排除CNI配置文件冲突、验证IPAM分配与路由表完整性、排查NetworkPolicy拦截。

这是 Cilium 部署后非常典型的“半通”现象:节点能 ping 通本机 Pod(curl http://pod-ip 或 ping 成功),但跨节点的 Pod 之间无法通信。问题不在基础连通性,而在 Cilium 的网络路径未正确打通。
核心原因:Cilium 未启用或未正确配置隧道/直连模式
Cilium 默认需要一种机制来转发跨节点流量——要么封装(如 VXLAN/Geneve),要么直连(Direct Routing)。若该机制未生效,数据包就卡在源节点出不去。
- 检查当前隧道状态:
cilium status | grep "Tunnel",输出应为Tunnel: vxlan或geneve;若显示disabled或为空,说明未启用隧道 - 确认 CNI 配置中是否显式禁用了隧道:
kubectl -n kube-system get cm cilium-config -o yaml | grep tunnel,值应为vxlan或geneve,而非disabled - 若使用 Direct Routing 模式,需确保所有节点在**同一二层网络**,且已配置正确的主网卡(如
--devices=eth0)和路由规则
常见干扰项:CNI 配置文件冲突或残留
Kubernetes 只加载 /etc/cni/net.d/ 下字典序最小的 CNI 配置文件。若旧插件(如 flannel、calico)的配置仍存在,Cilium 配置可能被跳过。
- 列出配置文件:
ls -1 /etc/cni/net.d/,确认只有 Cilium 的配置(如05-cilium.conf),其他如10-flannel.conflist必须删除 - 检查 kubelet 日志:
journalctl -u kubelet -n 100 --no-pager | grep "cni config",看是否提示“loaded plugin 'cilium'”或误加载了别的插件 - 重启 kubelet 后再验证:
sudo systemctl restart kubelet
IPAM 与 CIDR 分配异常
Cilium 为每个节点分配一个子网(如 10.217.1.0/24),若分配失败或重叠,Pod 就得不到合法 IP,或路由表缺失对应条目。
- 查看节点实际分配的 Pod CIDR:
cilium node list,比对各节点allocCIDR是否互不重叠、且在集群规划范围内 - 检查节点路由表:
ip route show | grep 10.217(假设你用的是该网段),应有类似10.217.2.0/24 via 10.0.2.2 dev eth0的跨节点路由 - 若路由缺失,可能是
CiliumNodeCR 未同步,可尝试手动删除后触发重建:kubectl delete ciliumnode
策略默认拦截(尤其启用了 NetworkPolicy)
Cilium 默认行为是“允许所有”,但一旦部署了任何 NetworkPolicy(包括 Istio 注入的 sidecar 策略),就可能意外阻断基础通信。
- 快速验证是否策略导致:
cilium policy get查看是否有非空策略;若有,临时清空:cilium policy delete --all - 检查策略执行模式:
cilium config view | grep PolicyEnforcement,正常应为default;若为always,会强制检查所有连接,增加开销并可能误判 - 注意:Istio + Cilium 组合下,sidecar 的 mTLS 或 egress 策略常静默拦截 ICMP/TCP 健康检查流量









