当前位置: 首页 > news >正文

Spring Boot × K8s 监控实战-集成 Prometheus 与 Grafana

在微服务架构中,应用的可观测性至关重要。Kubernetes 已成为容器化部署的标准,但其自身的监控能力有限,需要与其他工具集成才能实现详细的运行数据采集与分析。

本文将通过 Spring Boot + Kubernetes + Prometheus + Grafana 实战,打造一套高效监控体系,实现“数据采集 → 存储 → 分析 → 可视化”的完整流程。

相关工具简介:

• Kubernetes(K8S):容器化应用的部署与管理平台,其自带的监控能力较为基础。

• Prometheus:开源的云原生监控系统,拉取(pull)Spring Boot Actuator 暴露的监控数据,并提供强大的查询与分析。

• Grafana:可视化工具,将 Prometheus 数据呈现为直观的仪表盘,帮助开发和运维人员实时监控应用状态。

一、搭建监控基础

1.1 配置 Spring Boot 集成 Prometheus

Spring Boot 可以集成 Prometheus,具体步骤如下。

步骤 1:添加必要的依赖

在pom.xml中添加以下依赖:

<!-- Actuator 依赖:提供应用的管理和监控端点 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency><!-- Prometheus 依赖:支持 Prometheus 采集监控数据 -->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

解析:

Spring Boot Actuator 提供应用运行状态的管理端点,如:

• /actuator/health:应用健康检查

• /actuator/metrics:应用度量指标

• /actuator/prometheus:提供 Prometheus 可抓取的监控数据

Prometheus:

• 以定时抓取(pull模式) 的方式,从指定的 HTTP 端点获取监控数据。

• 默认会读取/actuator/prometheus端点的数据,并存储、分析、提供查询功能。

步骤 2:启用 Prometheus 端点

在application.properties或application.yml中配置 Actuator 端点:

management:endpoints:web:exposure:include: health,metrics,prometheus

这样,/actuator/prometheus端点会暴露,Prometheus 可以抓取该数据。

解析

• 指示 Spring Boot仅暴露health、metrics和prometheus三个管理端点,避免暴露过多无关信息。

• health 端点 是默认启动端点,无需再显示开启。

1.2 Kubernetes 中配置监控

将 Spring Boot 应用部署到 Kubernetes 时,需要确保 Prometheus 能抓取到应用的监控数据。

步骤1:安装Prometheus

使用 Helm 在 Kubernetes 集群中安装 Prometheus Operator:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack

说明:

• helm install prometheus prometheus-community/kube-prometheus-stack:安装 Prometheus 及相关组件,如 Grafana、Alertmanager。

• 默认情况下,Prometheus 会自动发现 Kubernetes 中的 Pod、Service 进行监控,但我们仍需确保 Spring Boot 应用的监控端点可被 Prometheus 访问。

步骤2:创建 Service公开监控端点

创建 KubernetesService文件,并指定要暴露的端口,确保 Prometheus 可以访问/actuator/prometheus端点。

在service.yaml 中配置:

apiVersion: v1
kind: Service
metadata:name: spring-boot-app
spec:ports:- port: 8080targetPort: 8080name: httpselector:app: spring-boot

应用该配置:

kubectl apply -f service.yaml

说明:

• spring-boot-app是Service的名称,它映射到了 Spring Boot 应用的 8080 端口。

• Prometheus 会通过spring-boot-app.default.svc.cluster.local:8080访问应用的/actuator/prometheus端点。这是 Kubernetes 中的 DNS 服务自动解析的规则。

1.3 Prometheus 配置抓取数据

在 Kubernetes 集群中,修改 Prometheus 配置,使其能够定期抓取 Spring Boot 应用的监控数据。

步骤1:配置 Prometheus

1.在 Prometheus 配置目录(如果使用helm安装,则ConfigMap可能已默认配置)下,创建prometheus-config.yaml,内容如下:

apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: monitoring
data:prometheus.yml: |global:scrape_interval: 15s  # 每 15 秒抓取一次数据scrape_configs:- job_name: 'spring-boot-app'metrics_path: '/actuator/prometheus'static_configs:- targets: ['spring-boot-app.default.svc.cluster.local:8080']

2.部署ConfigMap到 Kubernetes 集群:

kubectl apply -f prometheus-config.yaml

说明:

• 该ConfigMap将被 Prometheus 读取,指定抓取 Spring Boot 应用的监控数据。

• scrape_interval: 15s表示 Prometheus 每 15 秒抓取一次监控数据。

步骤2:在 Prometheus 部署中加载 ConfigMap

1.修改 Prometheus 的Deployment文件(如果使用 Helm 安装,则需要修改values.yaml配置文件):

apiVersion: apps/v1
kind: Deployment
metadata:name: prometheusnamespace: monitoring
spec:template:spec:volumes:- name: prometheus-config-volumeconfigMap:name: prometheus-configcontainers:- name: prometheusimage: prom/prometheusvolumeMounts:- name: prometheus-config-volumemountPath: /etc/prometheussubPath: prometheus.yml

