如何为EKS集群接近Pod上限配置CloudWatch告警?
EKS集群Pod上限接近告警设置及动态获取最大Pod数方案
一、设置CloudWatch告警的步骤
1. 确定集群最大Pod总容量
你当前通过ASG和实例规格计算的方式可行,若要动态获取可参考第二部分内容。无论哪种方式,先拿到集群最大Pod总数,作为告警阈值的基准。
2. 基于Container Insights创建运行中Pod数告警
你已使用的CloudWatch查询可直接用于构建告警:
SELECT SUM(node_number_of_running_pods) FROM SCHEMA(ContainerInsights, <你的集群名称>)
具体操作:
- 打开CloudWatch控制台,进入告警 > 创建告警
- 切换到查询标签,输入上述SQL并替换占位符为实际集群名
- 设置告警条件:比如当运行中Pod数超过总上限的90%时触发
- 配置通知:关联SNS主题,设置邮件、短信等通知渠道
- 完成告警创建
3. 进阶:百分比阈值告警(结合动态最大Pod数)
若后续实现动态获取最大Pod数,可使用CloudWatch Metric Math设置百分比告警,比如计算运行中Pod数 / 总最大Pod数 > 0.8,告警阈值会随集群节点扩缩容自动调整。
二、动态获取集群最大Pod数的方法
1. 直接通过Kubernetes API查询
每个Kubernetes节点的status.allocatable.pods字段是该节点支持的最大可调度Pod数,求和即可得到集群总上限,执行命令:
kubectl get nodes -o jsonpath='{.items[*].status.allocatable.pods}' | tr ' ' '\n' | awk '{sum+=$1} END {print sum}'
该数值由Kubernetes根据节点ENI配额、实例规格自动计算,与eni-max-pods.txt数值一致,且能实时反映节点变化(如新增节点后自动更新总和)。
2. 推送最大Pod数到CloudWatch作为自定义指标
编写脚本定期计算总最大Pod数并推送到CloudWatch,方便后续告警使用:
#!/bin/bash CLUSTER_NAME="你的集群名称" MAX_PODS=$(kubectl get nodes -o jsonpath='{.items[*].status.allocatable.pods}' | tr ' ' '\n' | awk '{sum+=$1} END {print sum}') aws cloudwatch put-metric-data \ --namespace "EKS/ClusterCapacity" \ --metric-name "TotalMaxPods" \ --value "$MAX_PODS" \ --dimensions "ClusterName=$CLUSTER_NAME"
将脚本部署为Kubernetes CronJob(比如每5分钟运行一次),即可自动更新CloudWatch中的最大Pod数指标。
3. 利用Prometheus指标(若已部署)
若你的EKS集群已部署Prometheus(如使用Amazon Managed Service for Prometheus),可直接查询sum(kube_node_status_allocatable_pods)得到集群总最大Pod数,结合sum(kube_pod_status_phase{phase="Running"})设置百分比告警。
内容的提问来源于stack exchange,提问作者maxisme
相关产品推荐
相关产品推荐

