可昕之家

可昕之家

张先生

平淡如水,爱护家人,好好工作

48 文章数
0 评论数

promethus无法查看到springboot业务监控

张清磊
2025-03-18 / 0 评论 / 13 阅读 / 0 点赞

监控 Spring Boot 服务的故障排查与解决文档

问题背景

在 Kubernetes 集群中通过 kube-prometheus 部署 Prometheus 后,尝试监控一个 Spring Boot 服务时,发现 Prometheus 的 Targets 页面未显示监控目标。经过多次排查,最终发现问题的根本原因包括:

  1. 权限不足:Prometheus 的 ClusterRole 缺少必要的资源访问权限。
  2. 标签选择器错误:删除 Prometheus Pod 时使用了错误的标签。
  3. ServiceMonitor 配置问题:Service 与 ServiceMonitor 的标签和端口名称未正确匹配。

排查过程

1. 初步检查

  • ServiceMonitor 配置:确认 ServiceMonitornamespaceSelectorselector 与 Service 的标签匹配。
  • Service 配置:验证 Service 是否选择到正确的 Pod,并暴露了 /actuator/prometheus 端点。
  • 网络策略:检查目标命名空间是否存在限制 Prometheus 访问的 NetworkPolicy。

2. 权限问题排查

  • ClusterRole 权限不足:发现默认的 prometheus-k8s ClusterRole 缺少对 servicesendpointspodslistwatch 权限。
  • RoleBinding 未生效:修正 RoleBinding 后,发现权限仍未生效,最终确认是 ClusterRole 未正确更新。

kubectl auth can-i get services --as=system:serviceaccount:monitoring:prometheus-k8s -n 【需要监控的namescpace】

3. 重启 Prometheus

  • 标签选择器错误:尝试通过 app=prometheus 标签删除 Pod 时失败,因实际标签为 app.kubernetes.io/name=prometheus
  • 手动指定 Pod 名称:直接删除 Prometheus 的 StatefulSet Pod 以触发重启。

最终解决方案

1. 修正 ClusterRole 权限

更新 prometheus-k8s ClusterRole,添加对关键资源的访问权限:

yaml

复制

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus-k8s
  labels:
    app.kubernetes.io/component: prometheus
    app.kubernetes.io/instance: k8s
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 2.54.1
rules:
- apiGroups: [""]
  resources:
  - nodes
  - nodes/metrics
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  verbs: ["get"]
- nonResourceURLs: ["/metrics", "/metrics/slis"]
  verbs: ["get"]

2. 应用修正后的 ClusterRole

bash

复制

kubectl apply -f prometheus-clusterrole.yaml --force

3. 创建 RoleBinding

确保 Prometheus 的 ServiceAccount 有权访问目标命名空间:

yaml

复制

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: prometheus-k8s-epoch-test
  namespace: epoch-test
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus-k8s
subjects:
- kind: ServiceAccount
  name: prometheus-k8s
  namespace: monitoring

4. 修正 Service 和 ServiceMonitor 配置

Service 配置

yaml

复制

apiVersion: v1
kind: Service
metadata:
  name: kexin-module-system-test-svc
  namespace: epoch-test
  labels:
    project: epoch
    run: kexin-module-system-test
spec:
  selector:
    project: epoch
    run: kexin-module-system-test
  ports:
  - name: http-metrics
    port: 8080
    targetPort: 8080

ServiceMonitor 配置

yaml

复制

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: kexin-module-system-test-monitor
  namespace: monitoring
spec:
  endpoints:
  - port: http-metrics
    path: /actuator/prometheus
    interval: 15s
  selector:
    matchLabels:
      project: epoch
      run: kexin-module-system-test
  namespaceSelector:
    matchNames:
    - epoch-test

5. 重启 Prometheus

使用正确的标签选择器删除 Pod:

kubectl delete pod -n monitoring -l app.kubernetes.io/name=prometheus

验证步骤

  1. 检查 Prometheus Targets
    bash

    复制

    kubectl port-forward svc/prometheus-k8s -n monitoring 9090:9090
    

    访问 http://localhost:9090/targets,确认目标状态为 UP

  2. 验证权限
    bash

    复制

    kubectl auth can-i get services --as=system:serviceaccount:monitoring:prometheus-k8s -n epoch-test
    
  3. 检查 Endpoints
    bash

    复制

    kubectl get endpoints -n epoch-test kexin-module-system-test-svc
    

常见问题总结

问题类型 解决方法
权限不足 更新 ClusterRole,添加servicesendpointspodslist/watch 权限
标签不匹配 使用app.kubernetes.io/name=prometheus 替代 app=prometheus
ServiceMonitor 未生效 确保 Service 的端口名称与 ServiceMonitor 的endpoints.port 一致
网络策略限制 允许来自monitoring 命名空间的流量

最终效果

  • Prometheus 能够自动发现 Spring Boot 服务的监控目标。
  • Targets 页面显示状态为 UP,指标数据正常采集。
  • Grafana 仪表盘可正常展示 JVM 内存、线程池等监控数据。

附录

  • kube-prometheus 版本:0.14.0
  • Prometheus 版本:2.54.1
  • Spring Boot 监控依赖micrometer-registry-prometheus
上一篇 下一篇
评论
最新回复
    暂无内容
光阴似箭
今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月
文章目录
今日天气