一、Prometheus Operator & Kube-Prometheus & Helm chart 部署区别

Prometheus Operator 是 Kubernetes 原生的工具,它通过将 Prometheus 资源定 义为 Kubernetes 对象(CRD)来简化 Prometheus 集群的管理。它自动化了在 Kubernetes 中配置和扩展 Prometheus 实例时涉及的常见任务,并提供了在 Kubernetes 环境中部署、配置和管理 Prometheus 的简单方式。

kube-prometheus 提供基于Prometheus & Prometheus Operator完整的集群监控配置示例,包括多实例Prometheus & Alertmanager部署与配置及node exporter的metrics采集,以及scrape Prometheus target各种不同的metrics endpoints,并提供Alerting rules一些示例,触发告警集群潜在的问题。

  1. Kube-Prometheus 部署 Prometheus、Alertmanager、Grafana 和 Pushgateway 等组件。
  2. 使用 Prometheus Operator 观察和管理 Prometheus 和相关组件。
  3. 官方安装文档:https://prometheus-operator.dev/docs/prologue/quick-start/
  4. 安装要求:https://github.com/prometheus-operator/kube-prometheus#co mpatibility
  5. 官方Github地址:https://github.com/prometheus-operator/kube-prometh eus

helm chart prometheus-community/kube-prometheus-stack 提供类似kube- prometheus的功能,但是该项目是由Prometheus-community来维护。

总结:三者部署 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,这就是控制器模式。控制器模式允许基于已有的资源定义更高阶的控制器,用来实现更复杂的能力。

Day07-容器云平台监控一体化-图23

特点:

  • 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 特地的配置。

Day07-容器云平台监控一体化-图25

上面架构图中,各组件以不同的方式运行在 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的版本对应关系如下:

prometheus-operator/kube-prometheus: Use Prometheus to monitor Kubernetes and applications running on Kubernetes (github.com)

Day07-容器云平台监控一体化-图24

image-20250413142506556

这里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集群监控的主流项目。