最近在部署一个集群环境的时候,发现集群中一个子节点与其他子节点不通,而 master 节点可与任何子节点互通,通过抓包排查后,发现是 Linux 路由决策导致的。因此,在此记录下来,希望对大家有所帮助。

1、环境及现象

1.1、环境

  • K8s v1.20(一个 Master 和两个 Worker)、calico v3.21.1
  • Master:openEuler 24.03 (LTS-SP1)、网卡 enp1s0、IP(172.16.13.95)
  • Node2:openEuler 24.03 (LTS-SP1)、网卡 enp1s0、IP(172.16.12.36)
  • Node3:openEuler 24.03 (LTS-SP1)、网卡 eno1、IP(172.16.12.117)

1.2、现象

  • Master 可以 ping 通 Node2 和 Node3 上的 Pod, Node2 和 Node3 不能互相 ping 通对方的 Pod

PS:这里有一个小坑,看到网卡可能就会猜测是 Node3 有问题,因为 Node3 的网卡名称和 Master/Node2 不一样,有经验的小伙伴可能会想到去给 daemonset/calico-node 添加环境变量 IP_AUTODETECTION_METHOD。当然,我就踩了这个坑,配置后还是没有解决。

kubectl set env daemonset/calico-node -n kube-system IP_AUTODETECTION_METHOD=interface=^((bond|ens|eth|enp|em|eno1).*)...env:- name: IP_AUTODETECTION_METHODvalue: interface=^((bond|ens|eth|enp|em|eno1).*)
...

2、排查

2.1、抓包

  • 配置了 calico-node  的环境变量后还是没有解决,然后就开始抓包看到底是哪一步不通的
  • Node2(172.16.12.36)上 PodA:10.245.102.188
  • Node3(172.16.12.117)上 PodB:10.245.13.23
# 举例:node1 上的 podA ping node2 上的 podB# ICMP 包流量方向(IPIP/VXLAN 模式):
podA → node1.calixxx → node1.tunl0(封装)→ node1.eth0 → node2.eth0 → node2.tunl0(解封装)→ node2.calixxx → podB
# BGP 模式
podA → node1.calixxx → node1.eth0 → node2.eth0 → node2.calixxx → podB# VXLAN 模式:目标 podB 的 IP 会被路由到 tunl0,封装为 VXLAN 数据包
# IPIP 模式:类似于 VXLAN,但使用 tunl0 封装为 IPIP 数据包
# BGP 模式(无封装):直接通过 eth0 发送到 node2(无需隧道)

2.1.1、Node 2 上 Ping Node3 的 PodB

# Node2 检查目标 IP 是否可达
ip route get 10.245.13.23# Node2 主机上 ping PodB
ping 10.245.13.23# Node2 上抓包
tcpdump -i any icmp and host 10.245.13.23# Node3 上抓包
tcpdump -i any icmp and host 10.245.13.23

  • 这里抓包可以看到,请求从 Node2 上 tunl0 出去,但 Node3 上并没有 tunl0 接收,直接到了 Node3 的 calixxx 虚拟网卡
  • 查看 Node2 和 Node3 系统日志,发现确实有丢包的情况(如何查看丢包可见下方 4.1)

2.1.2、Node3 上 Ping Node2 的 PodA

# Node3 检查目标 IP 是否可达
ip route get 10.245.102.188# Node3 主机上 ping PodA
ping 10.245.102.188# Node2 上抓包
tcpdump -i any icmp and host 10.245.102.188# Node3 上抓包
tcpdump -i any icmp and host 10.245.102.188

  • 这里我们就能看到,Node3 上发送的 ICMP 包 到 PodA, PodA 正常接收且返回了包,但 Node3 上没有接收到返回的包,查看 Node2 的系统日志后发现是被 Node2 丢包了

  • 这里就猜测是 Node2 的 tunl0 没法正确的转发流量,Calico 使用的 IPinIP 模式,是否没有正确的封装 "源 IP- 目的 IP请求头导致的
# tunl0 是IPIP隧道接口,若未启用或配置错误会导致丢包
# 检查接口状态
ip link show tunl0
# 检查隧道配置
ip tunnel show

2.2、关闭 IPinIP 模式

  • 在关闭 IPinIP 模式后,发现网络竟然通了,这也证实确实是 IPinIP 模式导致的
# Master:查看 IP in IP 是否开启
calicoctl get ipPool default-ipv4-ippool -o yaml

2.3、研究 IPinIP 模式为 Always 失败原因

  • 关闭 IPinIP 后通信正常,查询资料后发现 IPinIP 模式还有另外一个参数 ipipMod: CrossSubnet(用于跨子网节点),虽然我们的节点都是在同一网段(具体见下方),但没有其它报错,然后就尝试了这个参数,没想到也是通
