跳轉到

AWS EKS CloudWatch 成本優化完整執行流程:Log Retention + 停用 Fluent Bit + 精簡 Pod/Container Metrics

文檔資訊

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

摘要

針對 3 個 EKS 叢集(locust-eks、ps-eks、ps-eks-prod)執行 CloudWatch 成本優化:批次設定所有 log group 為 7 天 retention、透過 addon 設定停用 Fluent Bit DaemonSet、並關閉 container/pod 層級的細粒度 Metrics,僅保留 service/namespace/node/cluster 層級。

關鍵學習

  • 驗證 log retention 設定:aws logs describe-log-groups 搭配 --query 快速列表確認

  • 停用 Fluent Bit 的正確方式是透過 EKS addon 設定 containerLogs.enabled=false,而非手動刪除 DaemonSet

  • 關閉 container/pod metrics 使用 disable_metric_extraction 設定,不影響 node/cluster 層級監控

  • 自動化工具應支援 --dry-run 模式,先預覽再執行,避免誤操作生產環境

  • addon 更新後用 aws eks describe-addon --query addon.status 追蹤進度,並用 kubectl get ds 確認 DaemonSet 消失

技術細節

amazon-cloudwatch-observability addon 的 configuration-values 支援三個關鍵設定: 1. containerLogs.enabled=false → 停用 Fluent Bit DaemonSet 2. agent.config.logs.metrics_collected.kubernetes.enhanced_container_insights=true → 啟用增強版 Container Insights 3. agent.config.logs.metrics_collected.kubernetes.disable_metric_extraction.container/pod=true → 關閉 container/pod 層級 metrics

Log groups 命名規則:/aws/containerinsights/{cluster-name}/{application|dataplane|host|performance}

What Changed

對 locust-eks、ps-eks、ps-eks-prod 共 12 個 CloudWatch log groups 設定 7 天 retention policy(原本無 retention),並透過 cloudwatch-cost-optimize.sh 自動化工具執行兩個 addon 更新:停用 Fluent Bit 日誌收集,以及關閉 container/pod 層級細粒度 metrics。工具支援 --dry-run 模式預覽變更。

So What

CloudWatch 是 AWS 費用的主要來源之一,EKS Container Insights 預設收集大量 container/pod 層級 metrics 和所有應用日誌,在不需要細粒度監控的環境(如 dev/staging)可大幅降低費用。此流程可複製到其他 EKS 叢集。

Trade-offs

優點:大幅降低 CloudWatch 費用,保留 node/cluster 層級監控能力,可隨時重新啟用 缺點:停用 Fluent Bit 後無法透過 CloudWatch 查看 container logs;關閉 container/pod metrics 後無法做 container 層級的資源監控和告警 適用場景:非生產環境、或已有其他 log/metrics 方案(如 Prometheus + Grafana、Datadog)的環境

Try It Fast

# 1. 批次設定 Log Retention(所有 log groups 設為 7 天)
for lg in $(aws logs describe-log-groups --log-group-name-prefix /aws/containerinsights/ --query 'logGroups[].logGroupName' --output text); do
  aws logs put-retention-policy --log-group-name $lg --retention-in-days 7
done
# 2. 確認設定
aws logs describe-log-groups --log-group-name-prefix /aws/containerinsights/ \
  --query 'logGroups[].{Name:logGroupName,RetentionDays:retentionInDays}' --output table
# 3. 停用 Fluent Bit + 關閉 container/pod metrics(dry-run)
CLUSTER=locust-eks
CONFIG='{"containerLogs":{"enabled":false},"agent":{"config":{"logs":{"metrics_collected":{"kubernetes":{"enhanced_container_insights":true,"accelerated_compute_metrics":false,"disable_metric_extraction":{"container":true,"pod":true}}}}}}}'
echo "Will apply: $CONFIG"
# 4. 實際執行
aws eks update-addon --cluster-name $CLUSTER \
  --addon-name amazon-cloudwatch-observability \
  --configuration-values "$CONFIG" \
  --region ap-southeast-1 \
  --resolve-conflicts OVERWRITE
# 5. 確認 addon 狀態
aws eks describe-addon --cluster-name $CLUSTER \
  --addon-name amazon-cloudwatch-observability \
  --query 'addon.status'

Recommendation

Priority 1 — 執行前驗證

  1. 先執行 --dry-run — 確認設定正確再實際執行
  2. 生產環境審慎評估 — ps-eks-prod 謹慎評估是否停用 Fluent Bit,確認有其他日誌方案

Priority 2 — 部署後觀察

  1. 觀察費用變化 — 停用後觀察 7-14 天,確認 CloudWatch 費用下降符合預期
  2. 保留基本可觀測性 — 保留 node/cluster 層級 metrics 以維持基本監控能力

Priority 3 — 確認生效

  1. 驗證 DaemonSet 消失 — 設定後用 kubectl get ds -n amazon-cloudwatch 確認 fluent-bit DaemonSet 確實消失

本文檔由 Semi-Brain 自動生成

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

分析信心度: 92%