在微服務架構中,應用的可觀測性至關重要。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,展示應用健康、性能和資源使用情況。