跳轉到

AWS EKS CloudWatch 成本優化:自動化工具執行完整流程

文檔資訊

  • 分類: tools
  • 難度: intermediate
  • 預估閱讀時間: 8 分鐘
  • 標籤: aws, eks, cloudwatch, cost-optimization, fluent-bit, log-retention, container-insights, shell-script, devops

摘要

在 3 個 EKS cluster(locust-eks、ps-eks、ps-eks-prod)上完整執行 CloudWatch 成本優化:批次設定所有 log group retention 為 7 天、透過自製 cloudwatch-cost-optimize.sh 工具停用 Fluent Bit(containerLogs.enabled=false)、並精簡 metrics 只保留 Service/Namespace/Node/Cluster 層級(關閉 Container/Pod level),最終 verify 確認全部生效。

關鍵學習

  • cloudwatch-cost-optimize.sh 工具支援 addon-schema / disable-logs / disable-metrics / verify 四個子命令

  • disable-logs 透過 addon configuration 設定 containerLogs.enabled=false 停用 Fluent Bit DaemonSet

  • disable-metrics 使用 disable_metric_extraction.container=true + pod=true 精簡 metrics,保留 Node/Cluster 層級

  • 所有操作支援 --dry-run 旗標,先確認 JSON config 正確再實際執行

  • verify 指令一次檢查所有 cluster 的 retention / addon config / DaemonSet 狀態

  • Log group retention 設定後立即生效,已存在的舊資料會在 7 天後自動清除

  • Fluent Bit 停用後 DaemonSet 從 kubectl get ds 中消失(NotFound)確認成功

技術細節

Addon 版本與設定方式

  • 版本:amazon-cloudwatch-observability addon v4.9.0 / v4.10.1
  • 設定方式:透過 aws eks update-addon --configuration-values 傳入 JSON
  • 關鍵 config 路徑agent.config.logs.metrics_collected.kubernetes.disable_metric_extraction

Addon 更新流程

  • 更新為**非同步**操作,status 會先變為 InProgress
  • 追蹤進度:aws eks describe-addon --query 'addon.status'

Cluster 切換

  • 使用 kubectx 切換 cluster context
  • 需確認 context 正確才能操作對應叢集的 kubectl 資源

What Changed

對 3 個 EKS cluster 執行全套 CloudWatch 成本優化:(1) 所有 /aws/containerinsights/*/ log group 設定 7 天 retention;(2) 透過 cloudwatch-cost-optimize.sh disable-logs 停用 Fluent Bit;(3) 透過 disable-metrics 關閉 Pod/Container 層級 metrics,保留 Node/Cluster 層級。

So What

這套流程可直接複製到其他 EKS 環境執行,腳本化操作降低人為失誤風險,dry-run 機制讓變更前可先預覽 JSON config,完整節省 CloudWatch Logs 儲存與自訂 metrics 的費用。

Trade-offs

停用 Fluent Bit 後無法從 CloudWatch Logs 查詢容器日誌,需確認是否有其他 log pipeline(如 stdout 轉 S3)。關閉 Pod/Container metrics 後無法在 CloudWatch 做 pod 層級的 CPU/Memory 監控,適用於非生產環境或已有其他監控(如 Prometheus)的環境。ps-eks-prod 僅設定 retention,未停用 Fluent Bit,說明 prod 環境可能需保留完整監控。

Try It Fast

# 1. 批次設定 retention
for cluster in locust-eks ps-eks ps-eks-prod; do
  for type in application performance dataplane host; do
    aws logs put-retention-policy \
      --log-group-name "/aws/containerinsights/${cluster}/${type}" \
      --retention-in-days 7
  done
done
# 2. 確認 retention 設定
aws logs describe-log-groups \
  --log-group-name-prefix /aws/containerinsights/ \
  --query 'logGroups[].{Name:logGroupName,RetentionDays:retentionInDays}' \
  --output table
# 3. 停用 Fluent Bit + 精簡 metrics(使用工具腳本)
./cloudwatch-cost-optimize.sh disable-metrics --cluster locust-eks --dry-run
./cloudwatch-cost-optimize.sh disable-metrics --cluster locust-eks
# 4. 驗證所有設定
./cloudwatch-cost-optimize.sh verify

Recommendation

Priority 1 — 執行順序與驗證

  1. 按順序執行 — retention -> disable-logs -> disable-metrics -> verify
  2. 每步先 dry-run — 每個步驟先加 --dry-run 確認 JSON config 後再執行

Priority 2 — 生產環境注意事項

  1. Production 保守策略 — Production cluster 建議僅設定 retention,不停用 Fluent Bit
  2. 等待 Addon 就緒 — Addon 更新需 2-5 分鐘,執行後用 describe-addon --query 'addon.status' 確認回到 ACTIVE 再做下一步

Priority 3 — 確認生效

  1. 驗證 Fluent Bit 停用kubectl get ds -n amazon-cloudwatch,fluent-bit 應消失或 NotFound

本文檔由 Semi-Brain 自動生成

Session ID: 423fd9da-802c-452a-8e2f-03de575f2126

分析信心度: 92%