Prometheus 常见组件
Prometheus 通常与其他工具配合使用,形成完整的监控解决方案:
组件 | 用途 |
---|---|
Prometheus | 采集和存储指标数据 |
Grafana | 可视化监控数据 |
Alertmanager | 处理 Prometheus 告警 |
Loki | 日志聚合,类似 ELK |
Node Exporter | 监控节点 CPU、内存、磁盘 |
kube-state-metrics | 监控 Kubernetes 资源(Pod、Service、Deployment) |
Kubernetes 监控架构
┌─────────────────────────────┐
│ Grafana │ ← 数据可视化
└─────────────────────────────┘
↑
┌─────────────────────────────┐
│ Prometheus Server │ ← 采集数据,执行查询
└─────────────────────────────┘
↑
┌─────────────────────────────┐
│ Node Exporter (主机监控) │ ← 监控 K8s 节点
│ cAdvisor (容器监控) │
│ kube-state-metrics (资源) │
└─────────────────────────────┘
↑
┌─────────────────────────────┐
│ Kubernetes 集群 │ ← 监控 K8s 资源
└─────────────────────────────┘
部署Prometheus Operator
Prometheus Operator 是由社区(CoreOS → Red Hat → CNCF)维护的 Kubernetes 生态组件。用于简化自动部署、管理和扩展 Prometheus 及其组件(Alertmanager、Grafana、Exporter 等)。如果你是 Kubernetes 生产环境,建议使用 Prometheus Operator,自动创建 ServiceMonitor,无需手动配置。
虽然不是 Prometheus 官方项目,但 Prometheus Operator 是 Kubernetes 生态中最推荐的 Prometheus 解决方案!
使用 Helm Chart 部署:
1. 安装helm
Helm 是 Kubernetes 的包管理工具。
- 下载 需要的版本
- 解压(
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz
) - 在解压目录中找到
helm
程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm
)
2. 添加Prometheus Operator镜像源
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
如果服务器访问不了github,可以手动下载压缩包,然后上传到服务器解压
wget https://github.com/prometheus-community/helm-charts/releases/download/kube-prometheus-stack-69.8.2/kube-prometheus-stack-69.8.2.tgz
2.1 检查 kube-prometheus-stack
版本兼容性
不同 kube-prometheus-stack
版本支持的 Kubernetes 版本不同。你可以在 Helm Chart 官方文档 中查看:
📌 方法 1:查看 Chart.yaml
tar -xvf kube-prometheus-stack-69.8.2.tgz
cat kube-prometheus-stack/Chart.yaml | grep kubeVersion
#输出
kubeVersion: '>=1.19.0-0
说明这个 Chart 适用于 Kubernetes 1.19 及以上
📌 方法 2:检查 Helm 兼容性
helm show chart kube-prometheus-stack-69.8.2.tgz
3. 使用 Helm 安装 Prometheus 和 Grafana
helm install prometheus prometheus-community/kube-prometheus-stack --namespace monitoring --create-namespace
这个命令会自动安装:
- Prometheus Operator
- Prometheus
- Alertmanager
- Grafana
- Node Exporter(监控参与运行k8s集群的 Linux 服务器)
- Kube-State-Metrics(监控 Kubernetes 资源)
- cAdvisor(监控容器资源)
4. 检查 Prometheus 和 Grafana 是否运行
kubectl get pods -n monitoring
# 输出示例(所有 Pod 状态应为 `Running`):
NAME READY STATUS RESTARTS AGE
alertmanager-prometheus-kube-prometheus-alertmanager-0 2/2 Running 0 4h47m
prometheus-grafana-578574547b-zdjj5 3/3 Running 0 4h59m
prometheus-kube-prometheus-operator-77855f5bf5-2rf2x 1/1 Running 0 4h59m
prometheus-kube-state-metrics-86bd9c5bb8-x7w58 1/1 Running 0 4h59m
prometheus-prometheus-kube-prometheus-prometheus-0 2/2 Running 0 4h43m
prometheus-prometheus-node-exporter-btwmk 1/1 Running 0 45h
prometheus-prometheus-node-exporter-n8hqt 1/1 Running 0 45h
prometheus-prometheus-node-exporter-vbksg 1/1 Running 0 45h
🚀 如果所有 Pod 都是 Running
,说明 Prometheus 和 Grafana 部署成功!
5. 错误处理
helm install
报错:function "dig" not defined
Error: parse error at (kube-prometheus-stack/templates/prometheus/rules-1.14/prometheus.yaml:45): function "dig" not defined
使用命令helm version
查看版本Helm dig
函数从 Helm 3.7.0 开始支持,如果你的 Helm 版本低于 3.7.0
,就会报 function "dig" not defined
。手动下载最新 Helm重新安装 kube-prometheus-stack
。
helm install
失败:timed out waiting for the condition
你的 helm install
命令失败,报错:
Error: INSTALLATION FAILED: failed pre-install: 1 error occurred:
* timed out waiting for the condition
这个错误通常是因为 Helm 在安装 kube-prometheus-stack
时,某些组件(如 CRD、Prometheus Operator)没有正常启动,导致超时。
使用kubectl get pods -n monitoring
查看未启动的组件, kubectl describe pod <pod-name> -n monitoring
查看具体原因。如果是镜像拉取失败,编辑values.yaml文件重新安装。
修改镜像地址
国内环境访问 quay.io
和 docker.io
可能会受限,导致 Helm 安装失败,比如:
Failed to pull image "quay.io/prometheus/prometheus:v2.45.0"
- 自行给服务器配置代理。
- 不推荐 使用阿里云 / 腾讯云 docker镜像地址以及镜像加速器,可以自行寻找可用的地址。
- 推荐使用本地 Docker,手动下载这些镜像,并推送到 Harbor 私有仓库:
# 登录 Harbor 私有仓库(如果有)
docker login your-harbor-registry.com
# 拉取 Prometheus 镜像
docker pull quay.io/prometheus/prometheus:v2.45.0
docker tag quay.io/prometheus/prometheus:v2.45.0 your-harbor-registry.com/prometheus:v2.45.0
docker push your-harbor-registry.com/prometheus:v2.45.0
# 拉取 Grafana 镜像
docker pull docker.io/grafana/grafana:8.10.5
docker tag docker.io/grafana/grafana:8.10.5 your-harbor-registry.com/grafana:8.10.5
docker push your-harbor-registry.com/grafana:8.10.5
然后修改 values.yaml
:
分别需要修改
kube-prometheus-stack/values.yaml
kube-prometheus-stack/charts/grafana/values.yaml
#寻找以下关键词
#quay.io我在部署的时候可以访问,重点关注docker.io
#kube-prometheus-stack/values.yaml
prometheus:
image:
repository: your-harbor-registry.com/prometheus
tag: v3.2.1
#kube-prometheus-stack/charts/grafana/values.yaml
grafana:
image:
repository: your-harbor-registry.com/grafana
tag: 11.5.2
yaml文件缩进是俩个空格,推荐使用vss编辑。
然后重新安装:先删除之前的失败安装
helm uninstall prometheus -n monitoring
kubectl delete ns monitoring
然后用修改后的 values.yaml
重新安装
helm install prometheus ./kube-prometheus-stack -f values.yaml --namespace monitoring --create-na
配置services
为了可以在k8s外部访问到grafana与Prometheus,可以配置Ingress 或者services为NodePort对外随机端口,本实例使用后者配置NodePort。
grafana
编辑配置文件
vim kube-prometheus-stack/charts/grafana/values.yaml
#查找搜索
service:
enabled: true
type: NodePort # 将服务类型更改为 NodePort
port: 80 # 服务的内部端口
targetPort: 3000 # 服务的目标端口
# 不指定nodePort,Kubernetes 会自动分配一个随机的外部端口(范围是 30000-32767)
#更新配置
`helm upgrade prometheus ./kube-prometheus-stack -n monitoring -f ./kube-prometheus-stack/charts/grafana/values.yaml`
#如果报错请删除之前创建是services
kubectl delete -n monitoring service prometheus-grafana
#查看状态
kubectl get svc -n monitoring | grep grafana
prometheus-grafana NodePort 10.107.37.22 <none> 80:30465/TCP 13d
#访问k8s集群任意IP加端口30465即可访问grafana控制台。
#使用以下命令查看grafana控制台密码
kubectl --namespace monitoring get secrets prometheus-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo
#输出
prom-operator
prometheus-ui
编辑配置文件
vim kube-prometheus-stack/values.yaml
#查找搜索
prometheus:
service:
type: NodePort # 将服务类型更改为 NodePort
port: 9090 # 服务的内部端口
nodePort: 30090
# 不指定nodePort,Kubernetes 会自动分配一个随机的外部端口(范围是 30000-32767)
#更新配置
`helm upgrade prometheus ./kube-prometheus-stack -n monitoring -f ./kube-prometheus-stack/values.yaml`
#如果报错请删除之前创建是services
kubectl delete -n monitoring service prometheus-kube-prometheus-prometheus
#查看状态
kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 13d
prometheus-grafana NodePort 10.107.37.22 <none> 80:30465/TCP 13d
prometheus-kube-prometheus-alertmanager ClusterIP 10.110.68.154 <none> 9093/TCP,8080/TCP 13d
prometheus-kube-prometheus-operator ClusterIP 10.103.189.92 <none> 443/TCP 13d
prometheus-kube-prometheus-prometheus NodePort 10.109.236.168 <none> 9090:30090/TCP,8080:30294/TCP 13d
prometheus-kube-state-metrics ClusterIP 10.98.2.117 <none> 8080/TCP 13d
prometheus-operated ClusterIP None <none> 9090/TCP 13d
prometheus-prometheus-node-exporter ClusterIP 10.110.179.29 <none> 9100/TCP 13d
#访问k8s集群任意IP加端口30090即可访问prometheus-ui
配置持久化
在Prometheus Operator中默认使用的是空目录,也就是数据随容器重启消失。这对于有状态应用(prometheus、grafana)是致命的,我们需要为他们配置持久化存储。
#创建NFS存储类
cat k8s-storageClass-nfs.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
kubectl apply -f k8s-storageClass-nfs.yaml
grafana
请按照顺序一步一步来,PV与PVC是一对一的关系,只能固定绑定在一起,pvc绑定pv的时候需要pv在准备就绪状态。
- 这里使用已有的nfs服务器创建nfs-pv
#为grafana创建pv
#新建文件
cat k8s-pv-nfs-monitoring.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-monitoring #名字
labels:
name: nfs-pv003 #标签
storetype: nfs
spec:
storageClassName: nfs
capacity:
storage: 200Gi
accessModes:
- ReadWriteMany
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /data/k8s_pv/monitoring #NFS共享的路径,请提前创建好并赋予777的权限
server: 192.168.31.227 #NFS服务器
#创建pv
kubectl apply -f k8s-pv-nfs-monitoring.yaml
- 编辑grafana配置文件values,更新应用。
#编辑kube-prometheus-stack/charts/grafana/values.yaml
#找到以下层级修改
persistence:
type: pvc
enabled: true #开启持久化存储
storageClassName: nfs #指定存储类
accessModes:
- ReadWriteMany
size: 10Gi
selector:
matchLabels:
name: nfs-pv003 #指定pv标签
#只需要指定pv即可,helm会创建pvc并绑定,如果之前创建过pvc请删除.
#应用更新
helm upgrade prometheus ./kube-prometheus-stack -n monitoring -f ./kube-prometheus-stack/charts/grafana/values.yaml
prometheus
- 同样的操作使用已有的nfs服务器创建nfs-pv
#为grafana创建pv
#新建文件
cat k8s-pv-nfs-monitoring-prometheus.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-monitoring-prometheus #名字
labels:
name: nfs-pv004 #标签
storetype: nfs
spec:
storageClassName: nfs
capacity:
storage: 200Gi
accessModes:
- ReadWriteMany
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /data/k8s_pv/monitoring/prometheus #NFS共享的路径,请提前创建好并赋予777的权限
server: 192.168.31.227 #NFS服务器
#创建pv
kubectl apply -f k8s-pv-nfs-monitoring-prometheus.yaml
- 编辑prometheus配置文件values,更新应用。
#编辑kube-prometheus-stack/values.yaml
#找到以下层级修改
## Deploy a Prometheus instance
##
prometheus:
enabled: true
prometheusSpec:
storageSpec:
## Using PersistentVolumeClaim
##
volumeClaimTemplate:
spec:
storageClassName: nfs #指定存储类
accessModes:
- ReadWriteMany
selector:
matchLabels:
name: nfs-pv004 #指定pv标签
resources:
requests:
storage: 50Gi
#只需要指定pv即可,helm会创建pvc并绑定,如果之前创建过pvc请删除.
#应用更新
helm upgrade prometheus ./kube-prometheus-stack -n monitoring -f ./kube-prometheus-stack/values.yaml
验证
查看pvc创建及挂载情况
kubectl get pvc -n monitoring
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
prometheus-grafana Bound pv-monitoring 200Gi ROX,RWX nfs 7d21h
prometheus-prometheus-kube-prometheus-prometheus-db-prometheus-prometheus-kube-prometheus-prometheus-0 Bound pv-monitoring-prometheus 200Gi ROX,RWX nfs 5h59m
如果状态不是Bound绑定的使用以下命令查看具体问题。
#查看pods
kubectl get pods -n monitoring
#根据pods查看事件详情
kubectl describe pod <prometheus-pod-name> -n monitoring
kubectl describe pod <grafana-pod-name> -n monitoring
登录NFS服务器,查看挂载目录已有数据:
56[周二 3月 25日-16:20:01root@file-server/data/k8s_pv/monitoring]0#:
ll
总用量 3652
drwx------ 2 472 472 6 3月 17 18:59 csv
-rw-r----- 1 472 472 3739648 3月 25 16:16 grafana.db
drwx------ 2 472 472 6 3月 17 18:59 pdf
drwxr-xr-x 4 472 472 66 3月 17 19:00 plugins
drwx------ 2 472 472 6 3月 17 18:59 png
drwxrwxrwx 3 root root 27 3月 25 10:30 prometheus
root@file-server/data/k8s_pv/monitoring/prometheus/prometheus-db]0#:
ll
总用量 20
drwxr-xr-x 3 vsftp 2000 68 3月 25 13:30 01JQ5WFETVVDWNMWT4DJTT1C0B
drwxr-xr-x 3 vsftp 2000 68 3月 25 15:00 01JQ61KNJ00M5BNZFGPF6XAZ7W
drwxr-xr-x 2 vsftp 2000 34 3月 25 15:01 chunks_head
-rw-r--r-- 1 vsftp 2000 0 3月 25 10:30 lock
-rw-r--r-- 1 vsftp 2000 20001 3月 25 16:20 queries.active
drwxr-xr-x 2 vsftp 2000 70 3月 25 15:00 wal
登录grafana控制台查看数据,重启grafana的pods查看是否还有数分钟前的数据。
kubectl rollout restart -n monitoring deployment prometheus-grafana
参考资料
Grafana OSS and Enterprise | Grafana documentation
Prometheus - Monitoring system & time series database
Prometheus Operator - Running Prometheus on Kubernetes