Cost Management of Cloud Kubernetes

雲端K8s省錢工程

Che Chia Chang

About Me

Che Chia Chang

Outline

  • Cost on Public Cloud
  • K8s Compute Resource Management
  • Monitoring
  • Cost Analysis and Prediction
  • Resource Recommendation
  • Saving Plan
  • Spot Instance
  • HPA / VPA
  • Q&A

Cost on Public Cloud

open your cloud billing

  • Compute Resource (cpu, memory)
  • Storage (Disk, EBS, S3…)
  • Database (Compute Resource + Storage)
  • Networking

Today’s topic

  • Today’s topic

    • Compute Resource
    • cpu & memory
  • Maybe next time

    • Storage (Disk, EBS, S3…)
    • Database (Compute Resource + Storage)
    • Networking

Cost on Public Cloud

CPU / memory intense web service

  • RESTful api
  • long-connetion service
  • business logic
  • save state to disk / database

尋找多餘的算力

  • 已有足夠的 cpu / memory,多給也不會增加服務品質的多餘算力
  • 多少才是夠?
  • 減去多少 cpu / memory,依然不改變服務品質

維持SLO

以維持各個服務元件的 SLO為前提,降低 cpu / memory 使用量

基於 SLO 的成本調降

  • 負載穩定的元件,可以抓過去 30d 的 p99 cpu time 或 p99 memory usage + buffer
  • 負載不穩定的元件,例如 cpu usage 與受活躍用戶數量正比,需要搭配 HPA 水平拓展
  • 負載不穩定的元件,但又不能水平拓展,例如 stateful service,可以考慮 VPA

小結:成本控管的基本概念

  • 尋找服務中多餘算力
  • 以維持 SLO 為前提
  • 降低 cpu / memory 使用量
  • 依據元件負載特性,選擇適當的調降方式

Background Knowledge

k8s cpu / memory management

https://kubernetes.io/docs/concepts/configuration/manage-resources-containers

  • k8s 如何管理 workload 的 cpu 與 memory
  • 調降多少會影響服務品質

How k8s manage cpu / memory

  • scheduler 依據 cpu / memory request 調度 pod
  • container runtime 設定 cgroup
    • cpu 使用量依據 request 佔 node 比例分配
    • 控制 cpu 用量不超過 limit
    • memory 使用 limit,超過 limit 會被 oomkill,並依據設定重啟
    • 當前 node memory 不足時,會依據 pod request Evict pod

上面都是概念,底下進實作

Monitoring

  • Monitoring 是 cost management 的基礎
  • 沒有 monitoring 就沒有 p99 cpu time / p99 memory usage,也沒有 SLI/SLO
  • 如果沒有 monitoring 先補 monitoring

Monitoring: 調整前

  • 過去的 p99 資源用量
  • 目前的效能表現
  • 多餘的算力 = (分配的 resource - p99)

Monitoring: 調整後

調整前後比較

  • 資源用量
  • 目前的效能表現
  • 確定沒有改壞東西
  • 有改壞,要有及時的 alert

Monitoring Tools

https://grafana.com/grafana/dashboards/17375-k8s-resource-monitoring/

Cost Analysis and Prediction

  • 有了 prometheus 後,我們知道短期/長期的資源使用狀況
  • 要把資源使用轉成成本,需要一個成本計算工具
  • 評估是否要做成本精簡,能夠減少多少錢
  • 管理上的考量:投資人力成本,與預期回報

Cost Analysis: billing

Cost Analysis: Cloud billing

  • 計算長時間的費用趨勢
  • 適合當作成本精簡後的成果回報
  • 不適合當做調整的依據
  • 時間計算較長,反饋時間長,不及時,項目不夠精細
  • 有無更即時的成本分析工具?

Cost Analysis: Kubecost / Opencost

  • 有提供 UI
  • 基於 prometheus
  • 可以針對 allocation 做成本分析 Cost Allocation
  • 可以透過 cloud provider 去撈雲端的使用資料

https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/cost-allocation

https://docs.kubecost.com/using-kubecost/navigating-the-kubecost-ui/cost-allocation/efficiency-idle

Recommedation Tools

Recommedation Tools: Kubecost / Opencost Savings

  • 設定 target utilization
    • dev 80%+
    • prod 60%

Recommedation Tools: KRR

Recommedation Tools: KRR

kubectl port-forward svc/prometheus 9090

git clone https://github.com/robusta-dev/krr.git
source .venv/bin/activate

python krr.py simple \
  -p http://127.0.0.1:9090 \
  --mem-min 10 \
  --cpu-min 10 \
  --history_duration 720 -q

Recommedation Tools: KRR

  • 根據 krr 計算的結果,手動調整
  • 有一些工具有提供自動調整 ex VPA

Recommedation Tools: VPA recommendator

  • 需要先知道 VPA 是什麼
  • 直接安裝在 k8s cluster 內
  • 透過 Prometheus 資料,推薦適當的資源
  • 可以自動化推薦資源,調整運行中的 pod,依照設定重啟 pod VPA mode
  • 需要可以參考 helm chart

Recommedation Tools: 比較

  • kubecost 需要 helm install,krr 不需要

  • kubecost 產生一個漂亮的 UI,krr 產生 command line 報表

  • VPA 需要 helm install,並且會需要 cluster 權限

  • VPA 可以做到自動化調整,邏輯更複雜,有侵入性,設定有問題會出事

剛上手的做法

沒時間細部研究研究元件的行為,直接調整 request 與 limit

  • 先調降 request,不動 limit,對服務衝擊較小
  • 用抓比例的方式動態調整,例如目前 request 距離 p99 request 差距 1000Mi,你先收 500Mi 回來試個水溫
  • p99 直接使用 tool 計算,細節在後面
  • 測試環境先行,有信心在上 production

小結

  • 收集目前資源使用資料
  • 轉化成公有雲的成本
  • 透過 tool 建議適當的資源
  • 根據服務品質的要求,調降 cpu / memory
  • 回頭檢查 SLO 是否有受到影響

HPA

  • k8s/horizontal-pod-autoscale
  • 使用 HPA 在成本精簡的意義:因為外部因素改變負載的元件
  • 低負載時不要開太多,高負載時自動加開 pod

HPA: 考量

元件是否能夠水平拓展

  • 啟動的 liveness check / readiness check
  • laod balancer
  • 需要持續調整 scale up / down 的條件與 time windows
  • scale up 對依賴服務的 loading 會有影響 ex. 後面的 db
  • 退場機制,要如何安全的中斷連線,紀錄 state

VPA

Saving Plan / RI

  • AWS Saving Plan / RI
  • GCP Committed Use Discount
  • Azure Reservation

Spot Instance

Spot Instance

Spot Instance: 分類 workload

interruption 直接影響服務品質的就不宜

不影響服務品質的

  • stateless
  • batch job
  • 將 worklaod 從 monolithic 拆分成小的 batch job
  • 測試環境 dev / stag
  • CI/CD

小結

  • krr 工具調整資源
  • HPA 做水平擴展
  • VPA 自動化調整資源
  • saving plan / RI 長期合約打七折
  • spot instance 打一折

展望

  • cost awareness development
  • find-grade optimization
  • automation

小結

  • cpu / memory
  • 監測是基礎
  • 依據監測做預測
  • 開始調整
  • 長期合約打七折
  • spot instance 打一折
  • HPA / VPA

感謝

  • presentation and speaker notes chechia.net

  • Maicoin 職缺

  • 公司福利不錯,業務成長中,想一起共事,歡迎找我聊