K8S故障處理指南:網絡問題排查思路

1. 前言

對于私有化環境,客戶的網絡架構,使用的云平臺存在著各種差異,K8S網絡可能會出現各種問題,此文著重講解遇到此種問題的排查方法和思路,不會涉及相關網絡底層技術描述.

環境說明

由于我們的k8s網絡組件默認使用了flannel,這里描述的集群網絡,均為flannel。但如果你使用了其他CNI組件,依然可以參考此文章的排查思路.

2.?異常場景

如何判斷k8s集群網絡出現異常?

  • 當集群出現pods大量異常,日志顯示dns解析失敗,或者節點間網絡連接失敗等,即可判斷是集群網絡異常

我們可以通過如下幾種方式進行排查。當任何一種方式的結果非預期內,則確認k8s集群網絡出現異常

2. 排查步驟

  • 測試節點互ping

可以按照如下步驟操作

查詢node名稱,podcidr,address并打印

[root@localhost?~]#?kubectl?get?nodes?-o?jsonpath='{range?.items[*]}[name:{.metadata.name}?,?podCIDR:{.spec.podCIDR}?,?ipaddr:{.status.addresses[0].address}]{"\n"}?{end}'
[name:10.28.87.59?,?podCIDR:172.27.1.0/24?,?ipaddr:10.28.87.59]
[name:10.28.87.60?,?podCIDR:172.27.0.0/24?,?ipaddr:10.28.87.60]
[name:10.28.87.61?,?podCIDR:172.27.2.0/24?,?ipaddr:10.28.87.61]
[name:10.28.87.62?,?podCIDR:172.27.4.0/24?,?ipaddr:10.28.87.62]
[name:10.28.87.63?,?podCIDR:172.27.3.0/24?,?ipaddr:10.28.87.63]
[name:10.28.87.64?,?podCIDR:172.27.5.0/24?,?ipaddr:10.28.87.64]

此命令需要在所有節點下執行,可在部署機器上使用ansible調用使用上述命令獲取到的CIDR地址,進行ping操作,seq根據節點數量進行設置

從上面結果可以看到共6個K8S節點,子網分別是172.27.0-172.27.5子網段。

使用下邊shell腳本測試pod子網,通的話打印up

[root@localhost?~]#?for?ip?in?$(seq?0?5);do?ping?-c2?-W1?-q?172.27.$ip.1?2>1?&>/dev/null?&&?echo?"172.27.$ip.1?up"?||?echo?"172.27.$ip.1?down";done
172.27.0.1?up
172.27.1.1?up
172.27.2.1?up
172.27.3.1?up
172.27.4.1?up
172.27.5.1?up

非預期結果: 出現某個節點固定的ping異常,即認為對應節點間vxlan通信異常,檢查對應節點的網絡即可

  • tcp,udp查詢

需要在所有節點上執行,可在一臺機器上使用ansible調用

ping操作屬于三層操作,由于某些環境會禁ping,因此我們可以使用如下命令進行確認

使用http請求訪問coredns metrics接口,狀態碼為200時正常,狀態碼000代表網絡異常不通

[root@CentOS76?~]#?kubectl?get?pods?-n?kube-system?-o?wide?|?grep?coredns?|?awk?'{print?$6}'?|?xargs?-i??curl?--connect-timeout?2?-o?/dev/null?-s?-w?"%{http_code}\n"?http://{}:9153/metrics
200
200
200
200
200
200

使用dns查詢kubernetes.default地址。有返回則代表正常

[root@localhost?~]#?kubectl?get?pods?-n?kube-system?-o?wide?|?grep?coredns?|?awk?'{print?$6}'?|?xargs?-l?nslookup?-type=a?kubernetes.default.svc.cluster.local
Server:?????????172.27.2.23
Address:????????172.27.2.23#53Name:???kubernetes.default.svc.cluster.local
Address:?172.26.0.1
---------
Server:?????????172.27.1.131
Address:????????172.27.1.131#53Name:???kubernetes.default.svc.cluster.local
Address:?172.26.0.1
---------
Server:?????????172.27.3.57
Address:????????172.27.3.57#53Name:???kubernetes.default.svc.cluster.local
Address:?172.26.0.1
---------
Server:?????????172.27.0.29
Address:????????172.27.0.29#53Name:???kubernetes.default.svc.cluster.local
Address:?172.26.0.1
---------
Server:?????????172.27.5.53
Address:????????172.27.5.53#53Name:???kubernetes.default.svc.cluster.local
Address:?172.26.0.1
---------
Server:?????????172.27.4.65
Address:????????172.27.4.65#53Name:???kubernetes.default.svc.cluster.local
Address:?172.26.0.1
---------

