什麼是Resource Requests & Limits ?
有些應用程式本身需要比其他更多的CPU與Memory的Resources
或是CPU要求數量問題,要確保實際佈署的work node上有足夠的Resource!
之後schedular判斷Resource後決定該佈署到哪去(i.e. Resource Requests):
如果如下狀況,可以確保佈署正常,但是還是會有疑慮:
如上圖,應用程式運行的時後,可能會使用到比"Request"更多的Resources
例如資料量多,並且是以Memory來做儲存,有可能一直增加甚至超過需求
當然也有可能是bug造成此一類占用超過”Request”的Resources的狀況!
這類應用程式或說Pod最好reschedule(重新安排)!
並確保以下兩種狀況:
- Container不會消耗完整個Node剩餘的Resource資源
- Container消耗Resource僅允許某個極限值,不得再往上要求!
答案則是 →可以定義resource limits
實際Resource Requests & Limits設定:
由deployment元件出發
首先建立一個基本的nginx的deployment元件Configuration File:
初步定義內容如下,就是很簡單的Main & sidecar Containers架構:
接著就要來定義其中的應用程式需要多少Resources?
一般而言可能都是採取一個平均數來決定需要多少Resources
但是總有些特別的應用程式Pod需要擴張更多Resources供其消耗使用
例如Redis可能需要特別多的Memory,因為使用量比其他應用程式更大!
透過監看並微調可以供給的數值
亦即不是所有的應用程式都是使用一樣的Resources,所以需求都不一樣
需要明確的定義Requests!
於此我們嘗試定義Main Container的nginx,滿足預期運作所需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 Cluster上Pod非常多:
如何快速的查看其Resource定義?
→使用output格式:jsonpath
執行以下指令:
kubectl get pod -o jsonpath="{range .items[*]} {.metadata.name}{.spec.containers[*].resources}{'\n'}"
range .items[*]表示所有Pod
講師特別註記:
- 當某個Node被用光Resources了
- 這個Node就會對隨機一個Pod下逐客令(evict)
- 但是通常會先從沒有清楚定義Resource的Pod開始!
並且剛剛的指令:
kubectl get pod -o jsonpath="{range .items[*]} {.metadata.name}{.spec.containers[*].resources}{'\n'}"
對沒有定義Resources的Pod也會生效
另外我找到實際看當下Pod的Resource消耗量則要進到Container內看:
要看CPU,進到Container內部執行:
cat /sys/fs/cgroup/cpu/cpuacct.usage
同理memory確認一樣進到Container內部執行:
cat /sys/fs/cgroup/memory/memory.usage_in_bytes
這部分應該會有第三方解,更方便追蹤這些Resource消耗的metrics!