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 — 執行前驗證¶
- 先執行 --dry-run — 確認設定正確再實際執行
- 生產環境審慎評估 — ps-eks-prod 謹慎評估是否停用 Fluent Bit,確認有其他日誌方案
Priority 2 — 部署後觀察¶
- 觀察費用變化 — 停用後觀察 7-14 天,確認 CloudWatch 費用下降符合預期
- 保留基本可觀測性 — 保留 node/cluster 層級 metrics 以維持基本監控能力
Priority 3 — 確認生效¶
- 驗證 DaemonSet 消失 — 設定後用
kubectl get ds -n amazon-cloudwatch確認 fluent-bit DaemonSet 確實消失