部署云原生监控平台Prometheus

一、部署基于Prometheus的全方位监控平台

Prometheus的安装方式有多种,该笔记中选择Kube-Prometheus Stack的方式在k8s集群中安装部署。

Kube-Prometheus项目地址:https://github.com/prometheus-operator/kube-prometheus/

首先需要通过该项目地址,找到和自己Kubernetes版本对应的Kube Prometheus Stack的版本:(我的k8s集群版本是v1.31.4,选择release-0.14、release-0.15、release-0.16都可以,我这里选择release-0.14版本)

1.下载对应的release-0.14版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#创建目录:17-prometheus是学习本章节目录,监控章节的所有文件都在该目录中完成
[root@k8s-master01 pra] mkdir -p /root/pra/17-prometheus
#进入目录
[root@k8s-master01 pra]# cd 17-prometheus/

#拉取对应版本的文件包
[root@k8s-master01 17-prometheus]# git clone -b release-0.14 https://github.com/prometheus-operator/kube-prometheus.git
Cloning into 'kube-prometheus'...
remote: Enumerating objects: 20464, done.
remote: Counting objects: 100% (3886/3886), done.
remote: Compressing objects: 100% (262/262), done.
remote: Total 20464 (delta 3715), reused 3700 (delta 3605), pack-reused 16578 (from 1)
Receiving objects: 100% (20464/20464), 12.32 MiB | 3.03 MiB/s, done.
Resolving deltas: 100% (14089/14089), done.

# -b release-0.14 表示告诉 Git 在克隆仓库的同时,切换到指定的release-0.14分支(而不是默认的 main 或 master 分支)
# 就不需要再额外执行 git checkout release-0.14 切换分支了

[root@k8s-master01 test]# ll
total 4
drwxr-xr-x 12 root root 4096 Jul 9 18:40 kube-prometheus

[root@k8s-master01 test]# cd kube-prometheus/
[root@k8s-master01 kube-prometheus]# ll
total 132
-rwxr-xr-x 1 root root 679 Jul 9 18:40 build.sh
-rw-r--r-- 1 root root 16162 Jul 9 18:40 CHANGELOG.md
-rw-r--r-- 1 root root 2020 Jul 9 18:40 code-of-conduct.md
-rw-r--r-- 1 root root 3782 Jul 9 18:40 CONTRIBUTING.md
drwxr-xr-x 5 root root 69 Jul 9 18:40 developer-workspace
drwxr-xr-x 4 root root 4096 Jul 9 18:40 docs
-rw-r--r-- 1 root root 2273 Jul 9 18:40 example.jsonnet
drwxr-xr-x 7 root root 4096 Jul 9 18:40 examples
drwxr-xr-x 3 root root 28 Jul 9 18:40 experimental
-rw-r--r-- 1 root root 2242 Jul 9 18:40 go.mod
-rw-r--r-- 1 root root 15676 Jul 9 18:40 go.sum
drwxr-xr-x 3 root root 29 Jul 9 18:40 jsonnet
-rw-r--r-- 1 root root 400 Jul 9 18:40 jsonnetfile.json
-rw-r--r-- 1 root root 6580 Jul 9 18:40 jsonnetfile.lock.json
-rw-r--r-- 1 root root 1807 Jul 9 18:40 kubescape-exceptions.json
-rw-r--r-- 1 root root 4902 Jul 9 18:40 kustomization.yaml
-rw-r--r-- 1 root root 11325 Jul 9 18:40 LICENSE
-rw-r--r-- 1 root root 3450 Jul 9 18:40 Makefile
drwxr-xr-x 3 root root 8192 Jul 9 18:40 manifests # 所有的安装文件都在manifests目录中
-rw-r--r-- 1 root root 8970 Jul 9 18:40 README.md
-rw-r--r-- 1 root root 3922 Jul 9 18:40 RELEASE.md
drwxr-xr-x 2 root root 4096 Jul 9 18:40 scripts
drwxr-xr-x 3 root root 17 Jul 9 18:40 tests

#进入manifests目录,所有的安装文件都在manifests目录中
[root@k8s-master01 17-prometheus]# cd kube-prometheus/manifests

