【Kubernetes】跨節點 Pod 網絡不通排查案例

最近在部署一個集群環境的時候,發現集群中一個子節點與其他子節點不通,而 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;構建一套高效、低成本、易運維的網絡架構至關重要。本文將分享…