AWS EKS中K8s托管Auto Scaling Group指标收集的Terraform启用方法及节点池耗尽告警替代方案
我们在AWS EKS环境中管理Kubernetes集群,集群依赖的Auto Scaling Group(ASG)是由EKS托管创建的,并非我们手动部署。这导致ASG的**指标收集功能(enable autoscaling group metrics collection)**默认未开启,但我们需要收集GroupInServiceInstances和GroupMaxSize这两个指标,目的是在节点池耗尽(即GroupInServiceInstances等于GroupMaxSize)时配置告警。
现在有两个问题想请教:
- 除了手动在AWS控制台操作外,能否通过Terraform启用这个托管ASG的指标收集功能?
- 如果Terraform的方法行不通,有没有K8s层面可获取的指标,能用来告警底层EKS托管ASG已经达到扩容上限的情况?
问题1:用Terraform启用托管ASG的指标收集
当然可以实现,不过要注意:EKS托管的ASG是通过aws_eks_node_group资源创建的,Terraform本身没法直接在这个节点组资源里配置ASG指标,但我们可以通过数据源先拿到托管ASG的信息,再配合aws_autoscaling_group资源来开启指标收集。
具体操作步骤如下:
- 先用
data "aws_eks_node_group"获取EKS节点组对应的ASG名称; - 引用这个已存在的ASG,添加
metric_collection块开启所需指标,同时必须用lifecycle.ignore_changes忽略EKS托管管理的ASG配置,避免Terraform尝试修改这些托管字段导致冲突。
给你个示例代码参考:
# 第一步:获取EKS托管节点组的ASG信息 data "aws_eks_node_group" "my_eks_node_group" { cluster_name = "your-eks-cluster-name" node_group_name = "your-managed-node-group-name" } # 第二步:配置已有ASG的指标收集 resource "aws_autoscaling_group" "managed_asg" { name = data.aws_eks_node_group.my_eks_node_group.autoscaling_groups[0].name # 开启需要的ASG指标收集 metric_collection { enabled = true metrics = ["GroupInServiceInstances", "GroupMaxSize"] granularity = "1Minute" } # 关键:忽略EKS托管的ASG配置,防止Terraform误改 lifecycle { ignore_changes = [ min_size, max_size, desired_capacity, vpc_zone_identifier, launch_template, # 可根据实际情况添加其他ASG原生配置项 ] } }
⚠️ 注意:执行前一定要先运行terraform plan确认,确保只有metric_collection相关配置会被修改,避免意外变更托管ASG的其他关键配置。
问题2:K8s层面的替代指标方案
如果Terraform的方案因为权限或者ASG锁定等原因没法落地,你可以通过K8s原生指标或Cluster Autoscaler的指标间接判断节点池是否达上限:
1. 用K8s原生节点指标
kube_node_status_condition:关注condition="Ready"的节点数量,结合你已知的节点池最大容量(可从EKS节点组的maxSize配置、Terraform输出或EKS API查询获取),当就绪节点数等于最大容量时触发告警;kube_cluster_status_node_count:这个指标是当前集群的总节点数,同样和节点池最大容量对比即可。
2. 用Cluster Autoscaler的指标
如果你的EKS集群已经启用了Cluster Autoscaler,它会暴露专门的扩容相关指标:
cluster_autoscaler_cluster_max_node_count:集群的最大节点数;cluster_autoscaler_cluster_current_node_count:当前节点数;cluster_autoscaler_scale_up_failed_total:扩容失败的累计次数。当节点池达到上限时,Cluster Autoscaler会尝试扩容但失败,这个指标会持续增长,结合它也能实现告警。
3. 自定义指标采集
如果上面的指标都不够直接,你可以写个简单的脚本(比如用Python+boto3)调用AWS API获取ASG的GroupInServiceInstances和GroupMaxSize,将这些指标暴露为Prometheus可采集的格式,再部署成K8s的Deployment或DaemonSet,最后在Prometheus中配置告警规则即可。
内容的提问来源于stack exchange,提问作者AlRal

