Kubernetes CKA課程筆記 58

Resource Requests & Limits

ZONGRU Li
Nov 19, 2021

K8s Admin角度出發,需要經常性地檢視

是否開發者有依據最佳範例或標準來佈署

其中對於開發者佈署的workload中,重要的是確認是否有定義其:

  1. Resource Requests
  2. Resource Limits

或提供給開發者範例(Configuration File),並告知可以如何定義

什麼是Resource Requests & Limits ?

有些應用程式本身需要比其他更多的CPUMemoryResources

或是CPU要求數量問題,要確保實際佈署的work node上有足夠的Resource!

之後schedular判斷Resource後決定該佈署到哪去(i.e. Resource Requests):

如果如下狀況,可以確保佈署正常,但是還是會有疑慮:

如上圖,應用程式運行的時後,可能會使用到比"Request"更多的Resources

例如資料量多,並且是以Memory來做儲存,有可能一直增加甚至超過需求

當然也有可能是bug造成此一類占用超過”Request”Resources的狀況!

這類應用程式或說Pod最好reschedule(重新安排)!

並確保以下兩種狀況:

  1. Container不會消耗完整個Node剩餘的Resource資源
  2. Container消耗Resource僅允許某個極限值,不得再往上要求!

答案則是 →可以定義resource limits

實際Resource Requests & Limits設定:

deployment元件出發

首先建立一個基本的nginxdeployment元件Configuration File:

初步定義內容如下,就是很簡單的Main & sidecar Containers架構:

接著就要來定義其中的應用程式需要多少Resources?

一般而言可能都是採取一個平均數來決定需要多少Resources

但是總有些特別的應用程式Pod需要擴張更多Resources供其消耗使用

例如Redis可能需要特別多的Memory,因為使用量比其他應用程式更大!

透過監看並微調可以供給的數值

亦即不是所有的應用程式都是使用一樣的Resources,所以需求都不一樣

需要明確的定義Requests!

於此我們嘗試定義Main Containernginx,滿足預期運作所需Resources

給予其Requests Resources定義如下:

memory: “64Mi” (Mi = “mebibyte”)

cpu : “250m” (m = “millicore”)

給予其Limits Resources定義如下:

memory: “128Mi” (Mi = “mebibyte”)

cpu : “500m” (m = “millicore”)

實際如下圖:

接著同理給予logging-sidecar Container更低的Resources:

但是假裝在寫log傳給其他service之前

需要更多的memory需求,所以memory給略高!!!

順便改寫這整個deployment元件的名稱,最終完成如下:

儲存

執行建立:

Query定義的Resources & Limits:

考量到目前K8s ClusterPod非常多:

如何快速的查看其Resource定義?

→使用output格式:jsonpath

執行以下指令:

kubectl get pod -o jsonpath="{range .items[*]} {.metadata.name}{.spec.containers[*].resources}{'\n'}"

range .items[*]表示所有Pod

以此指令就能查看Pod定義的Resource的Request與Limits!

講師特別註記:

  • 當某個Node被用光Resources
  • 這個Node就會對隨機一個Pod下逐客令(evict)
  • 但是通常會先從沒有清楚定義ResourcePod開始!

並且剛剛的指令:

kubectl get pod -o jsonpath="{range .items[*]} {.metadata.name}{.spec.containers[*].resources}{'\n'}"

對沒有定義ResourcesPod也會生效

另外我找到實際看當下PodResource消耗量則要進到Container內看:

要看CPU,進到Container內部執行:

cat /sys/fs/cgroup/cpu/cpuacct.usage

同理memory確認一樣進到Container內部執行:

cat /sys/fs/cgroup/memory/memory.usage_in_bytes

這部分應該會有第三方解,更方便追蹤這些Resource消耗的metrics!

參考課程(reference)

--

--

ZONGRU Li
ZONGRU Li

Written by ZONGRU Li

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

No responses yet