# Master
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:e0:4c:9a:d6:f6 brd ff:ff:ff:ff:ff:ffinet 172.16.13.95/22 brd 172.16.15.255 scope global noprefixroute enp1s0valid_lft forever preferred_lft foreverinet6 fe80::2e0:4cff:fe9a:d6f6/64 scope link noprefixroute valid_lft forever preferred_lft forever# Node2
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether 00:e0:4c:9d:eb:5e brd ff:ff:ff:ff:ff:ffinet 172.16.12.36/22 brd 172.16.15.255 scope global noprefixroute enp1s0valid_lft forever preferred_lft foreverinet 172.16.12.101/24 scope global secondary enp1s0valid_lft forever preferred_lft foreverinet6 fe80::2e0:4cff:fe9d:eb5e/64 scope link noprefixroute valid_lft forever preferred_lft forever# Node3
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000link/ether a8:5e:45:6c:ee:00 brd ff:ff:ff:ff:ff:ffinet 172.16.12.117/22 brd 172.16.15.255 scope global dynamic noprefixroute eno1valid_lft 78541sec preferred_lft 78541secinet6 fe80::aa5e:45ff:fe6c:ee00/64 scope link noprefixroute valid_lft forever preferred_lft forever
# Master:修改 IP in IP 模式为 CrossSubnet
calicoctl patch ipPool default-ipv4-ippool --patch '{"spec":{"ipipMode": "CrossSubnet"}}'

  • 这里就有一个疑问了,主机网络是在一个子网下,为什么会使用 CrossSubnet 就正常呢,然后开始查主机网络环境,发现 Node2 网卡 enp1s0 上有两个 IP,一个为 172.16.12.36/22(加入集群使用的 ip),一个为 172.16.12.101/24(其他服务使用的 ip)

  • 猜测是 172.16.12.101/24 这个 ip 导致的,删除这个 ip 后集群通信也正常了,这个 ip 和 Node3 不在一个子网,修改为在一个子网后也是正常的

# Node2:修改 172.16.12.101/22 的子网掩码为 24
ip addr del 172.16.12.101/22 dev enp1s0
ip addr add 172.16.12.101/24 dev enp1s0

3、结论

  • 最后,经大佬指点后,发现是 Linux 路由决策导致的,这也就解释了上面抓包异常的现象,Node2 使用 172.16.12.101 这个 ip 与 Node3 通信,所以就会有 tunl0 转发 ICMP 包出现丢包的现象
  • 结论:Linux 内核会根据最长前缀匹配(Longest prefix Match)原则选择源 IP(即系统会选择与目标地址在更小子网范围内的源 IP)

4、其他

4.1、临时添加 iptables 日志规则

## 1. 临时添加日志规则
# 在 iptables 的 INPUT、FORWARD 和 OUTPUT 链(根据流量方向)中插入日志规则,记录 ICMP 包
#--icmp-type 8:表示 ping 请求(Echo Request)
#--log-prefix:自定义日志前缀,方便过滤
#--log-level 4:日志级别(4 对应 warning)# 记录 INPUT 链的 ICMP 包(目标为本机)
iptables -I INPUT -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP-INPUT-DROP: " --log-level 4# 记录 FORWARD 链的 ICMP 包(经过本机转发的包)
iptables -I FORWARD -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP-FORWARD-DROP: " --log-level 4# 记录 OUTPUT 链的 ICMP 包(从本机发出的包)
iptables -I OUTPUT -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP-OUTPUT-DROP: " --log-level 4## 2. 查看系统日志
# 日志会记录到 /var/log/syslog 或 /var/log/messages(取决于系统)
tail -f /var/log/messages | grep "ICMP-"## 3. 删除临时日志规则(排查完成后)
iptables -D INPUT -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP-INPUT-DROP: " --log-level 4
iptables -D FORWARD -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP-FORWARD-DROP: " --log-level 4
iptables -D OUTPUT -p icmp --icmp-type 8 -j LOG --log-prefix "ICMP-OUTPUT-DROP: " --log-level 4

4.2、Calico IP-in-IP 封装请求头详解

4.2.1、IP-in-IP 封装后的数据包结构

  • [外层 IP 头][内层 IP 头][传输层头(如 TCP/UDP)][应用数据]

4.2.2. 外层 IP 头 (新增的封装头)

  • 协议号: 4 (表示这是一个 IP-in-IP 封装包)
  • 源 IP: 发送节点的隧道端点 IP (通常是发送节点的 IP)
  • 目的 IP: 接收节点的隧道端点 IP (通常是接收节点的 IP)
  • TTL: 通常设置为 64 或 255
  • 其他字段: 标准的 IPv4 头部字段