非預期結果:dns查詢報connection timed out; no servers could be reached, curl報000,都代表網絡可能存在異常

3. 異常場景

當我們通過上述方式,確認集群節點存在異常時,可以使用如下思路進行逐一排查

  • ip_forward內核被重置為0

  • flannel通信異常

  • 啟用了firewalld防火墻

  • 啟用了安全軟件

  • ip_forward

名詞解釋:ip_forward代表了路由轉發特性,為0時不開啟,設置為1時代表啟用。由于vxlan的跨三層特性, 集群節點需要轉發目標主機非自己的數據包.
影響范圍: 如果此值設為0,會導致跨節點通信異常.

出現原因: 在部署時,會向/etc/sysctl.conf里邊添加net.ipv4.ip_forward=1,來保證永久生效。

問題定位: 出現在集群重啟后,發現pods異常,網絡不通. 通過tcmdump抓包發現flannel流量正常。

處理方式

查詢本機內核參數, 在所有節點上執行,可在部署機上使用ansible調用,為讀操作,可放心執行

[root@localhost?~]#?sysctl?-n?net.ipv4.ip_forward
0

打印sysctl加載鏈,會變更相關內核參數,生產環境禁用使用(如果出現ip_forward為0則可使用)

[root@localhost?~]#?sysctl?--system
*?Applying?/usr/lib/sysctl.d/00-system.conf?...
......
*?Applying?/usr/lib/sysctl.d/10-default-yama-scope.conf?...
.....
*?Applying?/usr/lib/sysctl.d/50-default.conf?...
.......
*?Applying?/etc/sysctl.d/99-sysctl.conf?...
.......
*?Applying?/etc/sysctl.conf?...
.......

找到具體是哪個文件修改了ip_forward為0,則修改此文件,并重載內核參數。無異常禁止使用

[root@localhost?~]#?sysctl?-p
  • flannel通信異常

名詞說明: vxlan是vlan的拓展協議,為overlay網絡,可以穿透三層網絡對二層進行擴展,即大二層網絡。flannel我們默認使用了vxlan做為封裝協議,端口為8472
影響范圍: 跨節點通信異常
問題定位: 對udp 8472端口抓發,發現只有出站流量,未有入站流量,即可認定為flannel vxlan通信異常
出現原因: 安全組封禁,vxlan端口沖突,網卡異常等。由于flannel異常的原因多種多樣,此次僅針對常見情況進行描述。建議具體問題具體分析。
問題處理:?使用nc等相關命令進行測試,如果抓包仍未發現入站流量,且其他udp端口正常,則可使用修改port的方式

添加Port字段,將通信端口修改為8475

[root@localhost?~]#?kubectl?edit?cm?-n?kube-system?kube-flannel-cfg
net-conf.json:?|{"Network":?"172.27.0.0/16","Backend":?{"Type":?"vxlan","Port":?8475}}

修改后需要重啟相關daemonset pods

[root@localhost ~]# kubectl get pods -n kube-system | grep flannel | xargs kubectl delete pods -n kube-system

修改port不生效,可使用host-gw 如果內網各節點二層互通,可使用host-gw模式,此模式兼容性好,網絡效率高.

