雲端K8s省錢工程

Che Chia Chang

關於我

大綱

  • 公有雲的費用
  • 節省算力成本
  • 監控是成本控管的基礎
  • 導入成本分析與預測工具
  • 自動化資源使用建議
  • Saving Plan/Committed Usage
  • Spot Instance 與微服務
  • Autoscaling: HPA / VPA
  • Q&A

動機

  • 公司希望賺錢,節省成本
  • 團隊希望控制成本
  • 個人產生 Credit 與團隊 Impact

公有雲的費用

打開公有雲的 billing

  • 算力成本 Compute Resource (cpu, memory)
  • 儲存成本 Storage (Disk, EBS, S3…)
  • 網路 Networking

今天只會講這個算力成本

  • 算力成本 Compute Resource (cpu, memory)
  • 今天只會講這個

算力成本

網頁服務的微服務系統,都需要算力

  • api server
  • cronjob
  • business logic job
  • 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 使用量
  • 依據元件負載特性,選擇適當的調降方式

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 監控是成本控管的基礎

  • 監測是成本控管的基礎
  • 沒有監測就沒有 p99 cpu time / memory usage,也沒有 SLI/SLO
  • 沒有檢測下做成本精簡,會碰壞服務
  • 如果沒有監測先補檢測

監測:調整前設定目標基準線

  • 設定節省目標:ex. 過去 3 個月的 p99 資源用量
    • 99% 的時間,memory 使用量都在這條線以下
    • 99% 的時間,cpu throttling 在這條線以下
  • 多餘的算力 = (分配的 resource - p99)
  • 那如果我們把 cpu / memory 降低到 p99 / p99.9 服務品質會受到影響嗎?

監測: 調整後

  • 資源用量是否有變化
  • 確定沒有改壞東西,有壞要有及時的 alert
  • 效能表現:有可能沒壞,但是變很慢

推薦監測工具

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

導入成本分析與預測工具

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

成本分析

成本分析:公有雲 billing

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

成本分析: 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

推薦工具

推薦工具: Kubecost / Opencost Savings

  • 設定 target utilization
    • request / allocatable
    • dev 80%+
    • prod 60%

推薦工具: KRR

推薦工具: 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

推薦工具: KRR

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

推薦工具: VPA recommendator

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

推薦工具: 比較

  • 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 Saving Plan / Reservation

Spot Instance

Spot Instance

Spot Instance: 如何開始

重啟不影響服務品質的

  • 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 職缺

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