kubelet 清理資源以緩解磁盤壓力

kubelet 資源清理緩解磁盤壓力指南

在 Kubernetes 集群中,當節點磁盤壓力過大時,可通過以下幾種方式利用 kubelet 清理資源,從而緩解磁盤壓力。

一、鏡像垃圾回收

自動回收

kubelet 內置了鏡像垃圾回收機制,其行為由配置參數控制。編輯 /var/lib/kubelet/config.yaml 文件,添加或修改如下參數:

imageGCHighThresholdPercent: 85
imageGCLowThresholdPercent: 80

imageGCHighThresholdPercent 表示當磁盤使用率達到 85% 時觸發鏡像回收;imageGCLowThresholdPercent 表示回收操作將持續進行,直到磁盤使用率降至 80%。修改后,重啟 kubelet 服務:

sudo systemctl restart kubelet

手動回收

根據不同的容器運行時,使用對應命令手動清理鏡像:

  • Docker
docker image prune -a -f
  • containerd
crictl rmi $(crictl images -q)

觸發條件與過程

  • 觸發條件:當節點的磁盤使用率超過設定的閾值時,kubelet 會觸發鏡像垃圾回收。正常情況下會定時執行,以保證節點資源充足;在節點資源不足時,Kubelet 在驅逐 Pod 前會先強制執行一次垃圾回收,如果清理后資源充足則不會驅逐 Pod。
  • 清理過程:kubelet 會識別不再被任何容器引用的鏡像(未使用鏡像),并按照最近使用時間排序,優先刪除最舊的鏡像。對于新拉取的鏡像,會存活一定時間(默認 2 分鐘)后才執行清理,以防止剛拉取的鏡像就被清理掉。

關鍵參數

  • --image-gc-high-threshold:磁盤使用率的上限閾值,默認為 85%。
  • --image-gc-low-threshold:磁盤使用率的下限閾值,默認為 80%。
  • --minimum-image-ttl-duration:鏡像最短生存時間,默認 2 分鐘。

回收頻率與流程

  • 回收頻率:Kubelet 默認每 5 分鐘執行一次鏡像垃圾回收。
  • 回收流程:Kubelet 會識別不再被任何 Pod 引用的鏡像,并按照最近使用時間(LRU)策略逐個清理,直到磁盤使用率降到設定的下限或沒有空閑鏡像可以清理。

二、容器垃圾回收

自動回收

kubelet 可以根據配置自動清理已停止的容器。編輯 /var/lib/kubelet/config.yaml 文件,添加或修改如下參數:

containerRuntimeOptions:containerGC:maxPerPodContainer: 1minAge: 2m

maxPerPodContainer 限制每個 Pod 最多保留的已停止容器數量為 1;minAge 表示只有停止時間超過 2 分鐘的容器才會被清理。修改后,重啟 kubelet 服務。

手動回收

  • Docker
docker container prune -f
  • containerd
crictl rm $(crictl ps -a -q)

觸發條件與過程

  • 觸發條件:kubelet 定期執行容器垃圾回收,以清理不再需要的容器,主要針對普通容器、sandbox 容器以及容器日志目錄。對于普通容器,Kubelet 會根據 MaxPerPodContainerMaxContainers 的設置,按照 LRU 策略,從 Pod 的死亡容器列表刪除一定數量的容器,直到滿足配置需求;對于 sandbox 容器,Kubelet 按照每個 Pod 保留一個的原則清理多余的死亡 sandbox;對于日志目錄,只要沒有 Pod 與之關聯了就將其刪除。
  • 清理過程:kubelet 會刪除已經終止的容器,特別是那些已經超出保留時間的容器。

關鍵參數

  • --maximum-dead-containers-per-container:每個 Pod 可以保留的死亡容器的最大數量,默認為 1。
  • --maximum-dead-containers:節點上可以保留的死亡容器的最大數量,默認為 -1,表示沒有限制。
  • --minimum-container-ttl-duration:容器可被回收的最小生存時間,默認為 0 分鐘,即死亡容器可以立即被回收。

