2025年3月10日 星期一

Kubernetes - tuning containers resources requests and limits

Target
- daemonsets
- deployment
- statefulsets


Policy
- request cpu 單位以十進位設定
  - 像是 50m 100m 200m 250m 500m 1000m(or 1)
- request memory 單位以二進位設定
  - 像是 16Mi 32Mi 64Mi 128Mi 256Mi 384Mi 512Mi 768Mi 1024Mi(or 1Gi)
- request memory 是 node 實際上能放進 pod 的基本量, pod 塞不進 pod 就得生出新的 node 來放.
- pod cpu 吃到超過 limit cpu, 會被卡住等下一輪資源繼續跑, 不會被砍掉.
- pod memory 吃到超過 limit memory, 會被 OOM 機制砍掉.
- request cpu 太小的話, 有可能 schedule job 耗用的 cpu 反而比較高, 造成效率變差.
- limit memory 至少是 request memory 的一倍大, 才不會被塞進剩餘空間太小的 node 然後 OOM 被宰.
- nodejs 可能有 memory leak 狀況, memory 可能會越吃越多(無法被 gc), 最後被 OOM 砍掉.
- nodejs memory leak 越嚴重, cpu 耗用越高, 有可能卡到 limit cpu 導致卡卡的慢.
- java / nodejs 服務啟動時可能會吃大量 memory, 然後才 gc 放掉, limit memory 就得觀察後再提高.



Cloud Features
- AWS
  - node instance type 用 t 系列可以 cpu burst (use credit or $$), 必要的時候 limit cpu 可以拉很高來用.
- GCP
  - request minimum
    - cpu 50m
    - memory 52Mi
  - resources cpu:memory 比例有最大上限 1:6.5
- Azure
  - TBD


Azure
- cpu
  - request 要看服務是用什麼服務/架構寫的, 太少的話可能 pod 不會在 1 分鐘內 ready, 像是 java.
  - limit 要觀察服務量有多大而設定, 或是服務本身的機制耗用 cpu 高的話, limit 也拉高備用.
  - go
    - request
      - 50m
    - limit
      - 200m or more
  - nodejs / typescript
    - request
      - 100m
      - or more for pod ready in 1min
      - or less for low cpu resource use after startup
    - limit
      - 500m
  - java / kotlin / scala
    - request
      - 200m
      - or more for pod ready in 1min
      - or less for low cpu resource use after startup
    - limit
      - 1
      - 還是有可能 1 分鐘內 pod 沒來得及 ready, 得調整 deployment 加長 ready 偵測時間
        - spec.template.spec.containers.livenessProbe.initialDelaySeconds: 60
        - spec.template.spec.containers.readinessProbe.initialDelaySeconds: 60

- memory
  - request 通常會設定為比目前用量小一階的基本量.
  - limit 則是會設定為比目前用量大一階, 得花些時間觀察狀況持續更新.

% kubectl top pod | grep foobar-deploy foobar-deploy-8487bddd77-cl5br 18m 365Mi foobar-deploy-8487bddd77-pmpm4 43m 343Mi foobar-deploy-8487bddd77-sfdtc 19m 299Mi foobar-deploy-8487bddd77-sl5s9 21m 605Mi foobar-deploy-8487bddd77-sr5kc 21m 618Mi
- request - 256Mi - limit - 768Mi
% kubectl top pod | grep blahblah-deploy blahblah-deploy-6fc6dd8c97-5txhc 25m 263Mi blahblah-deploy-6fc6dd8c97-7s8jb 26m 287Mi blahblah-deploy-6fc6dd8c97-9dc4z 25m 199Mi blahblah-deploy-6fc6dd8c97-bc7kf 26m 330Mi blahblah-deploy-6fc6dd8c97-bqwwf 26m 329Mi blahblah-deploy-6fc6dd8c97-dgj22 24m 283Mi blahblah-deploy-6fc6dd8c97-gjftr 26m 260Mi blahblah-deploy-6fc6dd8c97-kgmf4 24m 279Mi blahblah-deploy-6fc6dd8c97-nl667 25m 217Mi blahblah-deploy-6fc6dd8c97-nqbqb 28m 266Mi blahblah-deploy-6fc6dd8c97-pjfs9 33m 220Mi blahblah-deploy-6fc6dd8c97-qbslb 26m 527Mi blahblah-deploy-6fc6dd8c97-sf4hc 38m 261Mi blahblah-deploy-6fc6dd8c97-tn5ch 27m 392Mi blahblah-deploy-6fc6dd8c97-wg2qs 25m 258Mi
- request - 128Mi - limit - 512Mi or 768Mi - 因為 pod 數量夠多, 所以少數超過 512Mi 的情況可以接受設定 512Mi 被 OOM 砍掉換人做. - 但如果是一次處理大量資料的 pod, 就不能發生被中途砍掉的狀況, 得設定 768Mi 甚至更多.

沒有留言:

張貼留言