4.2.3. 内层 IP 头 (原始数据包的 IP 头)

  • 源 IP: 原始数据包的源 Pod IP
  • 目的 IP: 原始数据包的目的 Pod IP
  • 协议号: 原始协议 (如 TCP=6, UDP=17)
  • 其他字段: 保持原始数据包的 IP 头不变

4.2.4、示例

# 假设:
# ● 发送节点 IP: 192.168.1.1
# ● 接收节点 IP: 192.168.1.2
# ● 源 Pod IP: 10.10.1.1
# ● 目的 Pod IP: 10.10.2.1外层 IP 头:源 IP: 192.168.1.1目的 IP: 192.168.1.2协议: 4 (IP-in-IP)内层 IP 头:源 IP: 10.10.1.1目的 IP: 10.10.2.1协议: 6 (TCP)TCP 头:源端口: xxxx目的端口: xxxx其他 TCP 字段...# 注意:
# 1. IP-in-IP 封装会带来约 20 字节的开销 (额外的 IP 头)
# 2. 在 Calico 中,IP-in-IP 可以配置为以下模式:
#    ● Never: 从不使用
#    ● CrossSubnet: 只在跨子网时使用
#    ● Always: 总是使用

4.3、安装使用 tcpdump 命令

# 安装 tcpdump
apt-get install tcpdump  # 在 Ubuntu/Debian 系统中
yum install tcpdump      # 在 CentOS/RHEL 系统中# 使用 tcpdump
# 替换 <interface> 为实际的网络接口名称(如 eth0, tunl0)
tcpdump -i <interface> icmp
# 监控 eth0 的 ICMP 包
tcpdump -i eth0 icmp
# 监控所有网络接口的 ICMP 包
tcpdump -i any icmp
# 过滤 host
tcpdump -i any icmp and host x.x.x.x
# 保存抓包信息为文件(后续可使用 Wireshark 打开具体分析)
tcpdump -i tunl0 icmp and host 10.245.13.43 -w /home/icmp_packets.pcap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914116.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914116.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914116.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法训练营Day11】二叉树part1

文章目录理论基础二叉树的递归遍历前序遍历中序遍历后序遍历总结二叉树的层序遍历基础层序遍历二叉树的右视图理论基础 二叉树在结构上的两个常用类型&#xff1a; 满二叉树完全二叉树 在功能应用上的比较常用的有&#xff1a; 二叉搜索树&#xff1a; 节点有权值、遵循”左…

Flutter 之 table_calendar 控件

