今天要來建立牧場的數據收集中心!就像現代牧場主需要監控牛隻的健康狀況、食量、活動狀況,我們的 Kubernetes 集群也需要全方位的監控系統。Prometheus 就是這個數位牧場的智慧感測器網路,能夠收集每個 Pod、Node、Service 的各種指標,讓我們隨時掌握整個集群的健康狀況!
在沒有監控系統的情況下,管理 Kubernetes 集群就像是矇著眼睛放牧:
常見的運維困境:
Prometheus 解決方案:
時間序列數據庫:
Prometheus 專門儲存時間序列數據,每個指標都包含:
cpu_usage
){instance="node1", job="kubelet"}
)Pull-based 收集模式:
指標類型:
kube-prometheus-stack 是 Kubernetes 監控的完整解決方案,包含:
核心組件:
預設監控範圍:
# 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 管理版本升級 |
# 建立 monitoring namespace
kubectl create namespace monitoring
# 添加 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
# 部署監控堆疊
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),嘗試以下查詢:
# 檢查所有節點的 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 (http://localhost:3000),瀏覽預設儀表板:
重要的預設儀表板:
# 檢查是否正確收集指標
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'
選擇器語法:
# 基本指標查詢
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 無法啟動
問題2:指標收集不完整
問題3:Grafana 無法載入儀表板
今天我們成功部署了 kube-prometheus-stack,建立了完整的 Kubernetes 監控基礎!從核心概念到實際部署,從指標收集到基本查詢,我們的數位牧場現在有了智慧感測器網路。透過 Prometheus 的實時監控,我們能即時掌握集群的健康狀況。
明天我們要深入 Grafana 的視覺化功能,學習如何建立專業的監控儀表板,讓監控數據變成直觀的圖表和警示系統!
💡 牧場主小提示:Prometheus 就像牧場的智慧感測器網路,持續收集每頭牛的健康數據!記住三個要點:Pull-based 主動拉取更可靠、PromQL 查詢語言很強大、預設的 kube-prometheus-stack 包山包海。有了監控數據,你就不再是矇眼牧場主,而是數據驅動的現代牧場管理大師!