为何Keda的HPA在AWS EKS中无法采集CPU/内存指标?
解决Keda+HPA基于CPU/内存扩缩容失败的问题
我们团队部署Keda后,原本想同时基于Redis队列长度、CPU和内存利用率实现Kubernetes Pod的水平自动扩缩容,但遇到了一系列问题:
- ArgoCD里的水平Pod自动扩缩器(HPA)报错:
unable to get metrics for resource memory: unable to fetch metrics from resource metrics API: the server could not find the requested resource (get pods.metrics.k8s.io) - 执行
kubectl get --raw "/apis/metrics.k8s.io/v1beta1"返回Error from server (NotFound): the server could not find the requested resource - 运行
kubectl top nodes提示error: Metrics API not available - 当CPU/内存利用率达到预设阈值时,Pod完全没触发扩缩容,但Redis队列长度触发的扩缩容却正常工作。
问题根源
Keda实现Redis队列扩缩容用的是外部指标(External Metrics),不依赖Kubernetes内置的资源指标API;但CPU、内存属于资源指标(Resource Metrics),必须依赖metrics-server提供的metrics.k8s.io API服务。当前集群缺少这个组件,导致HPA拿不到CPU/内存数据,自然无法触发扩缩。
解决步骤
1. 检查集群是否已安装metrics-server
先确认集群里有没有metrics-server:
kubectl get deployment metrics-server -n kube-system
如果返回NotFound,说明没安装,继续下一步部署。
2. 部署metrics-server
根据你的集群环境选一种方式部署:
- 通用K8s集群:用官方Manifest部署
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml - AWS EKS集群:用eksctl快速部署
eksctl utils install-metrics-server --cluster <你的集群名称> --region <集群所在区域>
3. 验证metrics-server运行状态
- 检查Pod是否正常启动:
确保所有Pod都处于kubectl get pods -n kube-system -l k8s-app=metrics-serverRunning状态。 - 验证指标API是否可用:
能返回包含kubectl get --raw "/apis/metrics.k8s.io/v1beta1"NodeMetrics和PodMetrics的JSON数据就算正常。 - 测试
kubectl top命令:
能正常显示节点和Pod的CPU、内存使用率,说明metrics-server工作正常。kubectl top nodes kubectl top pods
4. 验证HPA功能
最后检查HPA的状态:
kubectl get hpa
观察TARGETS列,原本的<unknown>应该会变成实际的CPU/内存使用率数值。之后当CPU/内存达到阈值时,HPA就会自动触发Pod的扩缩容了。
内容的提问来源于stack exchange,提问作者Byron Lagrone
相关产品推荐
相关产品推荐

