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中添加以下依赖:

java 复制代码
<!-- 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 端点:

java 复制代码
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:

java 复制代码
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 中配置:

java 复制代码
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-app
spec:
  ports:
    - port: 8080
      targetPort: 8080
      name: http
  selector:
    app: spring-boot

应用该配置:

java 复制代码
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,内容如下:

java 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: 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 集群:

java 复制代码
kubectl apply -f prometheus-config.yaml

说明:

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

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

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

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

java 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus
  namespace: monitoring
spec:
  template:
    spec:
      volumes:
        - name: prometheus-config-volume
          configMap:
            name: prometheus-config
      containers:
        - name: prometheus
          image: prom/prometheus
          volumeMounts:
            - name: prometheus-config-volume
              mountPath: /etc/prometheus
              subPath: prometheus.yml

2.应用修改后的配置:

java 复制代码
kubectl apply -f prometheus-deployment.yaml

1.4 验证 Prometheus配置

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

java 复制代码
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:

java 复制代码
helm install grafana stable/grafana

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

java 复制代码
http://<grafana-service-ip>:3000

2.2 配置 Prometheus 数据源

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

java 复制代码
http://prometheus-server:80

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

2.3 创建监控面板

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

三、Spring Boot 应用部署到 Kubernetes

3.1 Spring Boot 应用目录结构

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

java 复制代码
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 镜像

java 复制代码
# 使用官方的 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:构建镜像

java 复制代码
docker build -t springboot-app .

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

具体步骤:

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

java 复制代码
docker login

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

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

java 复制代码
docker tag springboot-app:latest docker.io/yourusername/springboot-app:latest

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

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

java 复制代码
docker push docker.io/yourusername/springboot-app:latest

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

3.4 部署到 Kubernetes

步骤1:创建deployment.yaml:

java 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: springboot-app
  template:
    metadata:
      labels:
        app: springboot-app
    spec:
      containers:
      - name: springboot-app
        image: springboot-app:latest
        ports:
        - containerPort: 8080

解析:

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

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

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

步骤2:部署应用

java 复制代码
kubectl apply -f deployment.yaml

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

3.5 创建服务暴露应用

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

java 复制代码
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-app
spec:
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: spring-boot

步骤2:应用服务

java 复制代码
kubectl apply -f service.yaml

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

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

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

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

java 复制代码
scrape_configs:
  - job_name: 'springboot-app'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_app]
        target_label: app
      - source_labels: [__meta_kubernetes_pod_name]
        target_label: pod_name
    metrics_path: '/actuator/prometheus'
    scheme: http
    port: 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 实例作为数据源,进行数据聚合。

示例配置:

java 复制代码
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,展示应用健康、性能和资源使用情况。

相关推荐
问道飞鱼2 小时前
【springboot知识】配置方式实现SpringCloudGateway相关功能
java·spring boot·后端·gateway
工业甲酰苯胺2 小时前
K8s新手系列之K8s中的资源
云原生·容器·kubernetes
樽酒ﻬق2 小时前
打造美观 API 文档:Spring Boot + Swagger 实战指南
java·spring boot·后端
源码集结号4 小时前
java智慧城管综合管理系统源码,前端框架:vue+element;后端框架:springboot;移动端:uniapp开发,技术前沿,可扩展性强
java·vue.js·spring boot·源代码·大数据分析·城管·电子办案
BLEACH-heiqiyihu4 小时前
k8s-Pod生命周期
云原生·容器·kubernetes
秋野酱4 小时前
基于Spring Boot+Vue 网上书城管理系统设计与实现(源码+文档+部署讲解)
vue.js·spring boot·后端
编程毕设5 小时前
【含文档+PPT+源码】基于SpringBoot电脑DIY装机教程网站的设计与实现
java·spring boot·后端
暖苏5 小时前
Spring中bean的生命周期(笔记)
java·spring boot·spring·spring cloud·mvc·bean生命周期·springbean
计算机毕设定制辅导-无忧学长5 小时前
Spring Boot 集成 ActiveMQ 实现异步消息通信(一)
spring boot·activemq·java-activemq