如果上述clone命令无法拉取也可以下载压缩包,上传到服务器的目录中:

1
2
3
4
[root@k8s-master01 17-prometheus]# git clone -b release-0.14 https://github.com/prometheus-operator/kube-prometheus.git
Cloning into 'kube-prometheus'...
fatal: unable to access 'https://github.com/prometheus-operator/kube-prometheus.git/': Failed connect to github.com:443; Connection timed out
#如果遇到网络问题无法在线拉取可以参考下图解决

进入目标目录:

1
2
3
4
5
6
7
[root@k8s-master01 17-prometheus]# ll
total 4
drwxr-xr-x 12 root root 4096 Nov 12 17:38 kube-prometheus

#进入manifests目录,所有的安装文件都在manifests目录中
[root@k8s-master01 17-prometheus]# cd kube-prometheus/manifests

2.安装Prometheus Operator CRD:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 进入到manifests目录中执行下面命令
[root@k8s-master01 manifests]# kubectl create -f setup/
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusagents.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/scrapeconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
namespace/monitoring created

# 会在monitoring命令空间中安装很多CRD资源
[root@k8s-master01 kube-prometheus]# kubectl get crd |grep monitoring
alertmanagerconfigs.monitoring.coreos.com 2025-09-21T12:12:07Z
alertmanagers.monitoring.coreos.com 2025-09-21T12:12:07Z
podmonitors.monitoring.coreos.com 2025-09-21T12:12:07Z
probes.monitoring.coreos.com 2025-09-21T12:12:08Z
prometheusagents.monitoring.coreos.com 2025-09-21T12:12:08Z
prometheuses.monitoring.coreos.com 2025-09-21T12:12:08Z
prometheusrules.monitoring.coreos.com 2025-09-21T12:12:08Z
scrapeconfigs.monitoring.coreos.com 2025-09-21T12:12:09Z
servicemonitors.monitoring.coreos.com 2025-09-21T12:12:09Z
thanosrulers.monitoring.coreos.com 2025-09-21T12:12:09Z

安装 Prometheus Operator 及核心组件:

需要修改镜像地址的文件包含下面所有文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
路径:~/kube-prometheus-release-0.14/manifests
[root@k8s-master01 manifests]# grep "image:" *.yaml
alertmanager-alertmanager.yaml: image: quay.io/prometheus/alertmanager:v0.27.0
blackboxExporter-deployment.yaml: image: quay.io/prometheus/blackbox-exporter:v0.25.0
blackboxExporter-deployment.yaml: image: ghcr.io/jimmidyson/configmap-reload:v0.13.1
blackboxExporter-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
grafana-deployment.yaml: image: grafana/grafana:11.2.0
kubeStateMetrics-deployment.yaml: image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0
kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
kubeStateMetrics-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
nodeExporter-daemonset.yaml: image: quay.io/prometheus/node-exporter:v1.8.2
nodeExporter-daemonset.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
prometheusAdapter-deployment.yaml: image: registry.k8s.io/prometheus-adapter/prometheus-adapter:v0.12.0
prometheusOperator-deployment.yaml: image: quay.io/prometheus-operator/prometheus-operator:v0.76.2
prometheusOperator-deployment.yaml: image: quay.io/brancz/kube-rbac-proxy:v0.18.1
prometheus-prometheus.yaml: image: quay.io/prometheus/prometheus:v2.54.1


# 修改下面三个yaml文件中的镜像地址,像ghcr.io和quay.io中的镜像地址应该可以正常拉取,可以不改
kubeStateMetrics-deployment.yaml
prometheusAdapter-deployment.yaml
grafana-deployment.yaml

修改alertmanager的副本数和镜像下载地址:

1
2
3
4
5
#在创建之前需要决定你集群的副本数,假设我这里是测试环境,所以只创建一个副本,如果是生产环境建议至少3个副本
#alertmanager副本数在alertmanager-alertmanager.yaml配置文件中修改
#主要是副本数和镜像下载地址的配置:
image: quay.io/prometheus/alertmanager:v0.27.0 #如果自己有镜像仓库可以改为自己的仓库地址,下图已经修改为我自己的镜像仓库地址了
replicas: 3 #根据实际情况修改副本的数量,我配置的是1