2.应用修改后的配置:

kubectl apply -f prometheus-deployment.yaml

1.4 验证 Prometheus配置

部署完成后,访问 Prometheus Web UI(默认端口9090):

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

在浏览器打开http://localhost:9090,进入Targets页面,查看spring-boot-app是否在UP状态。

总结

1.Prometheus 安装:使用 Helm 在 Kubernetes 集群中安装kube-prometheus-stack。

2.Service 创建:在 Spring Boot 应用的k8s部署文件夹下创建service.yaml并部署到 Kubernetes。

3.Prometheus 配置:

• 在 Kubernetes 中创建ConfigMap,配置 Prometheus 采集 Spring Boot/actuator/prometheus数据。

• 在 PrometheusDeployment中挂载ConfigMap,确保 Prometheus 正确加载配置。

4.验证监控是否生效:使用kubectl port-forward访问 Prometheus Web UI,确认监控数据是否正常抓取。

二、集成 Grafana可视化

2.1 配置 Grafana

使用 Helm 安装 Grafana:

helm install grafana stable/grafana

访问 Grafana 控制台(默认用户名和密码为admin):

http://<grafana-service-ip>:3000

2.2 配置 Prometheus 数据源

在 Grafana 控制台中配置 Prometheus 为数据源,URL 为:

http://prometheus-server:80

确认连接成功后,Grafana 就可以从 Prometheus 中获取监控数据。

2.3 创建监控面板

在 Grafana 中,选择 Prometheus 数据源,并根据需要创建监控面板。常见监控指标包括 JVM 内存使用、请求响应时间、系统负载、自定义业务指标等。

三、Spring Boot 应用部署到 Kubernetes

3.1 Spring Boot 应用目录结构

通常在 Spring Boot 项目中,会有应用代码和配置,以及部署相关文件,推荐的目录结构如下:

springboot-app/
│── src/                      # Spring Boot 代码
│── pom.xml 或 build.gradle   # 依赖管理
│── Dockerfile                # 构建 Docker 镜像
│── config/                   # 应用配置(如 application.yml)
│── deployment/               # K8s 部署文件
│   ├── deployment.yaml       # Deployment 资源
│   ├── service.yaml          # Service 资源
│   ├── configmap.yaml        # 可选的 ConfigMap 资源
│   ├── ingress.yaml          # 可选的 Ingress 资源

其中:

• Dockerfile:用于构建 Spring Boot 容器镜像。

• deployment/ 目录:存放 Kubernetes 相关的 YAML 配置文件,用于部署、服务等。

如下是应用部署到K8S 的步骤:

3.2 创建 Docker 镜像

在将 Spring Boot 应用部署到 Kubernetes 前,需要构建 Docker 镜像。在项目根目录下创建Dockerfile:

步骤1:创建 Docker 镜像

# 使用官方的 OpenJDK 镜像作为基础镜像
FROM openjdk:17-jdk-alpine# 设置工作目录
WORKDIR /app# 将 Spring Boot 构建的 JAR 文件复制到容器中
COPY target/myapp.jar app.jar# 设置容器启动时运行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

解析:

1.FROM openjdk:11-jre-slim: 选择一个基础的 Java 镜像。

2.COPY ${JAR_FILE} app.jar: 将构建好的 Spring Boot JAR 文件复制到容器中。

3.ENTRYPOINT [“java”, “-jar”, “/app.jar”]: 设置容器启动时执行的命令,启动 Spring Boot 应用。

3.3 构建并推送镜像

步骤1:构建镜像

docker build -t springboot-app .

步骤2:推送镜像到镜像仓库

具体步骤:

1.登录 Docker Hub(如果使用 Docker Hub):

docker login

输入用户名和密码以验证身份。

2.给镜像打标签(假设镜像仓库是docker.io):

docker tag springboot-app:latest docker.io/yourusername/springboot-app:latest

为本地镜像springboot-app:latest打上标签,使其能够正确推送到 Docker Hub。yourusername是你的 Docker Hub 用户名,docker.io是 Docker Hub 默认仓库。

3.推送镜像到镜像仓库:

docker push docker.io/yourusername/springboot-app:latest

将打标签后的镜像推送到 Docker Hub 上的仓库。

3.4 部署到 Kubernetes

步骤1:创建deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:name: springboot-app
spec:replicas: 3selector:matchLabels:app: springboot-apptemplate:metadata:labels:app: springboot-appspec:containers:- name: springboot-appimage: springboot-app:latestports:- containerPort: 8080

解析:

1.replicas: 3: 部署三个副本,确保应用高可用。

2.image: springboot-app:latest: 使用构建好的 Docker 镜像。

3.containerPort: 8080: 暴露容器的 8080 端口。

步骤2:部署应用

kubectl apply -f deployment.yaml

此命令会启动一个具有 3 个副本的 Spring Boot 应用,并暴露为一个 Kubernetes 服务。

3.5 创建服务暴露应用

步骤1:创建服务文件service.yaml来暴露应用:

apiVersion: v1
kind: Service
metadata:name: spring-boot-app
spec:ports:- port: 8080targetPort: 8080selector:app: spring-boot

