Cilium 安装后 pod 间通信不通但 node 到 pod 通的典型情况

12次阅读

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

Cilium 安装后 pod 间通信不通但 node 到 pod 通的典型情况

这是 Cilium 部署后非常典型的“半通”现象:节点能 ping 通本机 Pod(curl http://pod-ipping 成功),但跨节点的 Pod 之间无法通信。问题不在基础连通性,而在 Cilium 的网络路径未正确打通。

核心原因:Cilium 未启用或未正确配置隧道/直连模式

Cilium 默认需要一种机制来转发跨节点流量——要么封装(如 VXLAN/Geneve),要么直连(Direct Routing)。若该机制未生效,数据包就卡在源节点出不去。

  • 检查当前隧道状态:cilium status | grep "Tunnel",输出应为 Tunnel: vxlangeneve;若显示 disabled 或为空,说明未启用隧道
  • 确认 CNI 配置中是否显式禁用了隧道:kubectl -n kube-system get cm cilium-config -o yaml | grep tunnel,值应为 vxlangeneve,而非 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 的跨节点路由
  • 若路由缺失,可能是 CiliumNode CR 未同步,可尝试手动删除后触发重建: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 健康检查流量
text=ZqhQzanResources