修改prometheus的副本数和镜像下载地址:

1
2
3
4
5
#在创建之前需要决定你集群的副本数,假设我这里是测试环境,所以只创建一个副本,如果是生产环境建议至少3个副本
#prometheus副本数在 prometheus-prometheus.yaml配置文件中修改
#主要是副本数和镜像下载地址的配置:
image: quay.io/prometheus/alertmanager:v0.27.0 #如果自己有镜像仓库可以改为自己的仓库地址,下图已经修改为我自己的镜像仓库地址了
replicas: 3 #根据实际情况修改副本的数量,我配置的是1

修改kubeStateMetrics-deployment.yaml配置文件中镜像的下载地址:

1
# kubeStateMetrics-deployment.yaml配置文件中的镜像地址我改为我自己的仓库地址,事先已经将镜像同步到自己的仓库中

接下来安装prometheus的技术栈(安装需要至少3个节点,配个节点配置最低要4核4G):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#注意所在目录manifests
[root@k8s-master01 manifests]# pwd
/root/pra/17-prometheus/kube-prometheus/manifests

#安装prometheus技术栈
[root@k8s-master01 manifests]# kubectl create -f .


#查看prometheus容器状态
[root@k8s-master01 manifests]# kubectl get po -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 0/2 Init:0/1 0 9m54s
blackbox-exporter-75c7985cb8-xkxrs 0/3 ContainerCreating 0 11m
grafana-664dd67585-mh7tb 0/1 ImagePullBackOff 0 11m
kube-state-metrics-bbcd9ff4f-8c5vq 0/3 ContainerCreating 0 11m
node-exporter-7b428 2/2 Running 0 11m
node-exporter-m2g8z 2/2 Running 0 11m
node-exporter-nvpz5 2/2 Running 0 11m
node-exporter-w7lrs 2/2 Running 0 11m
node-exporter-wwtnm 0/2 ContainerCreating 0 11m
prometheus-adapter-77f8587965-5x7bn 0/1 ImagePullBackOff 0 11m
prometheus-adapter-77f8587965-wgp55 0/1 ImagePullBackOff 0 11m
prometheus-k8s-0 0/2 Init:0/1 0 9m54s
prometheus-operator-6f9479b5f5-4zpfm 2/2 Running 0 11m

虽然上述三个配置文件修改了镜像的下载地址,但是查看pod会发现还是会有一些pod由于镜像地址的问题无法启动pod,接下继续修改无法启动pod的那些镜像地址:

思路一:通过describe查看无法启动的pod使用的镜像是什么,然后利用github同步到我自己的阿里云仓库中,在把配置文件中的镜像地址修改为我自己的阿里云仓库地址。(这里就不演示了)

1
2
3
4
5
#下面是几个pod的资源配置所在的文件
blackbox-exporter-75c7985cb8-xkxrs的镜像在blackboxExporter-deployment.yaml文件中
grafana-664dd67585-mh7tb 的镜像在grafana-deployment.yaml文件中
prometheus-adapter-77f8587965-5x7bn的镜像在prometheusAdapter-deployment.yaml文件中
node-exporter-w7lrs的镜像在nodeExporter-daemonset.yaml文件中

思路二:也可以通过在线编辑的方法直接修改镜像地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#用prometheus-adapter-77f8587965-5x7bn举例
[root@k8s-master01 manifests]# kubectl edit pod -n monitoring prometheus-adapter-77f8587965-5x7bn
#找到spec.containers.image参数,修改为自己的镜像仓库(前提是已经将镜像同步到自己的仓库中了)
42 image: registry.cn-beijing.aliyuncs.com/k8s-liujunwei/prometheus-adapter:v0.12.0

#修改后保存退出,程序会自动更新配置,再次检查pod,已经正常运行
[root@k8s-master01 manifests]# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 15h
blackbox-exporter-75c7985cb8-xkxrs 3/3 Running 0 15h
grafana-664dd67585-mh7tb 1/1 Running 0 15h
kube-state-metrics-bbcd9ff4f-8c5vq 3/3 Running 0 15h
node-exporter-7b428 2/2 Running 0 15h
node-exporter-m2g8z 2/2 Running 0 15h
node-exporter-nvpz5 2/2 Running 0 15h
node-exporter-w7lrs 2/2 Running 0 15h
node-exporter-wwtnm 2/2 Running 0 15h
prometheus-adapter-77f8587965-5x7bn 1/1 Running 0 15h
prometheus-adapter-77f8587965-wgp55 1/1 Running 0 15h
prometheus-k8s-0 2/2 Running 0 12h
prometheus-operator-6f9479b5f5-4zpfm 2/2 Running 0 15h