1.库导入在pubspec.yaml文件中dev_dependencies:table_calendar: ^3.2.02. 代码编写TableCalendar(daysOfWeekHeight: 20,availableGestures: AvailableGestures.horizontalSwipe,firstDay: DateTime.now().subtract(const Duration(days: 365)),lastDay: DateTime.now(),cal…

【leetcode】1486. 数组异或操作

数组异或操作题目题解题目 1486. 数组异或操作 给你两个整数&#xff0c;n 和 start 。 数组 nums 定义为&#xff1a;nums[i] start 2*i&#xff08;下标从 0 开始&#xff09;且 n nums.length 。 请返回 nums 中所有元素按位异或&#xff08;XOR&#xff09;后得到的…

php7.4使用 new DateTime;报错 Class DateTime not found

php7.4使用 new DateTime;报错Uncaught Error: Class ‘app\home\c\DateTime’ not found 查了半天资料&#xff0c;最后找到了解决办法 DateTime 是 php 内置的类&#xff0c;不隶属于任何命名空间&#xff0c;如果你需要在命名空间中使用须有 \ 声明&#xff0c;解决办法就是…

Gartner《构建可扩展数据产品建设框架》心得

一、背景与价值 1.1 “数据产品”为什么忽然重要? 传统模式:业务提出需求 → IT 建数据集 → ETL 管道爆炸 → 维护成本指数级上升。 新范式:把“数据”包装成“产品”,以产品思维迭代演进,强调复用、自助、可扩展。 Gartner 观察到:大量组织把“报表”或“数据仓库”重…

CentOS/RHEL LVM 磁盘扩展完整教程

CentOS/RHEL LVM 磁盘扩展完整教程&#x1f4dd; 前言 在Linux系统管理中&#xff0c;磁盘空间不足是经常遇到的问题。特别是在生产环境中&#xff0c;当根分区空间告急时&#xff0c;我们需要通过添加新磁盘来扩展存储空间。本教程将详细介绍如何在CentOS/RHEL系统中使用LVM&a…

LVGL应用和部署(用lua做测试)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】嵌入式产品做好了&#xff0c;下面就是测试和量产了。以按键屏幕的开发模式为例&#xff0c;如果仅仅是简单的功能测试&#xff0c;那还比较好解决&…

phpstudy搭建pikachu

一.启动mysql和nginx服务二.修改靶场文件参数点击管理打开根目录&#xff0c;将下载好的靶场源文件解压到www目录下三.找到此文件用记事本打开四.修改配置文件五.打开浏览器,输入127.0.0.1/pikachu六.按照步骤初始化心得体会&#xff1a;如果mysql启动又立刻停止&#xff0c;大…

【Linux】GDB/CGDB 调试器学习笔记

GDB/CGDB 调试器学习笔记&#x1f680; 前言 GDB 是 GNU 项目下功能强大的命令行调试器&#xff0c;适用于 C/C 等多种语言。CGDB 则是在 GDB 之上构建的轻量级 curses 界面&#xff0c;适合喜欢终端操作且习惯 vi 风格的人。一、GDB 入门篇 1. 编译时带调试信息 gcc -g -O0 -W…

链接代理后无法访问网络

路由方向的问题 cmd 输入 route print 查看路由多了一个不是你网络的路由 我的嘎嘎好用直接那都通 route add -p 0.0.0.0 mask 0.0.0.0 0.0.0.0 参考这个 固定ip if是代理链路的 链路口又敏感词这个文章不合规两次评论区问我

day37 早停策略和模型权重的保存

DAY 37 我今天的笔记是用cpu训练的&#xff0c;请自行修改为gpu训练 仍然是循序渐进&#xff0c;先复习之前的代码 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_…

网络爬虫分类全解析

网络爬虫作为数据获取的重要工具,其分类方式多样,不同类型的爬虫在技术实现、应用场景和功能特性上存在显著差异。深入理解这些分类,有助于开发者根据实际需求选择合适的爬虫方案。本文将从技术特性、应用场景和架构设计三个维度,系统介绍网络爬虫的主要分类。 一、按技术…

ECR仓库CloudFormation模板完整指南

概述 本文档详细介绍了一个通用的Amazon ECR(Elastic Container Registry)仓库CloudFormation模板,该模板支持多业务组、参数化配置,并包含完整的安全策略、生命周期管理和监控功能。 模板特性 核心功能 ✅ 支持4个业务组:app、ai、mall、frontend✅ 灵活的服务名手动输…

C++(STL源码刨析/List)

一 List 核心字段和接口1. 节点字段template<class T> struct __list_node {typedef void* void_pointer;void_pointer prev;void_pointer next;T data; }由于 链表 不是连续的内存块&#xff0c;所以对每一个申请到的内存块要进行统一组织&#xff0c;也就是封装成一个类…

苹果App上架流程:不用Mac也可以上架的方法

iOS App 的上架流程一直被认为是门槛最高、流程最繁琐的移动端工作之一。对很多使用 Windows 或 Linux 进行开发的跨平台团队来说&#xff0c;Mac 的缺位更放大了每一步的难度。 在我们近期为一款本地生活类 App 进行 iOS 上架时&#xff0c;团队成员几乎没有配备本地 Mac&…

【爬虫】- 爬虫原理及其入门

爬虫01 - 爬虫原理及其入门 文章目录爬虫01 - 爬虫原理及其入门一&#xff1a;爬虫原理1&#xff1a;爬虫的优势‌2&#xff1a;爬虫的核心库3&#xff1a;经典举例4&#xff1a;合规问题一&#xff1a;爬虫原理 学习爬虫之前前置知识需要了解这些&#xff1a; 我的HTTP介绍, 了…

G5打卡——Pix2Pix算法

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 Pix2Pix 是一种基于条件生成对抗网络&#xff08;cGANs&#xff09;的图像到图像翻译算法&#xff0c;由 Phillip Isola 等人在 2016 年提出。该算法的核心思想…

动力系统模拟与推导-AI云计算数值分析和代码验证

当系统是连续的&#xff0c;并且其状态变量不仅随时间变化&#xff0c;而且随空间维度变化时&#xff0c;需要使用偏微分方程&#xff08;PDEs&#xff09;来推导运动方程。偏微分方程提供了描述这些空间分布属性如何相互作用和演化的数学框架。 选择使用常微分方程&#xff08…

P4597 序列 sequence题解

P4597 序列 sequence 给定一个数列&#xff0c;每次操作可以使任意一个数1或-1&#xff0c;求小的操作次数&#xff0c;使得数列变成不降数列. 1.对于前面比当前位的数字大的数&#xff0c;设最大数为 xxx &#xff0c;当前的数为 yyy ,则对于 xxx 到 yyy 中间的任意数&#xf…

雨污管网智慧监测系统网络建设方案:基于SD-WAN混合架构的最佳实践

随着城市化的快速推进&#xff0c;雨污管网的管理与运行面临着日益复杂的挑战&#xff0c;例如内涝、污水溢流、非法排污等问题频发。为了更高效地管理分布广泛的监测点&#xff0c;保障系统运行稳定性&#xff0c;构建一套高效、低成本、易运维的网络架构至关重要。本文将分享…