Kubernetes中 Requests 和 Limits 的初步理解

1 靈魂拷問

我們在使用 Kubernetes 時是否遇到以下情況:

  • 你會不會部署負載的時候將 CPU requests/limits 設置得過低或過高?
  • 你會不會部署負載的時候將 內存 requests/limits 設置得過低或過高?
  • 又或者你根本不設置 requests/limits?
  • request表示什么意思?limits 又是什么意思?
  • CPU 設置0.5表示啥意思?為啥又有人寫 500m,這又是什么情況?
  • 最佳實踐又是什么?

2 什么是 requests 和 limits?

我們都知道 Kubernetes 中最小的原子調度單位是Pod,那么就意味著資源管理和資源調度相關的屬性都應該Pod對象的字段,其中我們最常見的就是 Pod 的 CPU 和內存配置,而為了實現 Kubernetes 集群中資源的有效調度和充分利用,Kubernetes采用 requests 和 limits 兩種限制類型來對CPU和內存資源進行容器粒度的分配。

resources:  limits:    cpu: "1"memory: "500Mi"requests:    cpu: "100m"memory: "1000Mi"

下面我們首先來了解一下上面這段 yaml 文件中字段的含義:requests 和 limits:

  • requests 定義了對應的容器所需要的最小資源量。
  • limits 定義了對應容器最大可以消耗的資源上限。
  • cpu 等于1一般等同于1CPU 核心,1個VCPU或者一個超線程,具體要看服務器的CPU。而 limits 這里設置的 100m 則叫做100毫核,100m就表示0.1個核,所以這里也可以用0.1代替。
  • memory 等于500Mi,(備注:1Mi=10241024;1M=10001000)

接下來我們來初步理解 requests 和 limits 這兩個資源限制類型,在 Kubernetes 對 CPU 和內存資源限額的設計,通常是指用戶在提交 Pod 時,可以聲明一個相對較小的 requests 值供調度器使用,而 Kubernetes 真正設置給容器 Cgroups 的,則是相對較大的 limits 值。所以一般來說,在調度的時候 requests 比較重要,在運行時 limits 比較重要。

而對應實際的業務場景來說,以 java 應用為例,requests 對應的就是JVM虛擬機所需資源的最小值,而 limits 對應的就是 JVM 虛擬機所能夠使用的資源最大值。以內存資源為例一般就是指:Xms 和 Xmx,如果 requests 值設置的小于JVM虛擬機 Xms 的值,那么就會導致 Pod 內存溢出,從而導致 Pod 被殺掉,而后重新創建一個Pod。

那么如果 CPU 資源使用超過了 limits,Pod會不會被殺掉呢?答案是不會,但是被限制。如果沒有設置 limits ,Pod 可以使用全部空閑的資源。另外如果設置了 limits而沒有設置 requests 時,Kubernetes 默認會將 requests 等于 limits。

這里通常還會將 requests 和 limits 描述的資源分為兩類:可壓縮資源(compressible resources) 和不可壓縮資源(incompressible resources)。這里不難看出CPU這類型資源為可壓縮資源而內存這類型資源為不可壓縮資源。所以合理設置不可壓縮資源的limits值就相當重要了。

3 理解 Kubernetes 中 Pod 的 Qos

當我們理解 requests 和 limits了之后,我們來想一個問題:當某個 Node 上的內存還剩下 90Mi,這個時候就觸發了 Kubernetes 的 Eviction,這個時候 kubelet 就會挑選 Pod 進行刪除操作,那么這個時候 kubelet 挑選的依據是什么呢?

當 Kubernetes 所管理的宿主機上不可壓縮資源短缺時,就有可能觸發 Eviction。
Eviction 的默認閾值如下:
memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%

答案就是依據requests和limits值的設置方式來決定,Kubernetes會將Pod劃分成3種不同的Qos級別里面去,根據Pod不同的Qos級別來挑選。?

  • 首當,其沖的就是刪除BestEffort級別的Pod,這個級別的Pod完全沒有做任何資源限制,即完全沒有設置CPU/內存的requests和limits。
  • 其次,是Burstable級別的Pod,這個級別的Pod至少設置了1個CPU或者內存的requests,但又不滿足最高級別的Qos條件。
  • 最后,才是 Guaranteed 級別的Pod,即Pod同時設置了CPU、內存的requests和limits,并且requests值等于limits的值。并且,Kubernetes 會保證只有當 Guaranteed 級別的 Pod 的資源使用量超過了其 limits 的限制,或者宿主機本身正處于 Memory Pressure 狀態(當宿主機的 Eviction 閾值達到后,就會進入該狀態)時,Guaranteed 級別的 Pod 才可能被選中進行 Eviction 操作。

?可以看下面的表格,以更好的理解:

?CPU requests/limits內存 requests/limitsQos級別
未設置未設置BestEffort
未設置requests < limitsBurstable
未設置requests = limitsBurstable
requests < limits未設置Burstable
requests < limitsrequests < limitsBurstable
requests < limitsrequests = limitsBurstable
requests = limitsrequests = limitsGuaranteed

