一、Prometheus Operator & Kube-Prometheus & Helm chart 部署区别¶
Prometheus Operator 是 Kubernetes 原生的工具,它通过将 Prometheus 资源定 义为 Kubernetes 对象(CRD)来简化 Prometheus 集群的管理。它自动化了在 Kubernetes 中配置和扩展 Prometheus 实例时涉及的常见任务,并提供了在 Kubernetes 环境中部署、配置和管理 Prometheus 的简单方式。
-
- 通过 kubectl 或 Kubernetes API 创建 Prometheus Operator Custom Resource Definition (CRD)。
-
- 使用 kubectl 或 YAML 文件创建 Prometheus 实例的定义。
-
- Prometheus Operator 观察配置更改并创建、更新或删除 Prometheus 实例。
- 官方安装文档: https://prometheus-operator.dev/docs/user-guides/getting -started/ 需要Kubernetes版本至少在v1.16.x以上。
- 官方Github地址:https://github.com/prometheus-operator/prometheus-operator
kube-prometheus 提供基于Prometheus & Prometheus Operator完整的集群监控配置示例,包括多实例Prometheus & Alertmanager部署与配置及node exporter的metrics采集,以及scrape Prometheus target各种不同的metrics endpoints,并提供Alerting rules一些示例,触发告警集群潜在的问题。
- Kube-Prometheus 部署 Prometheus、Alertmanager、Grafana 和 Pushgateway 等组件。
- 使用 Prometheus Operator 观察和管理 Prometheus 和相关组件。
- 官方安装文档:https://prometheus-operator.dev/docs/prologue/quick-start/
- 安装要求:https://github.com/prometheus-operator/kube-prometheus#co mpatibility
- 官方Github地址:https://github.com/prometheus-operator/kube-prometh eus
helm chart prometheus-community/kube-prometheus-stack 提供类似kube- prometheus的功能,但是该项目是由Prometheus-community来维护。
- 1.安装 Helm 并添加 Prometheus Helm chart 存储库。
- 2.使用 Helm 安装 Prometheus chart,包括 Prometheus、Alertmanager 和 Pushgateway 等组件。
- 具体信息参考https://github.com/prometheus-community/helm-charts/tre e/main/charts/kube-prometheus-stack#kube-prometheus-stack
总结:三者部署 Prometheus 的区别
- Prometheus Operator 可以更加自动化的管理 Prometheus 集群;
- Kube-Prometheus 则提供了更加全面的监控解决方案,包括 Prometheus、 Grafana 和 Alertmanager 等组件;
- Helm chart 则通过一个命令即可快速部署 Prometheus 及其相关组件,但无法方便地进行各个组件的管理。
Kube-Prometheus:目前是k8s集群监控的主流项目,主要使用Prometheus做集群监控,使用Prometheus Operator做监控的运维管理,也就是以上二者的结合。
二、Prometheus-Operator CRD资源¶
2.1 CRD 全称是 Custom Resource Definition¶
什么是 CRD?
以 Deployment 为实例,Deployment 没有直接创建 Pod,而是管理 RS,而 RS 管理 Pod,这就是控制器模式。控制器模式允许基于已有的资源定义更高阶的控制器,用来实现更复杂的能力。

特点:
- CRD 本身是 Kubernetes 的一种资源,允许用户自定义新的资源类型;
- CRD 允许用户基于已有的 Kubernetes 资源,例如 Deployment、Configmap 等, 拓展集群能力;
- CRD 可以自定义一套成体系的规范,自造概念;
CRD 本身是一种 Kubernetes 内置的资源类型,即自定义资源的定义,用于描述用户定义的资源是什么样子。
# kubectl get crd
NAME CREATED AT
addresspools.metallb.io 2025-04-06T23:57:09Z
2.2 Prometheus-Operator CRD¶
Prometheus Operator的本职就是一组用户自定义的 CRD资源以及 Controller的实现, Prometheus Operator负责监听这些自定义资源的变化,并且根据这些资源的定义自动化的完成如 Prometheus Server自身以及配置的自动化管理工作。主要包括以下几个功能:
- Kubernetes 自定义资源:使用 Kubernetes CRD 来部署和管理 Prometheus、 Alertmanager 和相关组件。
- 简化的部署配置:直接通过 Kubernetes 资源清单配置 Prometheus,比如版本、 持久化、副本、保留策略等等配置。
- Prometheus 监控目标配置:基于熟知的 Kubernetes 标签查询自动生成监控目标 配置,无需学习 Prometheus 特地的配置。

上面架构图中,各组件以不同的方式运行在 Kubernetes 集群中(之前都是用配置文件 来配置,现在都是通过资源对象):
| CRD 名称 | 作用 |
|---|---|
| Operator | 根据自定义资源(Custom Resource Definition / CRDs)来部署和管理 Prometheus Server,同时监控这些自定义资源事件的变化来做相应的处理,是整个系统的控制中心。 |
| Prometheus | 最核心的一个CRD, 控制prometheus server的statefulset状 态。该CRD用于部署、管理prometheus stateful实例,以及 配置该prometheus实例与ServiceMonitor(通过 serviceMonitorNamespaceSelector标签)、Altermanager(通 过alertmanagers标签)、PromtheusRule(通过ruleSelector标 签)之间的关联。 一个Prometheus crd 资源创建后, promtheus-operator会自动创建一个prometheus stateful实例。 |
| Prometheus Server | Operator 根据自定义资源 Prometheus 类型中定义的内容而 部署的 Prometheus Server 集群,这些自定义资源可以看作 是用来管理 Prometheus Server 集群的 StatefulSets 资源。 |
| ServiceMonitor | 纯配置,Operator告诉prometheus server , 要监控的 targets是基于k8s service动态发现。 Operator基于 servicemonitor的配置生成promtheus的标准配置文件 promtheus.yml。注意的是,ServiceMonitor中的endpoint 被转换为prometheus.yml中的kubernetes_sd_configs标签, 即服务发现仍然是通过prometheus的原生能力完成的, ServiceMonitor或prometheus-operator并不具备服务发现能力,仅仅是配置转换与应用能力。 |
| Service | 简单的说就是 Prometheus 监控的对象。提供给 ServiceMonitor选取,让Prometheus Server来获取信息。 |
| Alertmanager | 用于部署和管理promtheus的Altermanager实例.一个 Altermanager资源定义会对应于一个stateful实例, prometheus-opertaor会根据Alertmanager中指定replicas、 image、RBAC等信息将promtheus的altermanager pod部署,prometheus实例会自动与该Alertmanager相关联,共同完成监控->告警的链路。 |
| PrometheusRule | 用于生成promtheus的告警规则文件.纯配置项。promtheus- operator会将该资源转换为prometheus的rule文件,挂在于 prometheus实例的文件系统中。 |
三、部署Kube-Prometheus¶
3.1 概述¶
kube-prometheus 是一整套监控解决方案,它使用 Prometheus 采集集群指标, Grafana 做展示,包含如下组件:
- The Prometheus Operator
- Highly available Prometheus
- Highly available Alertmanager
- Prometheus node-exporter
- Prometheus Adapter for Kubernetes Metrics APIs (k8s-prometheus- adapter)
- kube-state-metrics
- Grafana
注意:kube-promethues与kubernetes的版本对应关系如下:


这里k8s版本为1.26.9,选择release-0.14版本进行下面部署
[root@master01 7]# kg node
NAME STATUS ROLES AGE VERSION
master01 Ready control-plane 268d v1.26.9
master02 Ready control-plane 268d v1.26.9
master03 Ready control-plane 268d v1.26.9
node01 Ready <none> 268d v1.26.9
node02 Ready <none> 268d v1.26.9
3.2 下载 Kube-Prometheus代码¶
方法一:
git clone https://github.com/prometheus-operator/kube-prometheus.git
cd kube-prometheus
git branch -r # 查看当前分支有哪些
git checkout release-0.14 # 切换到自己 Kubernetes 兼容的版本
方法二:
git clone -b release-0.14 https://github.com/prometheus-operator/kube-prometheus.git
注意事项:在 release-0.11 版本之后新增了 NetworkPolicy ;默认是允许自己访问,如果了解 NetworkPolicy 可以修改一下默认的规则,可以用查看 ls networkPolicy ,如果不修改,则会影响到修改 NodePort 类型也无法访问;如果不会Networkpolicy可以直接删除就行
3.3 修改 Kube-Prometheus 镜像源¶
国外镜像源某些镜像无法拉取,我们这里修改prometheus-operator,prometheus,alertmanager,kube-state-metrics,node-exporter,prometheus-adapter的镜像源为国内镜像源。这里使用的是中科大的镜像源。
# 进入修改的目录
cd /root/7/kube-prometheus/manifests
# 1. quay.io/prometheus 系列镜像替换
sed -i 's#quay.io/prometheus/alertmanager#registry.cn-hangzhou.aliyuncs.com/github_images1024/alertmanager#g' alertmanager-alertmanager.yaml
sed -i 's#quay.io/prometheus/blackbox-exporter#registry.cn-hangzhou.aliyuncs.com/github_images1024/blackbox-exporter#g' blackboxExporter-deployment.yaml
sed -i 's#quay.io/prometheus/node-exporter#registry.cn-hangzhou.aliyuncs.com/github_images1024/node-exporter#g' nodeExporter-daemonset.yaml
sed -i 's#quay.io/prometheus-operator/prometheus-operator#registry.cn-hangzhou.aliyuncs.com/github_images1024/prometheus-operator#g' prometheusOperator-deployment.yaml
sed -i 's#quay.io/prometheus/prometheus#registry.cn-hangzhou.aliyuncs.com/github_images1024/prometheus#g' prometheus-prometheus.yaml
# 2. quay.io/brancz 镜像替换
sed -i 's#quay.io/brancz/kube-rbac-proxy#registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-rbac-proxy#g' blackboxExporter-deployment.yaml kubeStateMetrics-deployment.yaml nodeExporter-daemonset.yaml prometheusOperator-deployment.yaml
# 3. ghcr.io 镜像替换
sed -i 's#ghcr.io/jimmidyson/configmap-reload#registry.cn-hangzhou.aliyuncs.com/github_images1024/configmap-reload#g' blackboxExporter-deployment.yaml
# 4. grafana官方镜像替换
sed -i 's#grafana/grafana#registry.cn-hangzhou.aliyuncs.com/github_images1024/grafana#g' grafana-deployment.yaml
# 5. registry.k8s.io 镜像替换
sed -i 's#registry.k8s.io/kube-state-metrics#registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-state-metrics#g' kubeStateMetrics-deployment.yaml
sed -i 's#registry.k8s.io/prometheus-adapter#registry.cn-hangzhou.aliyuncs.com/github_images1024/prometheus-adapter#g' prometheusAdapter-deployment.yaml
# 版本保持验证命令(执行后检查版本是否一致):
[root@master01 manifests]# grep "image: " * -r
alertmanager-alertmanager.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/alertmanager:v0.27.0
blackboxExporter-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/blackbox-exporter:v0.25.0
blackboxExporter-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/configmap-reload:v0.13.1
blackboxExporter-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-rbac-proxy:v0.18.1
grafana-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/grafana:11.2.0
kubeStateMetrics-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-state-metrics:v2.13.0
kubeStateMetrics-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-rbac-proxy:v0.18.1
kubeStateMetrics-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-rbac-proxy:v0.18.1
nodeExporter-daemonset.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/node-exporter:v1.8.2
nodeExporter-daemonset.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-rbac-proxy:v0.18.1
prometheusAdapter-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/google_containers/github_images1024/prometheus-adapter:v0.12.0
prometheusOperator-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/prometheus-operator:v0.76.2
prometheusOperator-deployment.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/kube-rbac-proxy:v0.18.1
prometheus-prometheus.yaml: image: registry.cn-hangzhou.aliyuncs.com/github_images1024/prometheus:v2.54.1
3.4 安装operator & kube-Prometheus¶
创建namespace & CRD资源,如下:
setup 文件夹中包含所有自定义资源配置 CustomResourceDefinition(一般不用修改,也不要轻易修改)
# 下载prometheus-operator镜像需要花费几分钟,这里等待几分钟,直到prometheus-operator变成running状态
cd /root/7/kube-prometheus/
kubectl create -f manifests/setup
创建所有应用资源:
kubectl create -f manifests/
# 等待所有镜像变成Running状态
watch kubectl get po -n monitoring
需要关注的几个控制器文件:
prometheus-adapter-deployment.yaml:kubernetes自定义监控指标
blackbox-exporter-deployment.yaml:黑盒监控控制器
kube-state-metrics-deployment.yaml:监听API Server生成有关资源对象的状态指标
setup/prometheus-operator-deployment.yaml:prometheus-operator控制器文件
prometheus-prometheus.yaml:prometheus主控制器文件
alertmanager-alertmanager.yaml:alertmanager主控制器文件
grafana-deployment.yaml:grafana主控制器文件
删除所有资源:
cd /root/7/kube-prometheus/
kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
3.5 配置Ingress资源对象¶
cd /root/7/
cat > prometheus-all-ingress.yaml << 'EOF'
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: monitoring
name: prometheus-ingress
spec:
ingressClassName: nginx
rules:
- host: grafana-opera.zhang-qing.com # 访问 Grafana 域名
http:
paths:
- pathType: Prefix
backend:
service:
name: grafana
port:
number: 3000
path: /
- host: prometheus-opera.zhang-qing.com # 访问 Prometheus 域名
http:
paths:
- pathType: Prefix
backend:
service:
name: prometheus-k8s
port:
number: 9090
path: /
- host: alertmanager-opera.zhang-qing.com # 访问 alertmanager 域名
http:
paths:
- pathType: Prefix
backend:
service:
name: alertmanager-main
port:
number: 9093
path: /
EOF
# 应用
[root@master01 7]# kaf prometheus-all-ingress.yaml
# 验证
[root@master01 7]# kgi -n monitoring
NAME CLASS HOSTS ADDRESS PORTS AGE
prometheus-ingress nginx grafana-opera.zhang-qing.com,prometheus-opera.zhang-qing.com,alertmanager-opera.zhang-qing.com 10.0.0.11 80 3m54s
四、访问验证¶
访问前删除掉网络策略,否则影响正常访问
[root@master01 7]# k delete networkpolicy -n monitoring --all
# 验证
[root@master01 7]# kg networkpolicy -n monitoring
4.1 prometheus¶
两个Prometheus实例的, Service 添加 sessionAffinity: ClientIP 属性,会根据 ClientIP 来做 session 亲和性,所以我们不用担心请求会到不同的副本上去。
$ curl prometheus-opera.zhang-qing.com
4.2 granfana¶
$ curl grafana-opera.zhang-qing.com
4.3 alertmanager¶
$ curl alertmanager-opera.zhang-qing.com
五、总结¶
- Prometheus整体监控结构略微复杂,一个个部署并不简单,kube-prometheus大大提升了部署的方式;
- 通过自定义资源CRD维护简单,不用再次维护大量的configmap配置文件,操作流程大大简化;
- Kube-Prometheus 则提供了更加全面的监控解决方案,包括 Prometheus、 Grafana 和 Alertmanager 等组件;
- CoreOS主推Kube-Prometheus,目前是k8s集群监控的主流项目。