回收頻率與流程

  • 回收頻率:Kubelet 默認每分鐘執行一次容器垃圾回收。
  • 回收流程:Kubelet 會清理可以驅逐的容器,包括那些狀態不是 RUNNING 且在本輪 GC 前創建的容器。Kubelet 在到達 GC 時間點時,會遍歷所有 Pod,使其滿足 --maximum-dead-containers-per-container 的設置,如果不滿足 --maximum-dead-containers,則計算值 X = (--maximum-dead-containers)/(Pod 總數),再遍歷所有 Pod,使其滿足已停止運行的容器集個數不大于 X 且至少為 1,如果還不滿足 --maximum-dead-containers,則對所有已停止的容器(普通容器 + sandbox 容器)排序,優先刪除創建時間最早的容器直到滿足 --maximum-dead-containers 為止。執行清理直到滿足以下條件之一:
    • 每個 Pod 中存在的已掛掉的容器數滿足閾值。
    • 所有 Pod 中存在的已掛掉的容器數滿足閾值。

三、未使用的 Volume 清理

手動清理

定期清理不再使用的持久卷聲明(PVC)和掛載的 Volume 能釋放大量磁盤空間。使用以下命令刪除所有處于 Released 狀態的 PVC:

kubectl get pvc --field-selector status.phase=Released -o name | xargs kubectl delete

此外,若使用的是動態存儲卷,確保存儲類(StorageClass)配置了正確的回收策略。

觸發條件與過程

  • 觸發條件:當節點磁盤空間不足時,kubelet 會嘗試清理未使用的 Volumes。
  • 清理過程:kubelet 會識別并刪除那些不再被任何 Pod 引用的 Volumes。

自動清理涉及方面

  • PersistentVolumeClaim (PVC) 和 PersistentVolume (PV) 的回收策略:Kubernetes 中的 PVC 對象可以設置 reclaimPolicy 屬性,該屬性有兩個值:RetainDelete。當 PVC 與 PV 綁定后,如果 Pod 被刪除,根據 reclaimPolicy 的設置,Volume 可以被保留或自動刪除。
  • StorageClass 的 reclaimPolicy:在 StorageClass 對象中,可以設置 reclaimPolicy,這將決定 PV 的默認回收策略。當設置為 Delete 時,PV 和綁定的存儲資源在 PVC 刪除時將被自動清理。
  • Kubelet 垃圾回收機制:Kubelet 定期進行垃圾收集,包括容器和鏡像。Kubelet 每分鐘對未使用的容器執行一次垃圾收集,每五分鐘對未使用的鏡像執行一次垃圾收集。
  • Volume 插件目錄清理:Kubelet 可以通過配置 --volume-plugin-dir 參數來指定卷插件目錄,并定期清理其中的數據。
  • 日志文件管理:Kubelet 會定期清理舊的日志文件,或者配置日志輪轉工具(如 logrotate)來管理日志文件的大小和生命周期,以釋放磁盤空間。
  • 手動清理命令:可以使用 kubectl 命令清理未使用的 PV 和 PVC,例如查找未被使用的 PVC 并刪除它們,進而可能觸發關聯 Volume 的清理。
  • 定期審計和清理:定期檢查集群中的 Volume 使用情況,手動清理未被自動回收的 Volume。

四、驅逐機制(Eviction)

配置參數

kubelet 可以基于磁盤壓力等條件驅逐 Pod,釋放節點資源。編輯 /var/lib/kubelet/config.yaml 文件,添加或修改如下參數:

evictionHard:imagefs.available: 10%nodefs.available: 10%
evictionSoft:imagefs.available: 15%nodefs.available: 15%
evictionSoftGracePeriod:imagefs.available: 5mnodefs.available: 5m
evictionMinimumReclaim:imagefs.available: 5%nodefs.available: 5%

上述配置中,當鏡像文件系統或節點文件系統的可用空間低于 10% 時,觸發硬驅逐;低于 15% 時觸發軟驅逐,軟驅逐會在 5 分鐘后執行,每次驅逐操作至少回收 5% 的可用空間。修改后,重啟 kubelet 服務。

