Kubernetes与Prometheus无法对接Grafana问题求助
先从最基础的环节开始排查吧——毕竟你是单master无worker节点的集群,组件的调度、运行状态本身就有特殊情况,很多问题都出在这里。
1. 先确认Prometheus本身是否正常工作
如果Prometheus都没跑起来或者没采集到K8s指标,Grafana肯定拿不到数据:
检查Prometheus Pod状态:
先看看Pod是不是都处于Running状态,有没有崩溃或Pending的情况:kubectl get pods -n monitoring # 换成你实际安装Prometheus的命名空间如果是Pending状态,大概率是master节点的默认污点(
node-role.kubernetes.io/master:NoSchedule)导致的——默认情况下master不允许普通Pod调度。你得检查Prometheus的Deployment/StatefulSet有没有配置容忍这个污点:kubectl get deployment prometheus-server -n monitoring -o yaml | grep -A 10 tolerations如果没有相关配置,要在你的自定义YAML里加上:
tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule"同时还要确认Pod的
nodeSelector没有限制只能跑在worker节点。验证Prometheus服务的可访问性:
先找到Prometheus的Service,然后用端口转发测试本地能不能访问:kubectl get svc -n monitoring kubectl port-forward svc/prometheus-server 9090:80 -n monitoring打开
http://localhost:9090,进入Status -> Targets页面,看看K8s相关的采集目标(比如node-exporter、kube-state-metrics)是不是Up状态。如果这些目标是Down,那就是Prometheus根本没采集到K8s指标,得先解决这个。
2. 检查Grafana的数据源配置是否正确
你安装的Kubernetes监控仪表盘,核心是要正确关联Prometheus数据源:
- 登录Grafana(
http://localhost:3000),进入Configuration -> Data sources,确认已经添加了Prometheus数据源:- 数据源的URL要填Prometheus的集群内访问地址,比如
http://prometheus-server.monitoring.svc.cluster.local:80(根据你的命名空间调整) - 点击
Save & Test,看是否提示成功。如果失败,就去Grafana Pod里测试网络连通性:
要是不通,可能是命名空间错了、Service名称不对,或者有网络策略限制了流量。kubectl exec -it <你的grafana-pod名称> -n <grafana命名空间> -- curl http://prometheus-server.monitoring.svc.cluster.local:80
- 数据源的URL要填Prometheus的集群内访问地址,比如
3. 核对Helm安装Prometheus的自定义YAML
你用了教程里的自定义配置,很可能是某个组件被禁用或者配置错了:
确认kube-state-metrics是否安装:这个组件专门采集K8s资源(Pod、Deployment等)的指标,绝大多数Kubernetes仪表盘都依赖它。检查它的Pod状态:
kubectl get pods -n monitoring | grep kube-state-metrics如果没有这个Pod,说明你的自定义YAML禁用了它,需要开启:
kubeStateMetrics: enabled: true确认node-exporter能在master节点运行:因为你没有worker,node-exporter必须跑在master上,同样要检查它的DaemonSet有没有容忍master污点:
kubectl get daemonset prometheus-node-exporter -n monitoring -o yaml | grep -A 10 tolerations没有的话,同样要在配置里加上对应的容忍规则。
4. 检查仪表盘的指标匹配度
有些旧的Kubernetes仪表盘,查询语句可能和新版本Prometheus/node-exporter的指标名不匹配:
- 找一个没有数据的面板,点击
Edit查看查询语句,然后去Prometheus UI里执行这个查询,看有没有返回结果。比如查询kube_pod_status_ready,如果Prometheus里没有这个指标,那就是kube-state-metrics没正常工作。
5. 日志排查兜底
如果上面都没问题,就去看日志找线索:
- Prometheus日志:
看有没有连接K8s API失败、无法访问kube-state-metrics之类的报错。kubectl logs <prometheus-pod名称> -n monitoring - Grafana日志:
看有没有数据源连接错误、仪表盘加载失败的信息。kubectl logs <grafana-pod名称> -n <grafana命名空间>
另外,单master节点要注意资源是否足够,用kubectl top node看看CPU、内存使用率,资源不足也会导致组件运行异常。
内容的提问来源于stack exchange,提问作者elektronet

