Keda ScaledObject无法读取Prometheus指标问题排查求助
在Azure Kubernetes Service(AKS)3节点集群中,使用Keda ScaledObject结合Prometheus触发器实现水平Pod扩缩容时遇到异常:Prometheus已成功抓取到.NET应用暴露的hs_ready_readiness指标,但Keda无法读取该指标。查看HorizontalPodAutoscaler时显示ScalingActive为False,报错为无法从外部指标API获取指标,出现流错误INTERNAL_ERROR。
环境与操作详情
- AKS集群信息:
kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME aks-nodepool1-42472506-vmss00000l Ready agent 39m v1.24.9 10.224.0.4 <none> Ubuntu 18.04.6 LTS 5.4.0-1104-azure containerd://1.6.18+azure-1 aks-nodepool1-42472506-vmss00000m Ready agent 39m v1.24.9 10.224.0.6 <none> Ubuntu 18.04.6 LTS 5.4.0-1104-azure containerd://1.6.18+azure-1 aks-nodepool1-42472506-vmss00000n Ready agent 39m v1.24.9 10.224.0.5 <none> Ubuntu 18.04.6 LTS 5.4.0-1104-azure containerd://1.6.18+azure-1
.NET应用部署:通过deployment.yaml和service.yaml完成部署,已配置镜像拉取密钥与ConfigMap挂载。
Prometheus部署与配置:通过kube-prometheus安装Prometheus Operator,创建了Prometheus实例与ServiceMonitor,确认Prometheus可正常抓取到
hs_ready_readiness指标。Keda安装:通过Helm完成Keda安装,所有组件运行状态正常。
ScaledObject配置:
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: prometheus-scaledobject namespace: default spec: scaleTargetRef: name: servant-deploy triggers: - type: prometheus metadata: serverAddress: http://prometheus-operated.monitoring.svc.cluster.local:80 metricName: hs_ready_readiness threshold: '1' query: hs_ready_readiness
- 报错信息:
kubectl describe horizontalpodautoscaler.autoscaling/keda-hpa-prometheus-scaledobject Type Status Reason Message ---- ------ ------ ------- AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale ScalingActive False FailedGetExternalMetric the HPA was unable to compute the replica count: unable to get external metric default/s0-prometheus-hs_ready_readiness/&LabelSelector{MatchLabels:map[string]string{scaledobject.keda.sh/name: prometheus-scaledobject,},MatchExpressions:[]LabelSelectorRequirement{},}: unable to fetch metrics from external metrics API: Get "https://hcp-kubernetes.6416bc6ff2dbef0001660539.svc.cluster.local:443/apis/external.metrics.k8s.io/v1beta1/namespaces/default/s0-prometheus-hs_ready_readiness?labelSelector=scaledobject.keda.sh%!F(MISSING)name%!D(MISSING)prometheus-scaledobject": stream error: stream ID 29285; INTERNAL_ERROR; received from peer
排查方向与解决方案建议
1. 验证Keda与Prometheus的网络连通性
在Keda Operator Pod内部执行curl命令,测试能否正常访问Prometheus并获取指标:
kubectl exec -it <keda-operator-pod-name> -n keda -- curl http://prometheus-operated.monitoring.svc.cluster.local:80/api/v1/query?query=hs_ready_readiness
若无法返回指标数据,检查集群网络策略、Prometheus Service的标签选择器是否配置正确。
2. 修正ScaledObject的Prometheus查询语句
当前查询未做聚合,Keda需要单个数值作为扩缩容依据,建议修改为聚合后的查询,例如:
query: sum(hs_ready_readiness{pod=~"servant-deploy-.*"})
可根据实际标签筛选后使用sum/avg等聚合函数,确保返回单个数值而非多实例指标集合。
3. 查看Keda Operator日志获取详细错误
执行命令查看Keda Operator的日志,定位具体错误原因:
kubectl logs -n keda deployment/keda-operator
若Prometheus启用了认证,需在ScaledObject的Prometheus触发器配置中添加authToken或tlsConfig相关参数。
4. 检查AKS HCP相关配置
报错中出现hcp-kubernetes域名,确认集群是否启用Azure HCP服务,检查API网关/代理是否允许Keda的外部指标API请求通过,排查是否存在TLS证书失效或不匹配导致的流错误。
5. 验证版本兼容性
- 确认Keda版本与AKS集群版本(v1.24.9)是否兼容,Keda 2.x对Kubernetes 1.24+的支持情况,必要时调整Keda版本。
- 检查Prometheus Operator版本与Keda Prometheus触发器的兼容性。
内容的提问来源于stack exchange,提问作者Arvinder