4 最佳實踐

為 namespace 設置資源配額

  • ResourceQuotas 限制主要是指該 namespace 下面的所有 Pod 指定一個 requests和limits的總和要小于設置的 requests 和 limits。
  • 該 namespace 下每一個容器必須指定 requests 或 limits,否則將不允許創建。

這樣子做的好處就是實現了一條隱含的規則,每個人都要遵守。

設置默認的 requests 和 limits

在生產環境中,很多負載 CPU 和內存的所需的資源基本相同,那么我們可以設置好默認的 requests 和 limits,當用戶沒有指定 requests 和 limits 值,直接使用默認值。

配置啟用CPUSET

我們知道,在使用容器的時候,你可以通過設置 cpuset 把容器綁定到某個 CPU 的核上,而不是像 cpushare 那樣共享 CPU 的計算能力。這種情況下,由于操作系統在 CPU 之間進行上下文切換的次數大大減少,容器里應用的性能會得到大幅提升。事實上,cpuset 方式,是生產環境里部署在線應用類型的 Pod 時,非常常用的一種方式。

那么如何啟用 cpuset 呢?只需要遵循以下2條規則來設置 requests 和 limits 即可:

  1. 設置 CPU 的 requests 和 limits 的值相等且為整數值。
  2. 設置 Pod 的 CPU 和內存的 requests 和 limits 值相等,也就是該 Pod 是一個Guaranteed 級別的 Pod。

高負載Pod requests 和 limits 的設置

而對于負載,流量比較高的 Pod,requests 和 limits 的設置需要根據具體的情況分析,需要分析業務的多個維度。例如

  • 該服務的容器是 CPU 密集型,還是吃內存型,亦或者是 IO 密集型。
  • 該服務是個單點,還是高可用的。
  • 這個服務的上下游都是誰?
  • 這個服務的歷史監控數據是怎么樣的?

說了這么多,貌似還是不知道怎么設置。這就給大家一個“標準答案”:

  • 根據歷史的 CPU,內存,網絡,存儲等監控數據,一般 requests 值可以設定為歷史數據均值。
  • limits 則設置為歷史數據均值再增加 30%-50%,當然實際設置還是要根據情況做些微調。

總結

本文主要為大家介紹了 Kubernetes 中 requests 和 limits 兩種資源限制類型來對資源進行容器粒度的分配,從而實現 Kubernetes 集群中資源的有效調度和充分利用,還提供了一些我的一些實踐。歡迎大家留言交流。

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

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

相關文章

SVN創建項目分支

目錄 背景調整目錄結構常規目錄結構當前現狀目標 調整SVN目錄調整目錄結構創建項目分支 效果展示 背景 當前自己本地做項目的時候發現對SVN創建項目不規范&#xff0c;沒有什么目錄結構&#xff0c;趁著創建目錄分支的契機&#xff0c;順便調整下SVN服務器上的目錄結構 調整目…

Stable Diffusion WebUI使用inpaint anything插件實現圖片局部重繪

Inpaint Anything是一個強大的圖像處理工具,它結合了SAM(Segment Anything Model)、圖像修補模型(如LaMa)和AIGC模型(如Stable Diffusion)等先進技術,以實現圖像中物體的移除、內容的填補以及場景的替換。無論是對圖像中的任何元素進行編輯,還是對圖像整體進行場景轉換…

【Vue】Vue2使用ElementUI

目錄 Element UI介紹特點Vue2使用Element安裝引入ElementUI組件庫 使用ElementUI用戶注冊列表展示其他 mint-ui介紹特點安裝組件引入組件Mint-ui相關組件 Element UI 介紹 官網(基于 Vue 2.x ):https://element.eleme.cn/#/zh-CN ElementUI 是一個基于 Vue.js 的桌面端組件庫…

Vue文本溢出如何自動換行

css新增 word-break: break-all; word-wrap: break-word;

【Linux系統】文件與基礎IO

本篇博客整理了文件與文件系統、文件與IO的相關知識&#xff0c;借由庫函數、系統調用、硬件之間的交互、操作系統管理文件的手段等&#xff0c;旨在讓讀者更深刻地理解“Linux下一切皆文件”。 【Tips】文件的基本認識 文件 內容 屬性。文件在創建時就有基本屬性&#xff0…

網易:一季度營收269億元,連續7季研發強度超15%領跑行業

5月23日&#xff0c;網易發布2024年第一季度財報。財報顯示&#xff0c;網易Q1營收269億元&#xff0c;歸屬于公司股東的凈利潤85億元&#xff08;Non-GAAP&#xff09;&#xff0c;以連續7個季度超15%的研發投入強度領跑行業&#xff0c;首季業績穩健啟航。 一季度&#xff0…

JVM學習-動態鏈接和方法返回地址

動態鏈接–指向運行時常量池的方法引用 每一個棧幀內部包含一個指向運行時常量池中該棧幀所屬方法的引用&#xff0c;包含這個引用的目的為了支持當前方法的代碼能夠實現動態鏈接(Dynamic Linking)&#xff0c;如invokednamic指令。在Java源文件被編譯到字節碼文件中時&#x…

