当前位置: 首页 > news >正文

Kind 环境下 Flannel IPsec 模式跨节点通信故障排查流程

境信息

部署方式Docker + Kind
K8s 版本v1.27.3
CNIFlannel 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。

cat /proc/sys/net/bridge/bridge-nf-call-iptables # 1

流量示意:

bridge-nf-call-iptables=1

MASQUERADE

容器A

网桥

iptables

容器B

bridge-nf-call-iptables=0

容器A

网桥

容器B

问题原因

Kind 环境下,K8s 节点本身是 Docker 容器,通过网桥互联。bridge-nf-call-iptables = 1导致同网桥转发的流量也经过 iptables,触发 Docker 的 MASQUERADE 规则,源 IP 被改成网关 IP(172.18.0.1),Flannel IPsec 的 IKE 协商因此失败。

:这是 Kind 环境特有的问题,kubeadm 部署的物理机/VM 环境不经过 Docker 网桥,不会遇到类似问题。

解决方案

在宿主机添加 iptables 规则,让同网段流量跳过 MASQUERADE:

iptables -t nat -I POSTROUTING -s 172.18.0.0/16 -d 172.18.0.0/16 -j ACCEPT

规则说明:

参数含义
-t nat操作 NAT 表
-I POSTROUTING插入到 POSTROUTING 链最前面(优先级最高)
-s 172.18.0.0/16匹配源 IP
-d 172.18.0.0/16匹配目的 IP
-j ACCEPT直接接受,跳过后续规则

添加后验证:

iptables -t nat -L POSTROUTING -n -v Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 19 2648 ACCEPT 0 -- * * 172.18.0.0/16 172.18.0.0/16 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

重启 Flannel 触发重新协商:

kubectl rollout restart daemonset -n kube-system kube-flannel-ds

验证 SA 已建立:

# docker exec flannel-ipsec-control-plane ip xfrm state src 172.18.0.3 dst 172.18.0.2 proto esp spi 0xc1115682 reqid 11 mode tunnel replay-window 0 flag af-unspec aead rfc4106(gcm(aes)) 0x217a8659909ac029fb600b7cab791ee5b31d3563 128 anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000 src 172.18.0.2 dst 172.18.0.3 proto esp spi 0xc3b69836 reqid 11 mode tunnel replay-window 32 flag af-unspec aead rfc4106(gcm(aes)) 0xfaa2ea9f4bfb893623ce9fc5aac9ae6646913ee7 128 anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000 src 172.18.0.3 dst 172.18.0.2 proto esp spi 0xc9b2e230 reqid 11 mode tunnel replay-window 0 flag af-unspec aead rfc4106(gcm(aes)) 0x93c09105fd818db55e1b2d730fd31ff989fd33c2 128 anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000 src 172.18.0.2 dst 172.18.0.3 proto esp spi 0xc709b48b reqid 11 mode tunnel replay-window 32 flag af-unspec aead rfc4106(gcm(aes)) 0x60697edd7c58b57220c15d3b9d41851a206d4e4e 128 anti-replay context: seq 0x0, oseq 0x0, bitmap 0x00000000

跨节点 Pod 通信测试:

docker exec flannel-ipsec-control-plane curl -s 10.244.1.7 # PodName: Pod-0 | PodIP: eth0 10.244.1.7/24
http://www.cnnetsun.cn/news/1590602.html

相关文章:

  • CPUDoc:革命性CPU智能调度引擎,释放处理器隐藏性能潜能
  • N15 I²C(串行通信总线)
  • 远程控制频繁断连的排查与优化方案
  • 模糊逻辑在年龄分类中的MATLAB实现与优化
  • Java记录模式深度解析:3种你绝对想不到的嵌套解构用法(JDK 21新特性权威解读)
  • 百考通:AI全流程智能化赋能实践报告,让实习总结高效又专业
  • PvZ Toolkit:开源植物大战僵尸修改工具的全方位游戏增强方案
  • Vue3大屏开发踩坑记:transform缩放导致地图偏移的3种解决方案
  • 银滩漫浪:北海海岸绵延千里的纯白画卷
  • 无需显卡!Windows 纯 CPU 部署 Qwen2.5-1.5B 完整指南
  • 3分钟掌握PCL2-CE:打造你的专属Minecraft启动器
  • GRSL前沿解读 | 融合SAR与光学影像的深度学习云去除:从架构设计到地表洞察
  • Excel文件xls转xlsx?5个实用方法一步到位
  • 每周一个开源项目 #3:OpenClaw龙虾机器人
  • 纠结,到底是考研还是考公......
  • pk3DS:自定义宝可梦游戏体验的开源工具
  • 别再死记硬背了!用Python代码和可视化图表,5分钟搞懂IEEE754浮点数精度与范围
  • 告别ReLU?用PyTorch和TensorFlow亲手实现Swish激活函数(附代码对比)
  • X-NUCLEO-IKA01A1:STM32模拟前端硬件即API设计解析
  • 如何在30分钟内用OpCore-Simplify快速完成OpenCore EFI自动化配置?
  • 工程级精准计算!UPS后备时间精算方法与配置规范
  • 基于XGBoost-SHAP的可解释机器学习建模及资源环境领域运用与顶刊论文拆解与复现实战
  • ATX电源选购避坑指南:从80Plus认证到模组化,这些参数你真的懂吗?
  • G-Helper黑科技:华硕笔记本性能优化的终极秘籍
  • 5分钟掌握Windows字体自定义:No!! MeiryoUI深度配置指南
  • 手把手教你搭建基于Matlab/Simulink的插电式混合动力汽车4驱PHEV模型
  • BUG情色经济:用户为系统异常兴奋付费
  • AI如何悄悄改变你的日常生活?5个你已离不开的AI应用场景
  • 误删Anaconda?3步极速抢救指南
  • 焊接机器人避坑指南:轨迹规划中3个90%人会犯的MATLAB错误