上次線上集羣突然出現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的副本狀態、可用率、更新進度,適合跟蹤應用部署情況。

導入自定義儀表盤的方法:

  1. Grafana左側菜單 → Dashboards → Import;
  2. 輸入儀表盤ID(如1860),點擊Load;
  3. 選擇數據源為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、企業微信等方式。以企業微信為例,配置receiversroute

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流程,才能提升集羣的穩定性和運維效率。