[root@localhost?~]#?kubectl?edit?cm?-n?kube-system?kube-flannel-cfg
net-conf.json:?|{"Network":?"172.27.0.0/16","Backend":?{"Type":?"host-gw",}

如果無法定位問題,可以通過抓包的方式來判斷

例如:當時coredns網絡不通時,通過curl測試

curl?-I?10.187.1.24:9153/metrics

然后再開一個窗口抓包

tcpdump?-nn?-i?flannel.1?host?10.187.1.24?and?port?9153?-vv

防火墻排查

名詞解釋: 此處的防火墻指Linux的軟件防火墻,在Cenots上叫firewalld, 在UOS下叫UFW. 默認的軟件防火墻會導致相關數據庫被攔截
影響范圍: 特定服務訪問異常,集群節點互通異常
問題定位: 對iptables表鏈進行分析,發現有非預期的規則出現,則代表存在其他防火墻規則
出現原因: 客戶安裝安全軟件,或者是非預期的軟件行為導致
問題排查:

一般看到ufw, public, zone這種,都可能是默認的系統防火墻

[root@localhost?~]#?iptables-save?|?egrep??"^:"?|?egrep?-v?"KUBE|CNI|DOCKER"
:FORWARD_IN_ZONES?-?[0:0]
:FORWARD_IN_ZONES_SOURCE?-?[0:0]
:FORWARD_OUT_ZONES?-?[0:0]
:FORWARD_OUT_ZONES_SOURCE?-?[0:0]

發現后手動關閉,以centos7為例

[root@localhost?~]#?systemctl?stop?firewalld

iptables FORWARD轉發鏈添加了REJECT規則,該規則在ACCEPT之上

圖片

刪除規則后正常

iptables?-D?FORWARD?-j?REJECT?--reject-with?icmp-host-prohibited

常見安全軟件排查

qaxsafed??#?奇安信,
sangfor_watchdog?#?深信服安全軟件
YDservice??#qcloud安全軟件,影響pod和docker橋接網絡
Symantec?#賽門鐵克的安全軟件
start360su_safed??#360安全軟件
gov_defence_service
gov_defence_guard??????#??ps?aux?|?grep?defence?
wsssr_defence_daemon???#?奇安信服務器安全加固軟件
wsssr_defence_service
wsssr_defence_agent???#影響pod網絡
kesl?#卡巴斯基安全軟件,影響容器通信?

名詞解釋: 和在windows環境下是一樣的,xc背景下,linux的各類安全軟件也非常多,如奇安信,深信服等
影響范圍: 特定服務訪問異常
問題定位: 以上所有排查方式都嘗試過,則可往此方面排查
出現原因: 客戶安全軟件在內核網絡層hook了對應函數,相關規則過濾了特定的應用數據庫,導致異常

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/696386.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/696386.shtml
英文地址,請注明出處:http://en.pswp.cn/news/696386.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

5.網絡游戲逆向分析與漏洞攻防-游戲網絡架構逆向分析-測試需求與需求拆解

內容參考于:易道云信息技術研究院VIP課 上一個內容:模擬游戲登陸器啟動游戲并且完成注入 首先正常分析軟件程序有沒有漏洞,需要通過它的操作侵入,比如買東西,就通過買東西的按鈕它背后有源代碼就看源代碼&#xff0c…

TypeScript學習筆記-基礎

一、type 和 interface type和 interface的區別:TypeScript 中文網: 文檔 - 日常類型 type類型別名和interface接口非常相似,在很多情況下可以在它們之間自由選擇。interface 的幾乎所有功能都在 type 中可用,主要區別在于無法重新打開類型…

【PythonGIS】基于Python融合矢量數據(多面合一)

之前發過使用批量合并矢量數據的文章:【Python&GIS】基于Python批量合并矢量數據,正好前段時間有需求把矢量數據進行融合,然后就編了一段融合矢量數據的代碼。今天就和大家分享一下如何使用Python對矢量數據實現融合的操作。 1.定義 首先…

基于Embedding召回和DSSM雙塔模型

文章目錄 基于Embedding召回介紹基于Embedding召回算法分類I2I召回U2I召回 DSSM模型DSSM雙塔模型層次 基于Embedding召回介紹 基于embedding的召回是從內容文本信息和用戶查詢的角度出發,利用預訓練的詞向量模型或深度學習模型,將文本信息轉換成向量進行…

三、創建腳手架和腳手架分析

三、創建腳手架 一、環境準備 1、安裝node.js **下載地址:**https://nodejs.org/zh-cn/界面展示 2、檢查node.js版本 查看版本的兩種方式 node -vnode -version 出現版本號則說明安裝成功(最新的以官網為準) 3、為了提高我們的效率&…

深度學習從入門到不想放棄-7

上一章的內容 深度學習從入門到不想放棄-6 (qq.com) 今天講的也算基礎(這個系列后來我一尋思,全是基礎 ),但是可能要著重說下,今天講前向計算和反向傳播,在哪兒它都永遠是核心,不管面對什么模型 前向計算: 有的叫也叫正向傳播,正向計算的,有的直接把前向的方法梯度下…

祖龍娛樂 x Incredibuild

關于祖龍娛樂 祖龍娛樂有限公司(下文簡稱“祖龍娛樂”)是一家總部位于北京的移動游戲開發公司,成立于 2014 年,擁有成功的大型多人在線角色扮演游戲移動游戲組合,如《六龍爭霸》、《夢幻誅仙》和《萬王之王 3D》。公司…

微信小程序 ---- 慕尚花坊 項目初始化

目錄 項目介紹 01. 項目概述 02. 項目演示 03. 項目技術棧 04. 接口文檔 申請開發權限 項目初始化 01. 創建項目與項目初始化 02. 自定義構建 npm 集成Sass 03. 集成項目頁面文件 04. VsCode 開發小程序項目 項目介紹 01. 項目概述 [慕尚花坊] 是一款 同城鮮花訂購…

Context Capture無法量測連接點,Survey提示Read only只讀模式

Context Capture無法量測連接點,Surveys提示Read only只讀模式 出現這個問題一般是因為當前block已經完成三維重建,所以無法再編輯稀疏重建(空三)結果。只能把當前block復制一份,在復制的block上量測新的連接點。如下…

Netty中的Arena是什么以及LT和ET

Arena是什么 在Netty中,Arena是一種內存分配器(Memory Allocator)的概念。Arena的主要目的是提高內存分配和釋放的效率,減少碎片化,從而提高系統性能。 具體而言,Netyy中的Arena主要用于分配和管理ByteBuf對象的內存,ByteBuf是Ne…

分班問題 、幼兒園分班(C語言)

題目 幼兒園兩個班的小朋友排隊時混在了一起,每個小朋友都知道自己跟前面一個小朋友是不是同班,請你幫忙把同班的小朋友找出來 小朋友的編號為整數,與前面一個小朋友同班用Y表示,不同班用N表示 輸入 輸入為空格分開的小朋友編號…

PowerDesigner 安裝

PowerDesigner 安裝漢化破解使用過程 - 淪陷 - 博客園 (cnblogs.com)https://www.cnblogs.com/huangting/p/12654057.html

不要浪費

解法&#xff1a; 記錄一下tle的代碼 #include <iostream> #include <vector> #include <algorithm> using namespace std; #define endl \n bool check(vector<int>& a, int l,int k) {int sum 0;for (int i 0; i < a.size() && l…

vue3中使用 tui-image-editor進行圖片處理,并上傳

效果圖 下載包 pnpm i tui-image-editor pnpm i tui-color-picker調用組件 //html部分 <el-dialog v-model"imgshow" destroy-on-close width"40%" draggable align-center :show-close"true":close-on-click-modal"false">&l…

mescroll 在uni-app 運行的下拉刷新和上拉加載的組件

官網傳送門: https://www.mescroll.com/uni.html 最近使用到了mescroll 但是一直都是整個頁面的滾動, 最近需求有需要局部滾動, 收藏了一個博主的文章覺得寫的還挺好, 傳送門: https://blog.csdn.net/Minions_Fatman/article/details/134754926?spm1001.2014.3001.5506 使用…

基于springboot+vue的視頻網站系統(前后端分離)

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Stable Diffusion 模型分享:FenrisXL(芬里斯XL)

本文收錄于《AI繪畫從入門到精通》專欄,專欄總目錄:點這里。 文章目錄 模型介紹生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十

IO進程線程第6天

1.使用有名管道完成兩個進程的相互通信 send.c代碼如下&#xff1a; #include <myhead.h>int main(int argc, const char *argv[]) {pid_t pidfork();if(pid>0){//父進程//從管道1中讀取數據int fd-1;if((fdopen("./mkfifo1",O_RDONLY))-1){perror("…

【安卓基礎3】Activity(一)

&#x1f3c6;作者簡介&#xff1a;|康有為| &#xff0c;大四在讀&#xff0c;目前在小米安卓實習&#xff0c;畢業入職 &#x1f3c6;本文收錄于 安卓學習大全&#xff0c;歡迎關注 &#x1f3c6;安卓學習資料推薦&#xff1a; 視頻&#xff1a;b站搜動腦學院 視頻鏈接 &…

微信小程序開發教程:

準備工作 下載并安裝微信開發者工具注冊微信公眾平臺賬號并創建小程序項目 項目結構 app.js&#xff1a;小程序的入口文件&#xff0c;用于定義全局變量和函數app.json&#xff1a;小程序的全局配置文件&#xff0c;用于配置小程序的頁面、窗口樣式、網絡超時時間等app.wxss&am…