EKS集群中Prometheus抓取Kubelet返回HTTP 400错误的原因咨询
先确认错误日志:
ts=2022-11-14T19:42:49.643418574Z caller=scrape.go:1302 level=debug agent=prometheus instance=6adb012c62a4c8a8139b7fbf04a08668 component="scrape manager" scrape_pool=integrations/kubernetes/kubelet target=http://kubernetes.default.svc.cluster.local:443/api/v1/nodes/ip-192-168-0-8.ec2.internal/proxy/metrics msg="Scrape failed" err="server returned HTTP status 400 Bad Request"
针对这个错误,常见的排查方向如下:
协议与端口不匹配:你用
http://访问了443端口,而Kubelet的metrics端点默认使用HTTPS协议。HTTP请求发送到HTTPS端口会被Kubelet直接拒绝,返回400错误。需要将抓取URL中的http替换为https。节点名称或路径错误:检查URL中的节点名称
ip-192-168-0-8.ec2.internal是否和EKS集群中实际存在的节点名称完全一致。如果节点名称拼写错误,Kubernetes API Server无法正确代理请求到目标Kubelet,会返回400错误。缺少必要的认证权限:EKS中Kubelet默认启用了认证机制,Grafana Agent使用的ServiceAccount需要具备访问
nodes/proxy和nodes/metrics资源的权限。检查绑定到Agent ServiceAccount的ClusterRole是否包含以下规则:rules: - apiGroups: [""] resources: ["nodes/proxy", "nodes/metrics"] verbs: ["get"]权限不足时,API Server可能返回400或403错误(部分场景下会表现为400)。
Kubelet的metrics配置问题:检查Kubelet的启动参数,确认
--enable-metrics=true(默认开启),以及是否存在--allow-privileged等可能影响端点访问的参数。另外,部分Kubelet版本可能需要指定具体的metrics子路径(比如/metrics/cadvisor、/metrics/probes),直接访问/metrics可能触发格式错误。请求头部缺失:Kubelet的metrics接口可能需要特定的请求头部,比如
Accept: application/json或Accept: text/plain。如果Grafana Agent的抓取配置中没有设置正确的头部,可能会被Kubelet拒绝。
内容的提问来源于stack exchange,提问作者Pavel Zagalsky

