部署Prometheus Operator


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 的包管理工具。

  1. 下载 需要的版本
  2. 解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
  3. 在解压目录中找到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.iodocker.io 可能会受限,导致 Helm 安装失败,比如:

Failed to pull image "quay.io/prometheus/prometheus:v2.45.0"
  1. 自行给服务器配置代理。
  2. 不推荐 使用阿里云 / 腾讯云 docker镜像地址以及镜像加速器,可以自行寻找可用的地址。
  3. 推荐使用本地 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在准备就绪状态。

  1. 这里使用已有的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 
  1. 编辑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

  1. 同样的操作使用已有的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
  1. 编辑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

参考资料

ChatGPT

Grafana OSS and Enterprise | Grafana documentation
Prometheus - Monitoring system & time series database

Prometheus Operator - Running Prometheus on Kubernetes

prometheus-community/helm-charts:Prometheus 社区 Helm 图表

prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×