#让我们来详细解释一下这些 Pod 的功能和作用:
1.prometheus-operator-6f9479b5f5-4zpfm:这是整个 Prometheus 监控栈的控制器,负责管理和维护 Prometheus 相关的自定义资源(CRD),自动化部署和管理 Prometheus 实例、配置等

2.prometheus-k8s-0:核心的 Prometheus 服务器实例,负责收集、存储时序数据,执行数据查询和告警规则评估

3.alertmanager-main-0:负责告警管理和通知,处理来自 Prometheus 的告警,提供告警分组、抑制、静默等功能,支持多种通知方式(邮件、Slack、webhook等)

4.grafana-664dd67585-mh7tb:可视化平台,提供丰富的数据可视化界面,支持创建各种监控面板,可以展示 Prometheus 采集的数据

5.node-exporter-*(多个实例):部署在每个节点上的数据采集器,收集主机级别的监控指标,如:CPU、内存、磁盘、网络等系统层面的数据

6.kube-state-metrics-bbcd9ff4f-8c5vq:收集 Kubernetes 对象的状态指标,监控 Pod、Deployment、StatefulSet 等资源的状态,提供集群层面的监控数据

7.blackbox-exporter-75c7985cb8-xkxrs:用于探测服务的可用性,支持 HTTP、HTTPS、DNS、TCP、ICMP 等协议探测,可以监控服务的响应时间、可用性等

8.prometheus-adapter-77f8587965-*(两个实例):实现了自定义指标 API,使 Kubernetes HPA 可以使用 Prometheus 指标进行自动扩缩容,将 Prometheus 指标转换为 Kubernetes 可用的指标格式

#这些组件协同工作形成了一个完整的监控体系:
node-exporter 收集每个节点的系统级别资源的数据。
kube-state-metrics 采集 Kubernetes 资源的状态数据。
blackbox-exporter 用于探测外部服务的可用性。
Prometheus :采集和存储指标数据。
Alertmanager 处理和分发告警。
Grafana 提供指标的可视化展示。
Prometheus Operator 管理整个监控栈,管理和部署 Prometheus 及其相关组件。
Prometheus Adapter 将 Prometheus 指标数据暴露给 Kubernetes HPA,用于自动伸缩。使监控指标可用于集群的自动化运维。
#这样的架构既能监控基础设施,也能监控应用服务,同时支持告警和可视化,是一个非常完整的监控解决方案。

3.访问Grafana和Prometheus

新版本添加了NetworkPolicy,导致无法访问Grafana和Prometheus等服务,执行删除即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@k8s-master01 manifests]# kubectl delete  networkpolicy --all  -n monitoring
networkpolicy.networking.k8s.io "alertmanager-main" deleted
networkpolicy.networking.k8s.io "blackbox-exporter" deleted
networkpolicy.networking.k8s.io "grafana" deleted
networkpolicy.networking.k8s.io "kube-state-metrics" deleted
networkpolicy.networking.k8s.io "node-exporter" deleted
networkpolicy.networking.k8s.io "prometheus-adapter" deleted
networkpolicy.networking.k8s.io "prometheus-k8s" deleted
networkpolicy.networking.k8s.io "prometheus-operator" deleted

#再次查看已经没有相关资源
[root@k8s-master01 manifests]# kubectl get networkpolicy -n monitoring
No resources found in monitoring namespace.

将alertmanager-main、grafana、prometheus-k8s三个Service改成NodePort类型:

将Grafana的Service改成NodePort类型:

1
2
3
4
5
6
7
8
9
10
11
12
[root@k8s-master01 manifests]# kubectl edit svc -n monitoring  grafana
apiVersion: v1
kind: Service
...
selector:
app.kubernetes.io/component: grafana
app.kubernetes.io/name: grafana
app.kubernetes.io/part-of: kube-prometheus
sessionAffinity: None
type: NodePort #将type的原值ClusterIP改为NodePort
status:
loadBalancer: {}

