iT邦幫忙

2025 iThome 鐵人賽

DAY 22
1
DevOps

牧場主的 K8s 放牧日記系列 第 22

Day 22: Prometheus 監控平台部署 - 牧場的數據收集中心

  • 分享至 

  • xImage
  •  

牧場主今日工作

今天要來建立牧場的數據收集中心!就像現代牧場主需要監控牛隻的健康狀況、食量、活動狀況,我們的 Kubernetes 集群也需要全方位的監控系統。Prometheus 就是這個數位牧場的智慧感測器網路,能夠收集每個 Pod、Node、Service 的各種指標,讓我們隨時掌握整個集群的健康狀況!

技術背景與概念

為什麼需要監控系統?

在沒有監控系統的情況下,管理 Kubernetes 集群就像是矇著眼睛放牧:

常見的運維困境

  • Pod 突然掛掉了,但不知道什麼時候開始的
  • 節點資源不足,但發現時已經影響服務
  • 網路延遲增加,卻找不到根本原因
  • 應用效能下降,無法快速定位問題

Prometheus 解決方案

  • 實時指標收集:持續監控所有組件的狀態
  • 歷史數據分析:追蹤趨勢變化和異常模式
  • 告警機制:問題發生時立即通知
  • 多維度查詢:透過 PromQL 進行靈活的數據分析

https://ithelp.ithome.com.tw/upload/images/20250905/20141794xGP3hohxJD.png

Prometheus 核心概念

