上次線上集羣突然出現Pod頻繁重啓,排查了半天才發現是節點磁盤空間不足。當時既沒有實時告警,也看不到資源使用趨勢,只能事後補救。後來搭建了Prometheus+Grafana監控體系,不僅能實時看到集羣的CPU、內存使用率,還能通過自定義告警提前發現潛在問題,運維效率提升了不少。
在Kubernetes集羣中,監控是DevOps體系的核心環節。Prometheus負責數據採集和存儲,Grafana專注於可視化展示,兩者結合能構建全方位的監控告警系統。本文從實際運維需求出發,講解如何部署Prometheus和Grafana,配置關鍵監控指標,以及設置實用的告警規則。
一、監控體系架構:數據流向與組件分工
一個完整的K8s監控體系需要多個組件協作:
- Prometheus:核心組件,通過Pull方式從目標(如K8s節點、Pod)採集 metrics 數據,存儲在時序數據庫中。
- Node Exporter:部署在每個節點,收集服務器的CPU、內存、磁盤等硬件指標。
- kube-state-metrics:收集K8s資源對象(如Pod、Deployment、Service)的狀態指標(如Pod重啓次數、Deployment副本數)。
- Grafana:對接Prometheus,通過儀表盤(Dashboard)可視化展示監控數據,支持自定義圖表。
- Alertmanager:處理Prometheus的告警信息,支持郵件、企業微信等多種通知方式。
數據流向:Node Exporter和kube-state-metrics暴露指標接口 → Prometheus定期拉取並存儲 → Grafana從Prometheus查詢數據並展示 → 異常時Prometheus觸發告警,由Alertmanager推送通知。
二、部署監控組件:用Helm快速搭建
手動部署組件步驟繁瑣,推薦用Helm(K8s包管理工具)一鍵部署Prometheus和Grafana。
1. 安裝Helm
# 下載Helm客户端(Linux為例)
wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz
tar -zxvf helm-v3.12.0-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm
# 驗證安裝
helm version
2. 添加Prometheus倉庫並部署
# 添加Prometheus社區倉庫
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 創建命名空間
kubectl create namespace monitoring
# 部署Prometheus和Grafana(包含相關組件)
helm install kube-prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set grafana.adminPassword=Admin123 # 設置Grafana管理員密碼
部署完成後,查看組件運行狀態:
kubectl get pods -n monitoring
應能看到prometheus、grafana、alertmanager、node-exporter、kube-state-metrics等Pod。
3. 訪問Grafana控制枱
默認部署的Grafana使用ClusterIP類型,需通過端口轉發訪問:
# 端口轉發:將本地3000端口映射到Grafana的3000端口
kubectl port-forward -n monitoring svc/kube-prometheus-grafana 3000:80
瀏覽器訪問http://localhost:3000,用用户名admin和剛才設置的密碼Admin123登錄。
三、核心監控指標與可視化配置
登錄Grafana後,系統已預置多個K8s監控儀表盤(Dashboard),涵蓋節點、Pod、容器等維度。
1. 常用儀表盤推薦
- Kubernetes / Nodes(ID:1860):展示節點的CPU、內存、磁盤IO、網絡等指標,能快速定位節點資源瓶頸。
- Kubernetes / Pods(ID:6417):按命名空間展示Pod的資源使用情況,包括CPU使用率、內存佔用、重啓次數等。
- Kubernetes / Deployment(ID:12856):監控Deployment的副本狀態、可用率、更新進度,適合跟蹤應用部署情況。
導入自定義儀表盤的方法:
- Grafana左側菜單 → Dashboards → Import;
- 輸入儀表盤ID(如1860),點擊Load;
- 選擇數據源為Prometheus,點擊Import完成導入。
2. 關鍵指標解析
監控K8s集羣時,需重點關注以下指標:
- 節點資源使用率:
- CPU使用率:
100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) - 內存使用率:
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 - 磁盤使用率:
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) / node_filesystem_size_bytes * 100
- Pod狀態指標:
- 重啓次數:
kube_pod_container_status_restarts_total - 就緒狀態:
kube_pod_status_ready{condition="true"}(1表示就緒,0表示未就緒)
- 容器資源使用:
- 容器CPU使用率:
sum(rate(container_cpu_usage_seconds_total{namespace!=""}[5m])) by (pod, container) - 容器內存使用率:
container_memory_usage_bytes{namespace!=""}
四、告警配置:提前發現並解決問題
僅監控還不夠,需配置告警規則,在問題惡化前及時通知。
1. 配置告警規則
Prometheus的告警規則定義在ConfigMap中,通過Helm部署時可在values.yaml中配置:
# 自定義告警規則(示例)
prometheus:
prometheusSpec:
additionalAlertRules:
- name: custom-rules
rules:
- alert: HighNodeCPUUsage
expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80
for: 5m # 持續5分鐘超過閾值才告警
labels:
severity: warning
annotations:
summary: "節點CPU使用率過高"
description: "節點 {{ $labels.instance }} CPU使用率超過80%,當前值:{{ $value | humanizePercentage }}"
- alert: PodRestartFrequently
expr: increase(kube_pod_container_status_restarts_total[10m]) > 3
labels:
severity: critical
annotations:
summary: "Pod頻繁重啓"
description: "Pod {{ $labels.pod }} 在10分鐘內重啓超過3次"
更新配置:
helm upgrade kube-prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
-f values.yaml
2. 配置Alertmanager通知
Alertmanager負責發送告警,支持郵件、Slack、企業微信等方式。以企業微信為例,配置receivers和route:
alertmanager:
config:
global:
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'wechat'
receivers:
- name: 'wechat'
webhook_configs:
- url: 'http://wechat-alert-service:8080/send' # 企業微信機器人Webhook
send_resolved: true
需部署一箇中間服務(如wechat-alert-service)將Alertmanager的告警格式轉換為企業微信支持的格式。
五、最佳實踐與性能優化
1. 合理設置數據保留時間
Prometheus默認保留15天數據,可根據需求調整,避免磁盤佔用過大:
prometheus:
prometheusSpec:
retention: 7d # 保留7天數據
2. 篩選關鍵指標,減少數據量
K8s集羣指標繁多,可通過relabel_configs過濾不必要的指標,減輕Prometheus負擔:
prometheus:
prometheusSpec:
serviceMonitorSelector:
matchLabels:
monitor: kubernetes # 只監控帶特定標籤的服務
3. 告警分級與抑制
根據問題嚴重程度設置告警級別(critical、warning),並通過inhibit_rules避免告警風暴:
alertmanager:
config:
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance'] # 同一實例的warning告警被critical抑制
4. 定期備份監控數據
Prometheus數據存儲在PVC中,需定期備份,避免數據丟失:
# 備份Prometheus數據目錄
kubectl exec -n monitoring <prometheus-pod> -c prometheus -- tar -czf - /prometheus > prometheus-backup.tar.gz
總結
Prometheus+Grafana是K8s監控的黃金組合,通過Prometheus的時序數據採集和Grafana的可視化能力,能全面掌握集羣的運行狀態。實際應用中,不僅要部署基礎組件,更要結合業務需求篩選關鍵指標、配置合理的告警規則,才能將監控從"事後分析"轉變為"事前預防"。
監控體系的搭建不是一勞永逸的,需要根據集羣規模和業務變化持續優化:調整數據保留策略、完善告警規則、優化儀表盤展示。只有讓監控真正融入DevOps流程,才能提升集羣的穩定性和運維效率。