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
Recommendation¶
Priority 1 — 執行順序與驗證¶
- 按順序執行 — retention -> disable-logs -> disable-metrics -> verify
- 每步先 dry-run — 每個步驟先加
--dry-run確認 JSON config 後再執行
Priority 2 — 生產環境注意事項¶
- Production 保守策略 — Production cluster 建議僅設定 retention,不停用 Fluent Bit
- 等待 Addon 就緒 — Addon 更新需 2-5 分鐘,執行後用
describe-addon --query 'addon.status'確認回到ACTIVE再做下一步
Priority 3 — 確認生效¶
- 驗證 Fluent Bit 停用 —
kubectl get ds -n amazon-cloudwatch,fluent-bit 應消失或 NotFound