Kind环境下Flannel IPsec模式跨节点通信故障,如何一步步排查解决?
摘要:环境信息 部署方式 Docker + Kind K8s 版本 v1.27.3 CNI Flannel IPsec 模式 节点网络 172.18.0.016(Docker bridge) 问题现象 同节点 Pod 通信正常
环境信息
部署方式
Docker + Kind
K8s 版本
v1.27.3
CNI
Flannel IPsec 模式
节点网络
172.18.0.0/16(Docker bridge)
问题现象
同节点 Pod 通信正常,跨节点 Pod 通信卡住超时:
# 同节点访问正常
docker exec flannel-ipsec-control-plane curl -s 10.244.0.4
PodName: Pod-1 | PodIP: eth0 10.244.0.4/24
# 跨节点访问卡住
docker exec flannel-ipsec-control-plane curl -s 10.244.1.7
# 无响应...
检查 IPsec 状态,SA 未建立:
docker exec flannel-ipsec-control-plane ip xfrm state
# 空
排查过程
查看 Flannel 日志
control-plane 节点:
kubectl logs -n kube-system kube-flannel-ds-cd8rf
06[CFG] loaded IKE shared key for: '172.18.0.3'
13[CFG] loaded IKE shared key for: '172.18.0.2'
07[NET] received packet: from 172.18.0.1[500] to 172.18.0.3[500] (720 bytes)
07[IKE] no IKE config found for 172.18.0.3...172.18.0.1, sending NO_PROPOSAL_CHOSEN
worker 节点:
kubectl logs -n kube-system kube-flannel-ds-gk7pl
11[NET] sending packet: from 172.18.0.2[500] to 172.18.0.3[500] (720 bytes)
04[NET] received packet: from 172.18.0.1[500] to 172.18.0.2[500] (720 bytes)
04[IKE] no IKE config found for 172.18.0.2...172.18.0.1, sending NO_PROPOSAL_CHOSEN
发现问题:
IKE 包经过 Docker bridge 时,源 IP 被 SNAT 成了网关地址。
预期源 IP
实际源 IP
172.18.0.2 (worker)
172.18.0.1 (网关)
172.18.0.3 (control-plane)
172.18.0.1 (网关)
检查 iptables NAT 规则
iptables -t nat -L POSTROUTING -n -v
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
706 42360 MASQUERADE 0 -- * !br-822761cba2a3 172.18.0.0/16 0.0.0.0/0
269 19012 MASQUERADE 0 -- * !br-64b0f4dac739 172.18.0.0/16 0.0.0.0/0
按规则字面意思,出口不是网桥 !br-xxx 才触发 MASQUERADE,同网桥转发不应该 NAT。
但问题是:K8s 部署时需要开启 bridge-nf-call-iptables = 1,导致网桥转发流量也会经过 iptables,触发了 MASQUERADE。
