Troubleshooting Issue for Integrating Host to K8S

故障排查报告:10.32.56.117 (K8s 节点) 与 10.32.56.42 通信失败

报告时间 2025 年 10 月 21 日
故障主机 (A) 10.32.56.117 (msr01vp - Kubernetes 节点)
对端主机 (B) 10.32.56.42
初始症状 主机 B 无法 Ping 通主机 A (TCP/ICMP 流量失败)。
最终结论 L3 层的内核反向路径过滤 (RPF) 机制被触发。 net.ipv4.conf.all.rp_filter 参数设置过于严格,导致 Calico CNI 引入的复杂路由结构被内核错误地识别为 Martian Source (IP 欺骗),从而丢弃了来自 10.32.56.42 的入站 IP 流量。 IP冲突
建议修复 将 net.ipv4.conf.all.rp_filter 和 net.ipv4.conf.ens192.rp_filter 设置为 2 (宽松模式)。

一、排查时间线与过程分析

排查思路遵循了 网络层 (L2) -> 安全过滤 -> L3 路由 -> IP冲突 的顺序,逐步收窄范围。

阶段 I:L2 连通性确认 (ARP 协议排查)

时间线 使用工具 / 命令 观察到的现象 / 结果 阶段结论
T0: 链路层确认 sudo tcpdump -eni ens192 arp 观察到 ARP Request (who-has 10.32.56.117 tell 10.32.56.42) 成功到达 10.32.56.117 的 ens192 网卡。但 ARP Reply 未发出。 问题锁定在 10.32.56.117 本地系统。 交换机和链路没有隔离。
T1: 内核参数检查 sysctl net.ipv4.conf.all.arp_ignore / sysctl net.ipv4.conf.ens192.arp_ignore / sysctl net.ipv4.conf.all.arp_filter all.arp_ignore = 1 (严格);ens192.arp_ignore = 0 (宽松);arp_filter = 0 (宽松)。 arp_ignore=1 成为首要嫌疑人,可能与 CNI 冲突。
T2: L2/L3 防火墙检查 sudo ebtables -L / sudo iptables -t raw -L -v ebtables (L2 防火墙) 策略为 ACCEPT ,无规则。iptables raw (L3 早期过滤) 中无针对 ARP 的 DROP 规则。 排除所有标准软件防火墙拦截。
T3: CNI 组件确认 calicoctl node status 确认 10.32.56.117 是一台正在运行 Calico BGP CNI 的 Kubernetes 节点。 CNI 逻辑 被确认为影响网络栈的关键因素。
T4: CNI 策略检查 kubectl get hostendpoint -o yaml / kubectl get GlobalNetworkPolicy -o yaml 两者均为空 (items: [])。 排除 Calico 网络策略 拦截 ARP 响应的可能性。

阶段 II:L3 路由与内核日志分析 (根本原因定位)

时间线 使用工具 / 命令 观察到的现象 / 结果 最终结论
T5: 系统日志检查 (非侵入) sudo journalctl -k -r (内核日志) 发现大量重复日志:IPv4: martian source 10.32.56.117 from 10.32.56.42, on dev ens192。 故障根源锁定: 这是内核 反向路径过滤 (RPF) 机制被触发的证据。问题不在于 ARP 响应本身,而在于随后的 IP 流量 被 RPF 机制丢弃。
T6: 根本原因确定 (分析日志和内核原理) RPF 机制(由 rp_filter 控制)在 Calico 复杂路由环境中将来自 10.32.56.42 的合法流量错误地标记为 Martian Source,并静默丢弃。 解决方案确定: 必须修改 rp_filter 参数。
T7: K8S Service 策略检查 kubectl get svc -A LoadBalancer 10.24.207.82 10.32.56.42 定位到 LoadBalancer Service 设置VIP。

二、涉及的系统组件、日志与配置

1. 涉及的关键 Linux 工具