查看Grafana的Service暴露的端口,通过该端口访问grafana:

1
2
3
4
#grafana的NodePort为30391
[root@k8s-master01 manifests]# kubectl get svc -n monitoring grafana
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
grafana NodePort 10.96.250.130 <none> 3000:30391/TCP 20h

之后可以通过任意一个安装了kube-proxy服务的节点IP+32293端口即可访问到Grafana,如果浏览器无法访问执行删除网络策略:

1
2
3
4
5
6
7
8
9
10
#删除网络策略
[root@k8s-master01 manifests]# kubectl delete networkpolicy --all -n monitoring
networkpolicy.networking.k8s.io "alertmanager-main" deleted
networkpolicy.networking.k8s.io "blackbox-exporter" deleted
networkpolicy.networking.k8s.io "grafana" deleted
networkpolicy.networking.k8s.io "kube-state-metrics" deleted
networkpolicy.networking.k8s.io "node-exporter" deleted
networkpolicy.networking.k8s.io "prometheus-adapter" deleted
networkpolicy.networking.k8s.io "prometheus-k8s" deleted
networkpolicy.networking.k8s.io "prometheus-operator" deleted

Prometheus控制台:

Grafana控制台:Grafana默认登录的账号密码为admin/admin


alertmanager控制台:

4.数据持久化

4.1grafana数据持久化

kube-prometheus 项目中 Grafana 的默认部署(grafana-deployment.yaml)里,/var/lib/grafana 挂载的是 **emptyDir**,而不是 PVC。所以 Pod/Deployment 重建后,Grafana 里手动创建的 dashboard、数据源、用户等都会丢失。

我是直接拿 manifests/ 目录 kubectl apply -f 的方式部署(不是自己走 jsonnet 编译流程),最直接、改动最小的办法就是:手动创建一个 PVC,然后修改 grafana-deployment.yaml,把 volume 从 emptyDir 换成 PVC。

信息确认:

1
2
3
4
5
6
7
我的Grafana 部署在 monitoring 命名空间中(kube-prometheus 默认);
我的Grafana副本数是1, replicas: 1(如果副本是 1,PVC 用 ReadWriteOnce 没问题;如果是多副本,必须用ReadWriteMany);
PVC 大小先给10Gi,可以自行调整;
我的集群中已经部署好了存储CubeFS:
[root@k8s-master01 release-0.14]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
cfs-sc (default) csi.cubefs.com Delete Immediate true 195d

第1步:创建 Grafana 需要的 PVC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
vim grafana-pvc.yaml
#内容如下
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana-storage
namespace: monitoring
labels:
app.kubernetes.io/name: grafana
app.kubernetes.io/component: grafana
app.kubernetes.io/part-of: kube-prometheus
spec:
accessModes:
- ReadWriteMany
storageClassName: cfs-sc
resources:
requests:
storage: 10Gi

创建该pvc资源:

1
2
3
4
5
[root@k8s-master01 manifests]# kubectl create -f grafana-pvc.yaml
persistentvolumeclaim/grafana-storage created
[root@k8s-master01 manifests]# kubectl get pvc -n monitoring
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
grafana-storage Bound pvc-6092c93c-07ad-41f7-9d3c-14e7a0f54d66 10Gi RWX cfs-sc <unset> 15s

第 2 步:修改 grafana-deployment.yaml,把 emptyDir 换成 PVC

先看一下 manifests/grafana-deployment.yaml目录里现在的定义:

1
2
3
4
5
6
7
8
9
10
# 正常你会看到类似这样的片段(在 volumes: 里):
160 volumes:
161 - emptyDir: {}
162 name: grafana-storage

#把上述volumes中定义的emptyDir改成
volumes:
- name: grafana-storage #这里定义的是卷名,会在volumeMounts引用,将该pvc挂载到/var/lib/grafana(见58行附近)
persistentVolumeClaim:
claimName: grafana-storage #这里指定的是在第一步中创建的pvc的名字,需要保持一致