時間序列數據庫
Prometheus 專門儲存時間序列數據,每個指標都包含:

  • Metric Name:指標名稱(如 cpu_usage
  • Labels:標籤組合(如 {instance="node1", job="kubelet"}
  • Timestamp:時間戳記
  • Value:指標數值

Pull-based 收集模式
https://ithelp.ithome.com.tw/upload/images/20250905/20141794G6gAIjMxaz.png

指標類型

  • Counter:只增不減的計數器(如 HTTP 請求總數)
  • Gauge:可增可減的數值(如 CPU 使用率)
  • Histogram:分布統計(如回應時間分布)
  • Summary:摘要統計(如回應時間的分位數)

kube-prometheus-stack 一站式解決方案

什麼是 kube-prometheus-stack?

kube-prometheus-stack 是 Kubernetes 監控的完整解決方案,包含:

核心組件

  • Prometheus:指標收集和存儲
  • Grafana:視覺化儀表板
  • AlertManager:告警管理
  • node-exporter:節點指標收集
  • kube-state-metrics:Kubernetes 物件狀態指標
  • prometheus-operator:自動化管理 Prometheus 配置

預設監控範圍

# Kubernetes 基礎設施
- 節點資源使用率(CPU、Memory、Disk、Network)
- Pod 狀態和資源消耗
- Service 可用性和回應時間
- Persistent Volume 使用情況

# Kubernetes API 物件
- Deployment、StatefulSet、DaemonSet 狀態
- ConfigMap、Secret 變更
- Event 事件監控

# 集群級別指標
- etcd 效能
- kube-apiserver 延遲
- kube-scheduler 調度統計

與手動安裝的差異

比較項目 手動安裝 kube-prometheus-stack
安裝複雜度 需要配置多個元件 一個 Helm 指令完成
配置管理 手動維護 YAML Operator 自動管理
預設儀表板 需要自己建立 包含 20+ 預設儀表板
告警規則 需要手動撰寫 內建完整告警規則
升級維護 手動處理相依性 Helm 管理版本升級

實戰部署:kube-prometheus-stack

環境準備

# 建立 monitoring namespace
kubectl create namespace monitoring

Helm 安裝 kube-prometheus-stack

# 添加 prometheus-community Helm repository
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 更新 repository
helm repo update

# 檢視可用版本
helm search repo prometheus-community/kube-prometheus-stack

自定義配置

建立 values.yaml 檔案來自定義安裝設定:

# 建立自定義配置檔案
cat > prometheus-values.yaml << 'EOF'
# 全域設定
global:
  rbac:
    create: true

# Prometheus Server 設定
prometheus:
  prometheusSpec:
    # 資料保留期間(實驗環境用較短時間)
    retention: 7d
    retentionSize: 15GB
    # 抓取間隔
    scrapeInterval: 30s
    evaluationInterval: 30s
    # 實驗環境資源限制
    resources:
      requests:
        cpu: 200m
        memory: 1Gi
      limits:
        cpu: 1000m
        memory: 2Gi
    # 儲存設定
    storageSpec:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 20Gi
    # 安全設定
    securityContext:
      runAsNonRoot: true
      runAsUser: 65534
      fsGroup: 65534

# Grafana 儀表板設定
grafana:
  # 重要:預設管理員密碼是 "prom-operator"
  adminPassword: "admin123"
  # 持久化儲存
  persistence:
    enabled: true
    size: 5Gi
  # 實驗環境資源限制
  resources:
    requests:
      cpu: 100m
      memory: 256Mi
    limits:
      cpu: 500m
      memory: 512Mi
  # Grafana 組態
  grafana.ini:
    server:
      root_url: http://localhost:3000
    # 預設主題
    users:
      default_theme: dark
    # 安全設定
    auth.anonymous:
      enabled: false
    security:
      disable_gravatar: true

# AlertManager 告警管理
alertmanager:
  alertmanagerSpec:
    resources:
      requests:
        cpu: 50m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
    storage:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 2Gi

# Prometheus Operator 設定
prometheusOperator:
  resources:
    requests:
      cpu: 100m
      memory: 128Mi
    limits:
      cpu: 200m
      memory: 256Mi

# 監控目標設定
kubernetesServiceMonitors:
  enabled: true

defaultRules:
  create: true
  # 調整告警規則適合實驗環境
  rules:
    kubernetesApps: true
    kubernetesSystem: true
    node: true
    prometheus: true

# Kubernetes 組件監控
kubeApiServer:
  enabled: true

kubelet:
  enabled: true
  serviceMonitor:
    https: true

kubeControllerManager:
  enabled: false  # RKE2 預設不暴露指標

kubeScheduler:
  enabled: false  # RKE2 預設不暴露指標

kubeProxy:
  enabled: false  # RKE2 使用 kube-proxy

kubeEtcd:
  enabled: false  # RKE2 etcd 需要特殊配置

# 節點與叢集狀態收集
nodeExporter:
  enabled: true
  resources:
    requests:
      cpu: 10m
      memory: 16Mi
    limits:
      cpu: 50m
      memory: 32Mi

kubeStateMetrics:
  enabled: true
  resources:
    requests:
      cpu: 10m
      memory: 32Mi
    limits:
      cpu: 100m
      memory: 64Mi
EOF

部署前準備

# 檢查 Helm chart 版本
helm search repo prometheus-community/kube-prometheus-stack --versions

# 檢視完整的 values 選項
helm show values prometheus-community/kube-prometheus-stack > original-values.yaml

# 驗證自定義配置
helm template kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  -n monitoring \
  -f prometheus-values.yaml \
  --dry-run > preview.yaml

部署 kube-prometheus-stack

# 部署監控堆疊
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  -n monitoring \
  -f prometheus-values.yaml

# 重要:Helm 會自動安裝新的 CRDs,但升級時不會刪除舊的
# 如果需要清理舊 CRDs,可以手動刪除不再使用的 CRD 資源

# 檢查部署狀態(這個過程可能需要幾分鐘)
kubectl get pods -n monitoring -w

# 檢查所有組件是否就緒
kubectl get pods -n monitoring

# 檢查 Services
kubectl get svc -n monitoring

# 檢查 PVC 狀態
kubectl get pvc -n monitoring

# 檢查 ServiceMonitor 資源
kubectl get servicemonitor -n monitoring

預期的部署結果

# 應該看到以下 Pod 正在運行
NAME                                                        READY   STATUS
alertmanager-kube-prometheus-stack-alertmanager-0          2/2     Running
kube-prometheus-stack-grafana-xxx                          3/3     Running
kube-prometheus-stack-kube-state-metrics-xxx               1/1     Running
kube-prometheus-stack-operator-xxx                         1/1     Running
kube-prometheus-stack-prometheus-node-exporter-xxx         1/1     Running
prometheus-kube-prometheus-stack-prometheus-0              2/2     Running

存取監控介面

# 方式1:使用 port-forward 存取 Prometheus
kubectl port-forward -n monitoring svc/kube-prometheus-stack-prometheus 9090:9090

# 方式2:使用 port-forward 存取 Grafana  
kubectl port-forward -n monitoring svc/kube-prometheus-stack-grafana 3000:80

# 方式3:使用 port-forward 存取 AlertManager
kubectl port-forward -n monitoring svc/kube-prometheus-stack-alertmanager 9093:9093

存取資訊

  • Prometheus UI:http://localhost:9090
  • Grafana:http://localhost:3000 (admin / admin123)
  • AlertManager:http://localhost:9093

重要提醒

  • 新的 CRDs 會自動安裝,但舊的 CRDs 不會在升級時自動刪除
  • 首次部署可能需要幾分鐘等待所有組件啟動
  • 如果遇到 PVC 問題,檢查 StorageClass 是否正確設定

基本指標查詢與驗證

Prometheus UI 基本操作

存取 Prometheus UI (http://localhost:9090),嘗試以下查詢:

# 檢查所有節點的 CPU 使用率
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 檢查記憶體使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# 檢查總 Pod 數量
count(kube_pod_info)

# 檢查不同狀態的 Pod 數量(按狀態分組)
sum by (phase) (kube_pod_status_phase)

# 只檢查運行中的 Pod 數量
count(kube_pod_status_phase{phase="Running"} == 1)

# 檢查失敗的 Pod(返回具體的 Pod 資訊)
kube_pod_status_phase{phase="Failed"} == 1

Grafana 預設儀表板

登入 Grafana (http://localhost:3000),瀏覽預設儀表板:

重要的預設儀表板

  • Kubernetes / Compute Resources / Cluster:集群整體資源概況
  • Kubernetes / Compute Resources / Node (Pods):節點級別資源使用
  • Kubernetes / Compute Resources / Namespace (Pods):命名空間資源統計
  • Node Exporter / Nodes:硬體級別監控

驗證監控資料

# 檢查是否正確收集指標
curl -s 'http://localhost:9090/api/v1/query?query=up' | jq '.'

# 檢查 targets 狀態
curl -s 'http://localhost:9090/api/v1/targets' | jq '.data.activeTargets[].health' | sort | uniq -c

# 檢查指標數量
curl -s 'http://localhost:9090/api/v1/label/__name__/values' | jq '.data | length'

PromQL 基本查詢語法

基礎查詢語法

選擇器語法

# 基本指標查詢
node_cpu_seconds_total

# 使用 label 過濾
node_cpu_seconds_total{mode="idle"}

# 多重條件
node_cpu_seconds_total{mode="idle", instance="node1"}

# 正規表達式匹配
node_cpu_seconds_total{mode=~"idle|user"}

函數應用

# rate() - 計算變化率
rate(node_cpu_seconds_total{mode="idle"}[5m])

# avg() - 計算平均值
avg(rate(node_cpu_seconds_total{mode="idle"}[5m]))

# sum() - 加總
sum(rate(node_network_receive_bytes_total[5m])) by (instance)

實用查詢範例

# CPU 使用率 (%)
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 記憶體使用率 (%)
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# 磁碟使用率 (%)
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100

# 網路流量 (bytes/sec)
rate(node_network_receive_bytes_total[5m])

# Pod 重啟次數
increase(kube_pod_container_status_restarts_total[1h])

# Service 可用性
up{job="kubernetes-services"}

常見問題與故障排除

部署問題排查

# 檢查 Prometheus Operator 日誌
kubectl logs -n monitoring deployment/kube-prometheus-stack-operator

# 檢查 Prometheus 狀態
kubectl describe prometheus -n monitoring

# 檢查 ServiceMonitor 是否被正確發現
kubectl get servicemonitor -n monitoring -o yaml

# 檢查 PVC 綁定狀態
kubectl describe pvc -n monitoring

常見問題解決

問題1:Pod 無法啟動

  • 檢查資源配額是否足夠
  • 確認 StorageClass 存在且可用
  • 檢查節點資源是否充足

問題2:指標收集不完整

  • 驗證 ServiceMonitor 標籤選擇器
  • 檢查目標服務是否暴露 metrics 端點
  • 確認 RBAC 權限設定正確

問題3:Grafana 無法載入儀表板

  • 確認 Grafana 與 Prometheus 連接正常
  • 檢查 Grafana 的資料來源配置
  • 驗證預設儀表板是否正確載入

今日總結與明日預告

今天我們成功部署了 kube-prometheus-stack,建立了完整的 Kubernetes 監控基礎!從核心概念到實際部署,從指標收集到基本查詢,我們的數位牧場現在有了智慧感測器網路。透過 Prometheus 的實時監控,我們能即時掌握集群的健康狀況。

明天我們要深入 Grafana 的視覺化功能,學習如何建立專業的監控儀表板,讓監控數據變成直觀的圖表和警示系統!

💡 牧場主小提示:Prometheus 就像牧場的智慧感測器網路,持續收集每頭牛的健康數據!記住三個要點:Pull-based 主動拉取更可靠、PromQL 查詢語言很強大、預設的 kube-prometheus-stack 包山包海。有了監控數據,你就不再是矇眼牧場主,而是數據驅動的現代牧場管理大師!


上一篇
Day 21: Ingress Controller 流量路由實戰 - 牧場的智慧導航系統
系列文
牧場主的 K8s 放牧日記22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言