步骤2:应用服务

kubectl apply -f service.yaml

通过如上步骤完成应用部署后,Spring Boot 应用将运行在 Kubernetes 集群中,并可以通过 Prometheus 和 Grafana 进行监控。

四、自动发现服务监控目标

Prometheus 可以通过 Kubernetes 的服务发现功能,自动抓取集群中所有服务的数据。

在 prometheus.yml配置中启用Kubernetes 服务发现:

scrape_configs:- job_name: 'springboot-app'kubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_label_app]target_label: app- source_labels: [__meta_kubernetes_pod_name]target_label: pod_namemetrics_path: '/actuator/prometheus'scheme: httpport: 8080

这样 Prometheus 能够自动发现 Kubernetes 中的 Spring Boot 服务,无需手动添加监控信息。

五、Grafana 高级功能

5.1 设置报警规则

Grafana 不仅能够展示监控数据,还能够设置报警规则。您可以配置响应时间、错误率等阈值,当超过指定条件时触发报警。

以下是设置报警规则的步骤:

1.在 Grafana 仪表板中,选择一个面板,点击 “Edit”。

2.选择 “Alert” 标签,点击 “Create Alert”。

3.配置报警条件,如当响应时间大于 2 秒时触发报警。

5.2 多面板展示

Grafana 支持将不同类型的监控数据展示在同一面板上。如将 CPU 使用率、内存使用情况、请求响应时间等多个图表放在同一个仪表板上,创建一个综合的监控视图。

六、构建跨微服务的完整监控系统

在微服务架构中,监控不仅限于单一服务,而是需要跨多个服务进行集中管理。使用 Prometheus 和 Grafana可以轻松实现跨微服务的监控。

6.1 Prometheus 联邦聚合

功能:允许多个 Prometheus 实例将监控数据聚合到一个中央实例,适用于多集群环境。通过配置prometheus.yml,您可以将其他 Prometheus 实例作为数据源,进行数据聚合。

示例配置:

scrape_configs:- job_name: 'federated'  # 定义抓取任务名称,这里为 'federated'metrics_path: '/federate'  # 指定聚合抓取的路径,通常 Prometheus 会在 /federate 路径提供聚合数据static_configs:- targets: ['prometheus-instance-1:9090', 'prometheus-instance-2:9090']  # 配置聚合 Prometheus 实例的地址,指向其他 Prometheus 

实例的 API,通常是每个集群中 Prometheus 的地址。
这样中央 Prometheus 实例将定期抓取多个实例的数据。

6.2 Grafana 跨集群展示

功能:在 Grafana 中配置多个 Prometheus 数据源,集中展示不同集群的监控数据。这样,您可以通过一个仪表板查看多个集群的指标。

操作:在 Grafana 的 “Data Sources” 设置中添加不同 Prometheus 数据源,每个数据源指向不同的集群实例。

七、总结

7.1 核心重点:

• Spring Boot 与 Kubernetes 集成

在 Kubernetes 中部署 Spring Boot 应用,实现容器化管理与自动扩展。

• Prometheus 集成与优化

使用 Spring Boot Actuator 暴露监控端点,配置 Prometheus 自动抓取数据,优化监控准确性。

• Grafana 可视化面板配置

配置 Grafana 连接 Prometheus,展示应用健康、性能和资源使用情况。

相关文章:

  • 在开发板上如何处理curl: (60) SSL certificate problem
  • openssl_error_string() 不要依赖错误信息作为逻辑判断
  • C语言复习笔记--数据在内存中的存储
  • 【LLM】解析RAG增强检索技术:原理、实现与应用
  • 23种设计模式-行为型模式之解释器模式(Java版本)
  • 光谱共焦位移传感器的优势有哪些?
  • 洛谷题解 | CF111C Petya and Spiders
  • 算法基础学习|02归并排序——分治
  • go单向链表
  • 阿里千问Qwen3技术解析与部署指南 :混合推理架构突破性优势与对DeepSeek R1的全面超越
  • 软件测试基础知识详解
  • 【VLNs篇】01:视觉语言导航(VLN)中的LLM角色
  • 关于flex布局
  • scratch代码——游戏开发 【弹簧与反弹】
  • ArrayList的elementData.length和size
  • 双向流热固耦合的收敛
  • (leetcode) 力扣100 4.移动零(两种O(n)方法 双指针)
  • 大模型核心技术及架构解析
  • 2025.4.29_STM32_看门狗WDG
  • 一文读懂 JavaScript 中的深浅拷贝
  • 秦洪看盘|上市公司业绩“排雷”近尾声,A股下行压力趋缓
  • 自称“最美”通缉犯出狱当主播?央广网:三观怎能跟着“五官”跑
  • 餐饮店直播顾客用餐,律师:公共场所并非无隐私,需对方同意
  • 屋顶上的阳光与火光:战争如何改变了加沙的能源格局
  • 六朝文物草连空——丹阳句容南朝石刻考察纪
  • 俄罗斯称已收复库尔斯克州,普京发表讲话