工具名称 目的
tcpdump 实时捕获网络流量,用于确认 ARP Request 到达 (L2 验证)。
sysctl 查看和修改内核网络参数 (arp_ignore, arp_filter, rp_filter)。
ebtables / iptables 检查 L2/L3 防火墙规则,排除安全过滤拦截。
journalctl 查看系统和内核日志,最终发现 Martian Source 错误。
kubectl / calicoctl 检查 Kubernetes CNI 状态 (calico-node 运行状态) 和网络策略 (HostEndpoint)。
shell 复制代码
# 额外的命令
ping -c 1 10.32.56.117
ss -nltp |grep 6443
arping 10.32.56.42

# 检查SELinux状态
sestatus

ip addr show dev ens192

tcpdump -eni ens192  arp
tcpdump -eni vlan56  "icmp or arp"
tcpdump -eni vlan56  src 10.32.56.xx  or dst 10.32.56.xx

# 在 10.32.56.117 上执行
sudo iptables -t raw -L -v

# 或者直接清除 ARP 缓存并 ping
sudo arp -d 10.32.56.117

sudo journalctl --since "2 minutes ago" --until "now" -o verbose > /tmp/system.log

calicoctl node status

2. 关键日志片段 (最终证据)

日志来源 日志内容 含义
Kernel Log (journalctl -k) IPv4: martian source 10.32.56.117 from 10.32.56.42, on dev ens192 决定性证据 。内核 RPF 机制被触发,将来自 10.32.56.42 的 IP 流量视为非法数据包并丢弃。
tcpdump Output (Initial) Request who-has 10.32.56.117 tell 10.32.56.42 证明 L2 请求成功到达主机 A。
calicoctl node status `Calico process is running. ... node-to-node mesh up

网卡配置

bash 复制代码
ip addr show dev ens192
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:xx:xx:xx:xx:88 brd ff:ff:ff:ff:ff:ff
    altname enp11s0
    inet 10.32.56.117/23 brd 10.32.57.255 scope global noprefixroute ens192
       valid_lft forever preferred_lft forever
    inet6 xx::xx:xx:xx:xx/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

操作系统日志

bash 复制代码
Tue 2025-10-21 17:04:49.220021 CST [s=27c31c427ac747bdb1e79fe70a7c48a3;i=8be592;b=4a9990ffd03743888cf36f0f7eabc964;m=2554b2ab5b41;t=641a77dfb29b5;x=2a9f9a597a6e15b2]
    _TRANSPORT=kernel
    PRIORITY=4
    SYSLOG_FACILITY=0
    SYSLOG_IDENTIFIER=kernel
    _BOOT_ID=4a9990ffd03743888cf36f0f7eabc964
    _MACHINE_ID=c668def169814c39979f8c3d86346086
    _HOSTNAME=msr01vp
    MESSAGE=IPv4: martian source 10.32.56.117 from 10.32.56.42, on dev ens192
    _SOURCE_MONOTONIC_TIMESTAMP=41045375854198

网络抓包

bash 复制代码
[root@msr01vp ~]# sudo tcpdump -eni ens192  arp
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
...
15:37:49.615002 04:32:01:cb:37:50 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 10.32.56.117 tell 10.32.56.42, length 46
...
15:37:50.640166 04:32:01:cb:37:50 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 10.32.56.117 tell 10.32.56.42, length 46
...
15:37:51.664159 04:32:01:cb:37:50 > Broadcast, ethertype ARP (0x0806), length 60: Request who-has 10.32.56.117 tell 10.32.56.42, length 46
bash 复制代码
msr01vp ~]# calicoctl node status
Calico process is running.

IPv4 BGP status
+--------------+-------------------+-------+------------+-------------+
| PEER ADDRESS |     PEER TYPE     | STATE |   SINCE    |    INFO     |
+--------------+-------------------+-------+------------+-------------+
| 10.32.56.xx | node-to-node mesh | up    | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up    | 2025-07-23 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-21 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-20 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-20 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-19 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-19 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-14 | Established |
| 10.32.56.xx | node-to-node mesh | up    | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up    | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up    | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up    | 2025-07-23 | Established |
| 10.32.56.xx | node-to-node mesh | up    | 2025-07-23 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-08 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-08 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 2025-08-08 | Established |
| 10.32.56.xx  | node-to-node mesh | up    | 09:16:42   | Established |
+--------------+-------------------+-------+------------+-------------+

IPv6 BGP status
No IPv6 peers found.

3. 关键冲突参数

参数名称 原始值 冲突类型
net.ipv4.conf.all.rp_filter 预期为 1 (严格模式) 直接冲突! 在 Calico 复杂路由环境中,严格模式导致 RPF 检查失败。
net.ipv4.conf.all.arp_ignore 1 间接冲突。 虽然不是直接原因,但严格的 arp_ignore 与严格的 rp_filter 共同作用,使 Calico 节点对外部通信变得极其脆弱。

三、最终结论与建议修复方案

结论

故障的根本原因是 L3 路由不对称 与 内核的严格反向路径过滤 (RPF) 机制的冲突,而不是简单的 L2 故障。Kubernetes 节点上的 Calico CNI 引入的 BGP 路由导致内核的 RPF 机制错误地认为来自同网段的流量是非法欺骗 (Martian Source)。

IP冲突

建议修复方案

将源主机修改成未使用的IP,源主机可以成接入到K8S并正常使用。

故障修复心得

这次排查历经 整整两天 的艰辛,是技术深度探寻、跨部门协作和个人坚持求真务态度的生动写照。

我们从最初 L2 ARP 故障的表象着手,通过网络抓包和细致的内核日志分析(journalctl 发现 Martian Source ),如同剥洋葱般层层深入,最终锁定了潜在的故障根源------内核 RPF 机制被错误触发。

整个过程不仅成功排除了所有常见的网络和安全策略因素,更重要的是,它极大地加深了我们对以下核心技术的理解:

  1. ARP 协议 (L2):理解了 ARP 请求成功到达但 ARP 响应未发出的本地化问题。
  2. 内核网络栈行为 (RPF) :理解了 Martian Source 错误及其与 rp_filter 参数的严格耦合关系。
  3. Calico CNI 机制:理解了复杂 CNI 环境(如 BGP 路由)如何与主机内核参数发生冲突。

这份坚持,是对技术严谨性的最好肯定。通过协调网络、操作系统和 Calico CNI 团队,我们不仅解决了当前问题,更成功地规避了未来因内核参数冲突而可能引发的系统级故障,促进了跨部门的信任与协作。这证明了求真务实的态度和跨领域知识的结合,才是最高效、最根本的解决之道。

相关推荐
Skrrapper4 天前
AI项目实战日记ep2:把 GitHub Issue 的第一轮脏活交给 AI:做一个 Issue 分诊助手
人工智能·github·issue
小雨爱测11 天前
DeepSeek Harness 开源贡献手记:从提 Issue 到合入主干的完整旅程
开源·issue
Eloudy13 天前
全文 - 第 01 章 CHI Issue.B specification
arm开发·issue
2601_968354541 个月前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
开源·issue
●VON1 个月前
AtomGit 新手教程:Issue 和 PR 是什么?从 Fork、Clone 到提交 Pull Request 全流程
计算机·issue·pr
微学AI2 个月前
把 GitHub Issue 的“第一轮脏活”交给 AI:Issue AI Agent 接入蓝耘元生代实战
人工智能·github·issue
技术传感器2 个月前
让 Hermes 自动完成一个软件需求:从 Issue 到 PR 的 AI 开发流水线
人工智能·架构·aigc·需求分析·issue
ERD Online2 个月前
我们怎么设计 good first issue:让第一个 PR 两小时内合入
数据库·git·后端·开源·issue
7177772 个月前
研发效能治理标准化路径:基于信通院认证平台的全链路度量实践
安全·gitee·issue
7177772 个月前
Coze 工作流 + Gitee API 落地指南:研发 Issue 智能化自动管理实践
gitee·jquery·issue