(譯文)For the love of god, stop using CPU limits on Kubernetes (updated)

筆記一下K8S的CPU限制管理相關的議題

ZONGRU Li
Sep 29, 2022

原文出處:
For the love of god, stop using CPU limits on Kubernetes (updated)

因為對這方面主題也滿有興趣的,但是感覺有時候英文內容的記憶有點薄弱

所以有空來搞搞翻譯,以下就是大概內容的翻譯(只是給自己看的)

Kubernetes上的CPU限制是反模式

許多人認為你需要在Kubernetes上面設置CPU限制,但這不對

大多數情況下,Kubernetes的CPU限制帶來的傷害多於幫助

我將透過三個類比渴求CPU並飢渴地在沙漠中探索的pods,來解釋為何CPU限制是有害的.我們將稱呼我們的強悍的探險家為Marcus與Teresa.

在我們的故事中,CPU將類比成水並且缺水會導致死亡.如CPU也就是水在故事中是可再生的資源.在一般情況下,在一定時間內若CPU使用率達100%,這對於下一段時間來說並不代表"用完".因為CPU資源都是與時更新的

中間插入的解釋:

CPU永遠不會用完.物理上這是不可能的

在任何時刻,Linux都會做出調度決定,若強制透過限制將CPU留空,當之後有更高優先度的工作負載出現時,那段時間將無法去利用(這邊指的時間就是被限制留空的CPU).時間是一直往前的,不可逆轉.死者永遠回不來,你無法逆轉回到前一天.

(我自己個人覺得上面這段有點像微積分,所以我自己畫了以下圖)

一般CPU使用可能如下圖

圖1

今天假設0~2秒內給予CPU限制,讓其中2core閒置:

圖2

那麼是問圖2能處理掉的workload要怎麼達到跟圖1一樣的量呢?

答案很簡單 →多跑到第6秒就能完成一樣的workload(相同截面積)了

圖3

但問題是如果今天單位不是秒,而是"天"呢

如workload估算CPU 4 core全吃滿是5天可以全部搞定

但是不小心加了限制0~2天時候被扣住其中2 core要求閒置

那麼就得跑到第6天結束才能跑完規定的workload

這問題就很明顯了

就好像生產機台我們往往都會要求機台的throughput(生產量)

每分每秒都要達到100%滿載

哪一分哪一秒低於100%很可能就要寫報告解釋了!

三個豐富的類比Kubernetes CPU限制

Marcus與Teresa在沙漠中旅行.他們有個神奇水壺每天都能提供3公升的水,而每個人每天都需要至少1公升才能生存.

故事1 — 沒有限制,沒有要求:

Marcus很貪婪地在Teresa之前喝光全部的水.Teresa渴死.這是因為沒有限制或要求,所以Marcus才得以喝光水,造成缺乏CPU飢荒,而Teresa渴死.

故事2— 有限制,有或沒有要求:

某天Teresa病了而需要更多水.Marcus喝了它的那1公升,所以還剩餘2公升.Teresa喝了1公升也就是剩餘1公升.Marcus卻因為限制而不想讓Teresa再繼續喝.Teresa因為被限制1天只能喝1公升所以渴死了.這就是限制CPU資源.但是資源其實是足夠的卻有被限制的狀況.

故事3 — 沒有限制,有要求:

某天Marcus病了而需要更多水.Marcus原本嘗試要喝光水壺,但是當他喝到水壺中剩下1公升時停了下來.這是那天為了留給Teresa所需要的1公升.Teresa喝完那最後的1公升.他們倆個都活了下來.這就是當沒有CPU限制但是有設置要求的時候會發生的事.一切都很好.

以上的故事出奇準確地類比了CPU限制下會造成的傷害

不喜歡以上類比? 作者有血更多技術解釋關於Prometheus的CPU限制告警CPUThrottlingHigh

避免有設置CPU限制下出現CPU節約與CPU不夠

許多人認為要設置限制來避免一個pod干擾到另一個pod.

這不對!你可以移除Kubernetes CPU限制仍然可以避免因為CPU不足導致出現pod遭受CPU飢餓的狀況!這都要歸功於CPU要求.

這邊是片段來自原始Kubernetes文件:

最重要的部分在於Pods永遠會有CPU要求來自於他們的CPU要求!(若他們沒有限制,則可以很方便地超過CPU限制.)

假若你有給足精確的CPU要求,那麼就可以停用你的CPU限制!這樣就不用節約了,因為CPU將依據他們的要求給予取用.此時就沒有限制能做的事了

Kubernetes 要求 vs 限制

總結不同的CPU限制與要求的表格:

簡單來說,作者假設所有pod都有CPU限制或著沒有.CPU請求也是如此.這讓一切更容易推演.

更多關於Kubernetes資源管理普遍的誤解

作者有做系列影片關於這篇文章的概念以及其他誤解(LINK):

Kubernetes上的CPU限制與要求最佳實踐

來總結:

  1. 對所有一切都設置CPU要求
  2. 確保他們都是精準的
  3. 別設置CPU限制

Tim Hockin(其中一位原本Google的Kubernetes的維護者)在這幾年已經做了相同的建議.

那關於Memory的限制與要求呢?

上述所有這篇文章描述的都是CPU,而不是Memory.Memory是不一樣的,因為它不是可壓縮的-當給定了memory,除非砍掉process,否則你就不能移除它.作者也有相關的Kubernetes的Memory管理限制的最佳實踐.簡單來說,最終建議是:

  1. 永遠使用Memory限制
  2. 永遠使用Memory要求
  3. 永遠設置你的Memory要求等於限制

查看Kubernetes關於Memory要求與限制的完整的文章

為何CPU節約會出現在Kubernetes的其他理由

這篇文章專注在K8s的CPU限制.但確實有其他理由會出現CPU需要節約的狀況.這是個好機會穿插Robusta.dev,它有告訴我們在Kubernetes上的Prometheus告警根因.它分析你的告警並且添加了缺失的context,這適用於所有的告警包含Kubernetes的高CPU節約告警.

後面就是一些原文相關的額外閱讀連結

像是4種追蹤Kubernetes resources變更?

以上就是該文章的粗略翻譯,內容也穿插我自己的想法(微積分圖解那邊)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet