部署Prometheus Operator

Prometheus介绍

Prometheus - Monitoring system & time series database

Prometheus 是一个开源的系统监控和报警工具,最初由 SoundCloud 开发,现已成为 CNCF(Cloud Native Computing Foundation) 的一个顶级项目。它采用 时序数据库(TSDB) 存储监控数据,并基于 Pull 模型 从被监控的目标拉取数据。

Prometheus 的核心特性包括:

  1. 多维度数据模型:数据通过 时间序列(time series) 存储,并由 指标(metric)标签(label) 组成。
  2. 高效的存储和查询:基于时间序列的数据库,支持 PromQL(Prometheus Query Language) 查询。
  3. 主动拉取数据(Pull Model):通过 HTTP 的 /metrics 接口 获取数据,支持多种 服务发现(Service Discovery) 方式。
  4. 内置报警机制:可以定义 Alerting Rules,配合 Alertmanager 进行告警处理。
  5. 强大的生态:Prometheus 可以与 Grafana、Kubernetes(K8s)、Thanos、Loki 等工具无缝集成。

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)是致命的,我们需要为他们配置持久化存储。

grafana

直接手动创建pv及pvc,在配置文件绑定即可。

注意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:
    - ReadWriteOnce
  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:
    - ReadWriteOnce
  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
#为prometheus创建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:
    - ReadWriteOnce
  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:
            - ReadWriteOnce
          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

NFS-clinet

nfs-subdir-external-provisioner

prometheus也可以使用NFS-clinet 存储类,来动态的创建pv及pvc

#使用helm安装,添加NFS动态存储类
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update

#如果网络无法更新,手动在其他可以访问的主机上拉helm仓库配置,并上传到服务器。
# 拉取并解压 chart
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --untar
cd nfs-subdir-external-provisioner/
[root@localhost nfs-subdir-external-provisioner]# ls
Chart.yaml  ci  README.md  templates  values.yaml

#如果网络有问题,还需要修改values.yaml配置文件中的nfs-subdir-external-provisioner:v4.0.2镜像地址
#手动拉取镜像
docker pull registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
docker tag registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 you.harbor.com/library/nfs-subdir-external-provisioner:v4.0.2
docker push you.harbor.com/library/nfs-subdir-external-provisioner:v4.0.2

#定位image行修改如下
image:
  repository: you.harbor.com/library/nfs-subdir-external-provisioner
  tag: v4.0.2
  pullPolicy: IfNotPresent
imagePullSecrets: []
#定位nfs按照你的实际nfs服务器修改配置。
nfs:
  server: 192.168.31.227
  path: /data/k8s_pv
  mountOptions:
  volumeName: nfs-subdir-external-provisioner-root
  # Reclaim policy for the main nfs volume
  reclaimPolicy: Retain

# 安装本地 chart
helm install nfs-provisioner ./ -n kube-system

#检查是否安装
kubectl get storageclasses.storage.k8s.io 
NAME         PROVISIONER                                                     RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs          kubernetes.io/no-provisioner                                    Delete          Immediate           false                  39d
nfs-client   cluster.local/nfs-provisioner-nfs-subdir-external-provisioner   Delete          Immediate           true                   28d

prometheus使用nfs-client

#安装完成,编辑kube-prometheus-stack/values.yaml
#找到以下层级 修改storageClassName

## Deploy a Prometheus instance
##
prometheus:
  enabled: true
  prometheusSpec:
    ## Prometheus StorageSpec for persistent data
    ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/platform/storage.md
    ##
    storageSpec: 
    ## Using PersistentVolumeClaim
    ##
      volumeClaimTemplate:
        spec:
          storageClassName: nfs-client
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 50Gi
        selector: {}

#应用更新,nfs-client会自动创建pv-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
#使用nfs-client自动创建的
kubectl get pvc -n monitoring
NAME                                                                                                             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
prometheus-grafana                                                                                               Bound    pv-monitoring                              200Gi      ROX,RWX        nfs            39d
prometheus-prometheus-kube-prometheus-prometheus-db-prometheus-prometheus-kube-prometheus-prometheus-0           Bound    pvc-8ab432cb-45c4-42d9-b2e3-a051083af1e8   50Gi       RWO            nfs-client     13m

如果状态不是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

NFS Subdirectory External Provisioner Helm Repository | NFS Subdirectory External Provisioner Helm Chart

评论

Your browser is out-of-date!

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

×