4. Prometheus Operator 部署:使用 Helm 部署到 K8s 集群
在生产环境中,手动编写 Prometheus、Alertmanager 的 YAML 清单并维护其配置是一项繁琐且易出错的工作。Prometheus Operator 通过引入 Kubernetes 自定义资源定义(CRD)和控制器模式,将 Prometheus 集群的部署、配置、服务发现与告警规则管理全部声明式化。本节将演示如何使用 Helm 3 在 K8s 集群中快速部署 Prometheus Operator,并验证核心组件运行状态。
4.1 部署前提与环境检查
在开始部署前,请确保目标集群满足以下条件:
| 检查项 | 要求 | 验证命令 |
|---|---|---|
| Kubernetes 版本 | ≥ 1.20 | kubectl version --short |
| Helm 版本 | ≥ 3.8 | helm version |
| 集群资源 | 至少 2 核 CPU、4 GB 内存 | kubectl describe node |
| 存储类 | 默认 StorageClass 已配置 | kubectl get sc |
| kubectl 权限 | cluster-admin 或 namespace 管理员 | kubectl auth can-i create crd |
monitoring)中部署 Operator,便于资源隔离和权限管理。后续所有监控组件均部署在该命名空间下。
4.2 添加 Helm 仓库与更新索引
Prometheus Operator 的官方 Helm Chart 由 prometheus-community 维护。执行以下命令添加仓库并拉取最新索引:
# 添加 prometheus-community 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 更新本地仓库缓存
helm repo update
# 搜索可用的 Operator Chart 版本
helm search repo prometheus-community/kube-prometheus-stack --versions
输出示例(版本号以实际为准):
NAME CHART VERSION APP VERSION DESCRIPTION
prometheus-community/kube-prometheus-stack 56.0.0 v0.72.0 kube-prometheus-stack collects Kubernetes...
--version 参数固定 Chart 版本,避免自动升级导致 CRD 不兼容。建议在部署前查阅 Release Notes 确认版本兼容性。
4.3 自定义 values.yaml 配置
直接使用默认参数部署会启动大量组件(如 Grafana、Node Exporter、kube-state-metrics 等)。对于网关 Pod 异常检测场景,我们按需裁剪配置。以下是一个面向生产的最小化 values.yaml 示例:
# values.yaml — 面向网关监控的最小化配置
# 全局设置
global:
rbac:
create: true
pspEnabled: false
# 核心 Operator 配置
prometheusOperator:
enabled: true
logLevel: info
# 启用 CRD 清理,避免残留
cleanupCustomResource: true
# Prometheus 实例配置
prometheus:
enabled: true
# 使用默认的 prometheus 实例名称
prometheusSpec:
replicas: 1
retention: 7d
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1
memory: 2Gi
# 启用对自定义 ServiceMonitor 的自动发现
serviceMonitorSelectorNilUsesHelmValues: false
ruleSelectorNilUsesHelmValues: false
# Alertmanager 配置
alertmanager:
enabled: true
alertmanagerSpec:
replicas: 1
resources:
requests:
cpu: 100m
memory: 256Mi
# 关闭非必需组件
grafana:
enabled: false
kubeStateMetrics:
enabled: false
nodeExporter:
enabled: false
prometheus-node-exporter:
enabled: false
kubelet:
enabled: false
serviceMonitorSelectorNilUsesHelmValues: false— 允许 Operator 发现所有命名空间下的 ServiceMonitor,不局限于 Helm 标签。ruleSelectorNilUsesHelmValues: false— 允许加载所有命名空间下的 PrometheusRule 资源。cleanupCustomResource: true— 卸载 Chart 时自动删除关联的 CRD 实例,避免残留。
4.4 执行 Helm 部署
使用 helm install 命令部署 Prometheus Operator。建议先执行 --dry-run 预览生成的 YAML 清单:
# 创建监控命名空间
kubectl create namespace monitoring
# 预览部署清单(不实际安装)
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--values values.yaml \
--version 56.0.0 \
--dry-run
# 确认无误后执行实际安装
helm install prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--values values.yaml \
--version 56.0.0
部署成功后,Helm 会输出安装摘要:
NAME: prometheus-stack
LAST DEPLOYED: Mon Jan 15 10:30:00 2024
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace monitoring get pods -l "release=prometheus-stack"
4.5 验证部署结果
部署完成后,执行以下命令验证核心组件是否正常运行:
# 查看 Pod 状态
kubectl -n monitoring get pods
# 预期输出示例
NAME READY STATUS RESTARTS AGE
prometheus-stack-kube-prome-operator-7d8f9c6b9f-abc12 1/1 Running 0 2m
prometheus-stack-kube-prome-prometheus-0 2/2 Running 0 2m
prometheus-stack-kube-prome-alertmanager-0 2/2 Running 0 2m
# 查看 CRD 是否注册
kubectl get crd | grep monitoring.coreos.com
# 预期输出
alertmanagerconfigs.monitoring.coreos.com 2024-01-15T10:30:00Z
alertmanagers.monitoring.coreos.com 2024-01-15T10:30:00Z
podmonitors.monitoring.coreos.com 2024-01-15T10:30:00Z
probes.monitoring.coreos.com 2024-01-15T10:30:00Z
prometheuses.monitoring.coreos.com 2024-01-15T10:30:00Z
prometheusrules.monitoring.coreos.com 2024-01-15T10:30:00Z
servicemonitors.monitoring.coreos.com 2024-01-15T10:30:00Z
thanosrulers.monitoring.coreos.com 2024-01-15T10:30:00Z
kubectl -n monitoring port-forward svc/prometheus-stack-kube-prome-prometheus 9090:9090 将 Prometheus Web UI 映射到本地,访问 http://localhost:9090/targets 查看所有采集目标的状态。所有 Target 应显示 UP 状态。
4.6 组件架构与数据流
下图展示了部署完成后,Prometheus Operator 各组件之间的协作关系以及数据采集路径:
4.7 卸载与清理
如需卸载 Prometheus Operator 并清理所有资源(包括 CRD 实例),执行以下命令:
# 卸载 Helm Release(保留 CRD 定义)
helm uninstall prometheus-stack --namespace monitoring
# 彻底删除所有 CRD 实例(谨慎操作)
kubectl delete crd alertmanagerconfigs.monitoring.coreos.com
kubectl delete crd alertmanagers.monitoring.coreos.com
kubectl delete crd podmonitors.monitoring.coreos.com
kubectl delete crd probes.monitoring.coreos.com
kubectl delete crd prometheuses.monitoring.coreos.com
kubectl delete crd prometheusrules.monitoring.coreos.com
kubectl delete crd servicemonitors.monitoring.coreos.com
kubectl delete crd thanosrulers.monitoring.coreos.com
# 删除命名空间(将删除其下所有资源)
kubectl delete namespace monitoring
monitoring.coreos.com 的 CRD,删除 CRD 会导致相关资源无法访问。建议仅当确认无其他依赖时再执行 CRD 删除操作。
4.8 部署后检查清单
完成部署后,使用以下清单逐项确认环境就绪:
| 序号 | 检查项 | 验证方法 | 预期结果 |
|---|---|---|---|
| 1 | Operator Pod 运行中 | kubectl -n monitoring get pod -l app.kubernetes.io/name=prometheus-operator |
1/1 Running |
| 2 | Prometheus Pod 运行中 | kubectl -n monitoring get pod -l app.kubernetes.io/name=prometheus |
2/2 Running |
| 3 | Alertmanager Pod 运行中 | kubectl -n monitoring get pod -l app.kubernetes.io/name=alertmanager |
2/2 Running |
| 4 | CRD 已注册 | kubectl get crd | grep monitoring.coreos.com | wc -l |
≥ 8 |
| 5 | ServiceMonitor 可创建 | kubectl -n monitoring apply -f - <<EOF apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: test spec: endpoints: - port: http selector: matchLabels: app: test EOF |
servicemonitor.monitoring.coreos.com/test created |
| 6 | Prometheus Web UI 可达 | kubectl -n monitoring port-forward svc/prometheus-stack-kube-prome-prometheus 9090:9090 |
浏览器访问 localhost:9090 显示 Targets 页面 |
至此,Prometheus Operator 已成功部署到 K8s 集群中。下一阶段将基于 Operator 的 CRD 体系,为网关 Pod 定义 ServiceMonitor 和 PrometheusRule,实现指标采集与异常检测规则的声明式管理。