第3步:更新应用

1
2
[root@k8s-master01 kube-prometheus-release-0.14]# kubectl replace -f manifests/grafana-deployment.yaml
deployment.apps/grafana replaced

第4步:检查配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 等待pod重启后检查挂载是否成效
[root@k8s-master01 kube-prometheus-release-0.14]# kubectl get po -n monitoring |grep grafana
grafana-765f8849f-6c9d5 0/1 Running 0 33s
grafana-77857544b8-lsqgn 1/1 Running 0 90m
# grafana-765f8849f-6c9d5 新pod启动完成后就会销毁旧pod(grafana-77857544b8-lsqgn)

# 验证挂载
[root@k8s-master01 kube-prometheus-release-0.14]# kubectl exec -ti -n monitoring grafana-765f8849f-6c9d5 -- sh

/usr/share/grafana $ df -h
Filesystem Size Used Available Use% Mounted on
overlay 98.9G 15.6G 83.4G 16% /
tmpfs 64.0M 0 64.0M 0% /dev
tmpfs 200.0M 0 200.0M 0% /tmp
tmpfs 200.0M 4.0K 200.0M 0% /etc/grafana
/dev/mapper/rl-root 98.9G 15.6G 83.4G 16% /etc/hosts
/dev/mapper/rl-root 98.9G 15.6G 83.4G 16% /dev/termination-log
/dev/mapper/rl-root 98.9G 15.6G 83.4G 16% /etc/hostname
/dev/mapper/rl-root 98.9G 15.6G 83.4G 16% /etc/resolv.conf
shm 64.0M 0 64.0M 0% /dev/shm
cubefs-pvc-6092c93c-07ad-41f7-9d3c-14e7a0f54d66
10.0G 1.8M 10.0G 0% /var/lib/grafana
# 已经成功将cubefs-pvc-6092c93c-07ad-41f7-9d3c-14e7a0f54d66挂载到/var/lib/grafana
# 此时在登录 Grafana,修改用户密码,配置监控模板,删除pod后重新登录数据都还在就说明持久化配置成功。

将密码重置为asdqwe123@ ,将pod删除重建后还是用修改后的密码登录,默认密码admin就失效了证明持久化成功

4.2Prometheus数据持久化

Prometheus:存的是所有的时序监控数据(metrics 历史数据),emptyDir 意味着 Pod 重启/重新调度、节点故障、版本升级都会导致监控数据全部丢失,kubectl top、历史图表、告警回溯全部没了。这个必要性其实比 Grafana 更高。

Prometheus 和 Alertmanager 的持久化是 Prometheus Operator 官方支持的标准字段(不像 Grafana 那样需要手动改 emptyDir),只需要在对应的 CR(Prometheus/Alertmanager 资源)里加 spec.storage.volumeClaimTemplate 即可,Operator 会自动帮你把底层 StatefulSet 换成用 PVC。

第 1 步:查看当前 CR 名称

kube-prometheus 默认部署的资源名一般是 k8s(Prometheus)和 main(Alertmanager),确认一下:

1
2
3
4
5
6
[root@k8s-master01 manifests]# kubectl -n monitoring get prometheus
NAME VERSION DESIRED READY RECONCILED AVAILABLE AGE
k8s 2.54.1 1 1 True True 292d
[root@k8s-master01 manifests]# kubectl -n monitoring get alertmanager
NAME VERSION REPLICAS READY RECONCILED AVAILABLE AGE
main 0.27.0 1 1 True True 292d

第 2 步:给 Prometheus 加持久化

