K8S 監控不掉線:將 Prometheus + Grafana 數據持久化
前面發表了一篇用Kubernetes部署Prometheus集群的文章,最主要的問題是沒有做數據持久化,我將在下面教你如何一步步將grafana和Prometheus數據持久化。
部署后界面:

1. 安裝并配置 NFS 服務
在一臺節點(或獨立服務器)上部署 NFS:
yum install nfs-utils -y
mkdir -p /data/nfs/k8s
chmod 777 /data/nfs/k8s編輯 /etc/exports:
/data/nfs/k8s *(rw,sync,no_root_squash)刷新配置:
sudo exportfs -rv啟動nfs:
systemctl enable --now nfs-server.serviceK8S集群每個節點也安裝一下NFS:
yum install -y nfs-utils2. 安裝 NFS-CSI驅動
我用StorageClass方式制作存儲,需要先安裝CSI驅動。
項目地址:https://github.com/kubernetes-csi/csi-driver-nfs
獲取代碼:
git clone https://github.com/kubernetes-csi/csi-driver-nfs修改鏡像地址:使用官網鏡像可能下載不了。
[root@k8s-master ~]# cd /root/csi-driver-nfs
[root@k8s-master csi-driver-nfs]# sed -i "s#docker.m.daocloud.io#k8s.m.daocloud.io#g" deploy/v4.12.0/*.yaml安裝NFS-CSI:
[root@k8s-master csi-driver-nfs]# ./deploy/install-driver.sh v4.12.0 local查看Pod狀態:
這個啟動的時間會稍微久一點,是在kube-system名稱空間下創建的
[root@k8s-master csi-driver-nfs]# kubectl get pod -l app=csi-nfs-node -n kube-system
NAME READY STATUS RESTARTS AGE
csi-nfs-node-2gwh7 3/3 Running 1 (9m48s ago) 14m
csi-nfs-node-4vbrq 3/3 Running 1 (3m5s ago) 7m18s
csi-nfs-node-jknws 3/3 Running 1 (8m42s ago) 14m
[root@k8s-master csi-driver-nfs]# kubectl get pod -l app=csi-nfs-controller -n kube-system
NAME READY STATUS RESTARTS AGE
csi-nfs-controller-68947b6c97-lddj8 5/5 Running 3 (6m3s ago) 15m
# 查看csi
[root@k8s-master csi-driver-nfs]# kubectl get csidriver
NAME ATTACHREQUIRED PODINFOONMOUNT STORAGECAPACITY TOKENREQUESTS REQUIRESREPUBLISH MODES AGE
nfs.csi.k8s.io false false false <unset> false Persistent 22m3. 創建StorageClass
修改配置文件就行:
- 將NFS的IP和共享路徑協商
- 將數據保留策略改為:Retain
[root@k8s-master csi-driver-nfs]# vi deploy/v4.12.0/storageclass.yaml
....
parameters:
server: 10.0.0.212
share: /data/nfs/k8s
....
reclaimPolicy: Retain創建sc:
[root@k8s-master csi-driver-nfs]# kubectl apply -f deploy/v4.12.0/storageclass.yaml查看sc:
[root@k8s-master csi-driver-nfs]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Retain Immediate true 7s4. Grafana持久化
有了 nfs-csi StorageClass 之后,就可以在應用中直接聲明 PVC。
創建grafana-pvc:
vi grafana-pvc.yaml添加下面內容:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-pvc
namespace: monitoring
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 4Gi
storageClassName: nfs-csi創建PVC::
kubectl apply -f grafana-pvc.yaml查看PVC:
[root@k8s-master manifests]# kubectl get pvc -n monitoring
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
grafana-pvc Bound pvc-29c8f56c-53e5-46e3-95ce-f066242cf4d6 4Gi RWX nfs-csi <unset> 9m12s在 Grafana Deployment 中掛載:
vi grafana-deployment.yaml修改下面內容,其實就是修改volumes的位置,將臨時目錄修改為PVC:
volumes:
- name: grafana-storage
persistentVolumeClaim:
claimName: grafana-pvc配置完,重啟加載一下:
kubectl replace -f grafana-deployment.yaml它會在NFS那里自動創建對應pvc目錄:
[root@k8s-node2 ~]# cd /data/nfs/k8s/
[root@k8s-node2 k8s]# ls
pvc-29c8f56c-53e5-46e3-95ce-f066242cf4d6
[root@k8s-node2 k8s]# cd pvc-29c8f56c-53e5-46e3-95ce-f066242cf4d6/
[root@k8s-node2 pvc-29c8f56c-53e5-46e3-95ce-f066242cf4d6]# ls
csv grafana.db pdf plugins png
[root@k8s-node2 pvc-29c8f56c-53e5-46e3-95ce-f066242cf4d6]#可以看到grafana的數據庫已經持久化存到后端存儲NFS上了。
4. Prometheus 持久化
Prometheus 持久化的作用是讓監控數據在 Pod 重啟或遷移后不丟失,保證歷史數據和告警趨勢的連續性。 如果不做持久化,Prometheus 重啟后所有歷史監控數據都會被清空。
想要Prometheus持久化直接修改Prometheus CRD資源。
[root@k8s-master ~ ]# kubectl edit prometheus k8s -n monitoringspec層級下添加PVC配置:
spec:
storage:
volumeClaimTemplate:
spec:
storageClassName: nfs-csi
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 4Gi保存退出后:Operator 會自動更新 StatefulSet,Prometheus Pod 會重建并使用新 PVC。
[root@k8s-master manifests]# kubectl edit prometheus k8s -n monitoring
prometheus.monitoring.coreos.com/k8s edited查看PVC:
kubectl get pvc -n monitoring可以看到已經創建了兩個pvc。
查看后端存儲,已經將數據存到NFS上了。
至此,grafana和Prometheus數據持久化已經做好,你自己也可以試一下如何將altermanager也做持久化。

































