在微服务架构中,应用的可观测性至关重要。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,展示应用健康、性能和资源使用情况。