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

相关推荐
smileNicky10 小时前
SpringBoot系列之从繁琐配置到一键启动之旅
java·spring boot·后端
SirLancelot111 小时前
K8s-kubernetes(二)资源限制-详细介绍
微服务·云原生·容器·kubernetes·k8s·devops·kubelet
柏油13 小时前
Spring @TransactionalEventListener 解读
spring boot·后端·spring
小小工匠14 小时前
Maven - Spring Boot 项目打包本地 jar 的 3 种方法
spring boot·maven·jar·system scope
板板正16 小时前
Spring Boot 整合MongoDB
spring boot·后端·mongodb
泉城老铁16 小时前
在高并发场景下,如何优化线程池参数配置
spring boot·后端·架构
泉城老铁16 小时前
Spring Boot中实现多线程6种方式,提高架构性能
spring boot·后端·spring cloud
hrrrrb17 小时前
【Java Web 快速入门】九、事务管理
java·spring boot·后端
布朗克16819 小时前
Spring Boot项目通过RestTemplate调用三方接口详细教程
java·spring boot·后端·resttemplate
IT毕设实战小研20 小时前
基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序
java·数据库·vue.js·spring boot·后端·小程序·课程设计