觸發條件與過程

  • 觸發條件:當節點資源(如內存、磁盤空間)低于硬驅逐閾值時,kubelet 會觸發驅逐機制。
  • 驅逐過程:kubelet 會根據配置的驅逐策略,選擇并終止某些 Pod 以釋放資源。例如,當節點的可用內存低于 100Mi 時,kubelet 可能會開始驅逐 Pod。

五、日志文件管理

自動輪轉

使用 logrotate 工具配置日志輪轉,編輯 /etc/logrotate.d/kubelet 文件:

/var/log/kubelet.log {dailymissingokrotate 7compressdelaycompressnotifemptycreate 0640 root admsharedscriptspostrotateif [ -f /var/run/kubelet.pid ]; thenkill -HUP `cat /var/run/kubelet.pid`fiendscript
}

上述配置表示每天輪轉一次 kubelet 日志文件,保留最近 7 天的日志,壓縮舊日志文件。

手動清理

手動刪除不再需要的日志文件:

sudo rm -rf /var/log/pods/*

需注意,此操作會清除所有 Pod 的日志,操作前請備份重要日志。

觸發條件與管理過程

  • 觸發條件:日志文件占用大量磁盤空間時。
  • 管理過程:kubelet 會定期清理舊的日志文件,或者配置日志輪轉工具(如 logrotate)來管理日志文件的大小和生命周期。

日志管理涉及方面

  • 日志文件路徑規則:Kubelet 將容器日志默認寫入 /var/log/pods 目錄下,每個 Pod 的日志存放在以其命名空間、名稱和 UID 為名的子目錄中。容器日志文件以容器重啟次數命名,格式為 <容器重啟次數>.log
  • 日志文件軟鏈接規則:容器日志目錄下的日志文件實際上是軟鏈接類型文件,指向實際的日志文件。
  • 日志文件清理:Kubelet 每 1 分鐘執行一次容器清理,包括清理死亡容器的日志目錄。如果一個 Pod 已經不再占用其日志目錄,Kubelet 會清理這些日志目錄。
  • 日志文件大小和文件數限制:Kubelet 配置選項 containerLogMaxSizecontainerLogMaxFiles 分別允許配置每個日志文件大小的最大值和每個容器允許的最大文件數,默認分別為 10Mi 和 5。
  • 日志輪換機制:Kubelet 提供了基于可以執行多少并發日志輪換以及監控和輪換日志所需要的間隔來調整日志的輪換方式的機制。可以通過配置 containerLogMaxWorkerscontainerLogMonitorInterval 來調整。
  • 系統組件日志位置:在使用 systemd 的 Linux 節點上,kubelet 和容器運行時默認寫入 journald。如果 systemd 不存在,kubelet 和容器運行時將寫入到 /var/log 目錄中的 .log 文件。
  • 自定義日志目錄:Kubelet 允許將 Pod 日志目錄從默認的 /var/log/pods 更改為自定義路徑,通過在 kubelet 的配置文件中配置 podLogsDir 參數來進行此調整。

六、配置參數調整

減少日志級別

編輯 kubelet 服務的啟動參數文件 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf,添加或修改 --v 參數來降低日志級別:

Environment="KUBELET_EXTRA_ARGS=--v=2"

日志級別范圍從 0 到 10,數值越小,日志輸出越少。修改后,重新加載 systemd 配置并重啟 kubelet 服務:

sudo systemctl daemon-reload
sudo systemctl restart kubelet

減少緩存

減少 kubelet 的緩存數據,如臨時文件和下載的鏡像等。編輯 /var/lib/kubelet/config.yaml 文件,添加或修改如下參數:

cacheDir: /var/lib/kubelet/cache
cacheMaxSize: 1024Mi

上述配置將 kubelet 的緩存目錄設置為 /var/lib/kubelet/cache,并限制緩存最大為 1024MB。修改后,重啟 kubelet 服務。

通用參數調整

管理員可以通過調整 kubelet 的配置參數來優化資源清理行為,例如調整垃圾回收的閾值和頻率。

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

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

相關文章

SPOJ 11576 TRIP2 - A Famous King’s Trip 【Tarjan+歐拉回路】

自我吐槽 &#xff08;哭 題目傳送門 SPOJ 洛谷 題目大意 讓你在簡單無向圖上刪去2條邊&#xff0c;使該圖聯通并存在歐拉回路 輸出字典序最小的一對邊 思路 考慮到存在歐拉回路的充要條件&#xff0c;即 i n x ≡ 0 ( m o d 2 ) ? i ( 1 ≤ i ≤ n ) in_x\equiv 0 (\m…

藏文情感分析器入門學習實踐

&#x1f3af; 項目目標&#xff1a; 輸入一段藏文短句。自動分析這句話的情感傾向&#xff1a;積極&#xff08;正面&#xff09;/消極&#xff08;負面&#xff09;/中立。 &#x1f50d; 技術原理簡介 情感分析是什么&#xff1f; 情感分析&#xff08;Sentiment Analysi…

雙指針(5)——有效三角形個數

題目&#xff1a; 這道題我們首先可能會想到暴力解法&#xff0c;三個for循環然后進行check&#xff08;&#xff09;。時間復雜度肯定是不允許的。 同時&#xff0c;驗證可以組成三角形的條件是任意兩邊之和大于第三邊&#xff0c;這就意味著我們每組要進行三次比較。但也有捷…

書生實戰營之沐曦專場

一&#xff1a;實驗環境進入和啟動實驗容器(D.run平臺) 1.1首先進入平臺進行注冊 D.run平臺https://console.d.run/ 注冊和登錄環節就跳過了。 1.2 啟動實驗容器--詳細步驟如下 1.2.1選擇容器的名稱、區域、鏡像&#xff08;注意鏡像必須選擇Dlinfer&#xff09; 1.2.2可以選…

內置類型成員變量的初始化詳解

在 C 中&#xff0c;內置類型&#xff08;如 int、float、double、char、指針等&#xff09;的初始化方式與類類型&#xff08;如 std::string、自定義類&#xff09;不同。由于內置類型沒有構造函數&#xff0c;它們的初始化行為由編譯器直接處理。以下是詳細解析&#xff1a;…

對第三方軟件開展安全測評,如何保障其安全使用?

對第三方軟件開展安全測評&#xff0c;能夠精準找出軟件存在的各類安全隱患&#xff0c;進而為軟件的安全使用給予保障。此次會從漏洞發現、風險評估、測試環境等多個方面進行具體說明。 漏洞發現情況 在測評過程中&#xff0c;我們借助專業技術與工具&#xff0c;對第三方軟…

11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文檔

Spring Boot 3.1.5 中使用 SpringDoc OpenAPI&#xff08;替代 Swagger&#xff09;生成 API 文檔 1. 項目結構 假設項目名為 springboot-openapi-demo&#xff0c;以下是項目的基本結構&#xff1a; springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…

python入門(1)變量與輸入輸出

一、變量 使用規則 變量名值例子 a13變量名規則 變量名可以用大小寫字母、數字、下劃線。 數字、下劃線不可開頭 例子 name name1 1name name_first _first 二、輸入輸出 輸出print print(*objects,sep"",end"\n") objects:多個要輸出的值 sep:每個…

TS 安裝

TS較JS優勢 1 TS靜態類型編程語言。編譯時發現錯誤 2 類型系統 強化變量類型概念 3 支持新語法 4 類型推斷機制 可以和React框架中的各種hook配合 5 任何地方都有代碼提示 tsc 命令 將TS轉為JS 1 tsc 文件.ts 生成 js文件 2 執行JS代碼

Linux-常用監控工具

以下是對 Linux 系統中常用監控工具&#xff08;netstat、ss、dmesg&#xff09;的系統性介紹&#xff0c;涵蓋其核心功能、典型用法及實際應用場景&#xff0c;幫助您分析系統狀態和內核參數調整后的效果&#xff1a; 1. netstat -s&#xff1a;網絡協議棧統計監控 功能 net…

Linux系統:詳解文件描述符與重定向原理以及相關接口(open,read,write,dup2)

本節重點 從狹義與廣義角度理解文件理解文件描述符掌握open,write,read系統調用理解重定向的概念與原理掌握重定向的指令操作stdout與stderr的比較為什么存在stderr&#xff1f; 一、理解“文件” 1.1 狹義角度 在狹義層面&#xff0c;Linux文件是磁盤或存儲設備上連續或分…

美國市場變局:沃爾瑪95%覆蓋率的3個流量入口重構策略

過去幾年&#xff0c;美國零售市場經歷了極大的變化。電商發展迅猛&#xff0c;加上疫情影響&#xff0c;消費者購物習慣出現轉向。而作為美國零售巨頭&#xff0c;沃爾瑪&#xff08;Walmart&#xff09;憑借高達95%的線下覆蓋率&#xff0c;始終是品牌和賣家不可忽視的渠道。…

一文詳解 Linux下的開源打印系統CUPS(Common UNIX Printing System)

文章目錄 前言一、CUPS 簡介二、CUPS 常用指令解析2.1 安裝 CUPS2.2 啟動/重啟服務2.3 添加打印機&#xff08;核心操作&#xff09;2.4 設置默認打印機2.5 打印文件2.6 查看打印任務2.7 取消打印任務2.8 查看、移除已添加的打印機 三、調試與常見問題3.1 日志查看3.2 驅動問題…

React useCallback函數

應用場景&#xff1a;父組件向子組件傳遞函數類型的props時

python 桌面程序開發簡述及示例

Python桌面程序開發簡述及示例 Python憑借其簡潔的語法和豐富的庫支持,非常適合開發跨平臺的桌面應用程序。本文將介紹Python桌面開發的主要方法,并提供實際代碼示例。 一、Python桌面開發主要方法 1.1 Tkinter(標準庫) Python內置的GUI庫,適合開發簡單桌面應用 1.2 …

數字智慧方案5875丨智慧交通樞紐綜合解決方案(43頁PPT)(文末有下載方式)

篇幅所限&#xff0c;本文只能提供部分資料內容&#xff0c;完整資料請看下面鏈接 https://download.csdn.net/download/2301_78256053/89575708 資料解讀&#xff1a;智慧交通樞紐綜合解決方案 詳細資料請看本解讀文章的最后內容。 隨著城市化進程的加速和交通需求的不斷增…

企業級分布式 MCP 方案

飛書原文檔鏈接地址&#xff1a;https://ik3te1knhq.feishu.cn/wiki/D8kSwC9tFi61CMkRdd8cMxNTnpg 企業級分布式 MCP 方案 [!TIP] 背景&#xff1a;現階段 MCP Client 和 MCP Server 是一對一的連接方式&#xff0c;若當前 MCP Server 掛掉了&#xff0c;那么 MCP Client 便不…

【AI提示詞】奧卡姆剃刀思維模型專家

提示說明 一位專注于奧卡姆剃刀思維模型的專業人士&#xff0c;擅長將簡潔性原則應用于復雜問題的分析與解決。 提示詞 # Role: 奧卡姆剃刀思維模型專家## Profile - language: 中文 - description: 一位專注于奧卡姆剃刀思維模型的專業人士&#xff0c;擅長將簡潔性原則應用…

2.1 行列式

引言 行列式是線性代數的核心工具&#xff0c;貫穿矩陣運算、特征值計算與微分方程求解。本文系統梳理2.1節核心考點&#xff0c;結合公式速查與典型例題&#xff0c;助你高效突破行列式難點&#xff01; 考點一&#xff1a;數值型行列式計算 1?? 行列式的定義 (1) 定義方…

單詞規律(簡單)

思路和同構字符串那道題一樣。、但是這道題要注意的地方就是&#xff0c;檢查 pattern 和 s 的單詞數量是否一致以及在進行字符串比較的時候應該用equals來進行比較&#xff0c;而不能用“&#xff01;”&#xff0c;“&#xff01;”比較的是對象引用而非內容。 class Soluti…