云平臺概要設計文檔 -大綱

1. 引言 1.1 目的 本文檔的目的是提供一份詳細的技術規范,用以指導開發團隊實現云平臺的建設和部署。該文檔旨在確保所有開發人員和相關技術人員對系統的架構、組件、交互流程、數據處理及安全措施有深入的理解,從而能夠高效、一致地開發出符合預期功能和性能要求的系統。 …

JAVA:淺談JSON與JSON轉換

可能有很多人&#xff0c;無論是前端還是后端&#xff0c;無論是JAVA還是Python還是C&#xff0c;都應該跟JSON這種數據格式打過交道&#xff0c;那么有沒有仔細的想過&#xff0c;什么叫JSON&#xff1f; JSON是一種輕量級的數據交換格式。它基于JavaScript語言的對象表示法&a…

初識java——javaSE(6)抽象類與接口【求個關注!】

文章目錄 前言一 抽象類1.1 抽象類的概念1.2 抽象類的語法&#xff1a;1.3 抽象類與普通類的區別&#xff1a; 二 接口2.1 接口的概念2.2 接口的語法2.2.1 接口的各個組成2.2.2 接口之間的繼承 2.3 接口的實現接口不可以實例化對象 2.4 接口實現多態 三 Object類3.1 Object類是…

【shell】腳本練習題

案例&#xff1a; 1. for ping測試指網段的主機 網段由用戶輸入&#xff0c;例如用戶輸入192.168.2 &#xff0c;則ping 192.168.2.10 --- 192.168.2.20 UP&#xff1a; /tmp/host_up.txt Down: /tmp/host_down.txt 2. 使用case實現成績優良差的判斷 1. for ping測試指…

Android異常及解決方式記錄

異常1&#xff1a;Tmp detached view should be removed from RecyclerView before it can be recycled: 解決方法&#xff1a; recycleView.setItemAnimator(null);

第17講:C語言內存函數

目錄 1.memcpy使用和模擬實現2.memmove使用和模擬實現3.memset函數的使用4.memcmp函數的使用 1.memcpy使用和模擬實現 void * memcpy (void * destination, const void * source, size_t num);? 函數memcpy從source的位置開始向后復制num個字節的數據到destination指向的內存…

Python面試寶典:Python中與多線程編程相關的面試筆試題(1000加面試筆試題助你輕松捕獲大廠Offer)

Python面試寶典:1000加python面試題助你輕松捕獲大廠Offer【第二部分:Python高級特性:第十三章:并發編程:第一節:多線程編程】 第十三章:并發編程第一節:多線程編程使用`threading`模塊面試題1面試題2面試題3面試題4面試題5面試題6面試題7面試題8面試題9面試題10更多面…

打豆豆game

好的&#xff0c;我將為您編寫一個簡單的“打豆豆”游戲。這個游戲的基本規則是這樣的&#xff1a; 游戲將生成一個指定大小的網格&#xff0c;每個格子可能包含一個豆豆。玩家可以指定一個格子&#xff0c;如果該格子中有豆豆&#xff0c;則打掉該豆豆&#xff0c;并得分。每…

【Java 開發】模版模式使用模版

在日常開發中&#xff0c;對適合的場景。使用模板模式可以幫助我們抽取公共的東西&#xff0c;使代碼更加優雅。本次寫了一個模版模式的使用模版&#xff0c;方便以后 cv。 本次是以訂單的接受、拒絕、關閉三個操作作為 demo 來寫的模板。 一、定義請求基類&#xff0c;不同操作…

leecode42 DP

自己的暴力想法,把圖形看成一個個碗,一段一段地算,錯誤示例 class Solution { public:int trap(vector<int>& height) {int s height.size();int sum 0,kk1;int flag 0;int p1 -1, p2 -1;for (int i 1; i < s; i) {cout<<p1<<endl;if (p1 >…

網絡安全技術與應用:遠程控制與數據庫安全

實驗準備 軟件&#xff1a;VMware Workstation Pro 虛擬機&#xff1a;Red Hat Enterprise Linux 7 服務器&#xff0c;Red Hat Enterprise Linux 7 客戶端 網絡模式&#xff1a;NAT模式 1、配置服務器及客戶端網絡 服務器IP 客戶端IP 測試相互通信 在客戶機上設置鏡像&#…

【C++刷題】優選算法——遞歸第二輯

全排列 vector<vector<int>> vv; void dfs(vector<int>& nums, vector<int>& v, vector<bool>& check) {if(v.size() nums.size()){vv.push_back(v);return;}for(int i 0; i < nums.size(); i){if(check[i] false){v.push_ba…

pillow學習5

ImageEnhance 模塊 內置的 ImageEnhance 模塊中包含了多個用于增強圖像效果的函數&#xff0c;主要用來調整圖像 的色彩、對比度、亮度和清晰度等&#xff0c;感覺上和調整電視機的顯示參數一樣。 在模塊 ImageEnhance 中&#xff0c;所有的圖片增強對象都實現一個通用的接口。…