编辑 manifests/prometheus-prometheus.yaml(如果是改本地 manifests 后 apply 的话),在 spec: 下加 storage

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
vim manifests/prometheus-prometheus.yaml
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.54.1
name: k8s
namespace: monitoring
spec:
# 添加storage字段部分
storage:
volumeClaimTemplate:
spec:
storageClassName: cfs-sc #指定的是 Kubernetes 的 StorageClass 名称,我集群中部署的存储是cubefs
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Gi
alerting:
alertmanagers:
- apiVersion: v2
name: alertmanager-main
namespace: monitoring
port: web
enableFeatures: []
externalLabels: {}
image: quay.io/prometheus/prometheus:v2.54.1
nodeSelector:
kubernetes.io/os: linux
podMetadata:
labels:
app.kubernetes.io/component: prometheus
app.kubernetes.io/instance: k8s
app.kubernetes.io/name: prometheus
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 2.54.1
podMonitorNamespaceSelector: {}
podMonitorSelector: {}
probeNamespaceSelector: {}
probeSelector: {}
replicas: 1
resources:
requests:
memory: 400Mi
ruleNamespaceSelector: {}
ruleSelector: {}
scrapeConfigNamespaceSelector: {}
scrapeConfigSelector: {}
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 1000
serviceAccountName: prometheus-k8s
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector: {}
version: 2.54.1

添加13行到21行的配置,配置后的结果如图所示:

第3步:更新应用即可

1
2
[root@k8s-master01 manifests]# kubectl replace  -f prometheus-prometheus.yaml
prometheus.monitoring.coreos.com/k8s replaced

第4步:验证挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 等待pod重启后查看容器内的挂载
[root@k8s-master01 manifests]# kubectl exec -ti -n monitoring prometheus-k8s-0 sh -- df -h
Filesystem Size Used Available Use% Mounted on
overlay 98.9G 15.6G 83.3G 16% /
tmpfs 64.0M 0 64.0M 0% /dev
cubefs-pvc-581d53e3-5dc2-4bd5-938c-35eb8af75aa9
100.0G 31.8M 100.0G 0% /prometheus #这里是配置的持久化存储
/dev/mapper/rl-root 98.9G 15.6G 83.3G 16% /etc/hosts
/dev/mapper/rl-root 98.9G 15.6G 83.3G 16% /dev/termination-log
/dev/mapper/rl-root 98.9G 15.6G 83.3G 16% /etc/hostname
/dev/mapper/rl-root 98.9G 15.6G 83.3G 16% /etc/resolv.conf
shm 64.0M 0 64.0M 0% /dev/shm
tmpfs 7.4G 72.0K 7.4G 0% /etc/prometheus/config_out
tmpfs 7.4G 0 7.4G 0% /etc/prometheus/certs
/dev/mapper/rl-root 98.9G 15.6G 83.3G 16% /etc/prometheus/rules/prometheus-k8s-rulefiles-0
tmpfs 7.4G 0 7.4G 0% /etc/prometheus/web_config/web-config.yaml
tmpfs 7.4G 12.0K 7.4G 0% /var/run/secrets/kubernetes.io/serviceaccount
tmpfs 3.7G 0 3.7G 0% /proc/acpi
tmpfs 64.0M 0 64.0M 0% /proc/kcore
tmpfs 64.0M 0 64.0M 0% /proc/keys
tmpfs 64.0M 0 64.0M 0% /proc/timer_list
tmpfs 3.7G 0 3.7G 0% /proc/scsi
tmpfs 3.7G 0 3.7G 0% /sys/firmware

4.3Alertmanager 数据持久化

同样编辑 manifests/alertmanager-alertmanager.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
vim manifests/alertmanager-alertmanager.yaml
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
labels:
app.kubernetes.io/component: alert-router
app.kubernetes.io/instance: main
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 0.27.0
name: main
namespace: monitoring
spec:
#image: quay.io/prometheus/alertmanager:v0.27.0
image: registry.cn-beijing.aliyuncs.com/k8s-liujunwei/alertmanager:v0.27.0
nodeSelector:
kubernetes.io/os: linux
# 添加storage配置
storage:
volumeClaimTemplate:
spec:
storageClassName: cfs-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi # alertmanager 数据量很小,几个 G 足够
podMetadata:
labels:
app.kubernetes.io/component: alert-router
app.kubernetes.io/instance: main
app.kubernetes.io/name: alertmanager
app.kubernetes.io/part-of: kube-prometheus
app.kubernetes.io/version: 0.27.0
replicas: 1
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 4m
memory: 100Mi
secrets: []
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 1000
serviceAccountName: alertmanager-main
version: 0.27.0

添加17行到25行的内容,修改后的配置如图所示:

重新应用配置即可:

1
kubectl apply -f manifests/alertmanager-alertmanager.yaml

验证参考上述4.2中的第四步即可。