kube-prometheus-stack是当前最省心、最接近生产可用的Prometheus部署方案,它封装了prometheus-operator、预置CRD及默认监控组件,避免手写YAML导致的架构缺失问题。

kube-prometheus-stack 是当前最省心、也最接近生产可用的部署方式。手写 YAML 虽然能跑起来,但 ServiceMonitor、RBAC、存储卷、Alertmanager 配置、Grafana 仪表盘联动——这些加起来不是“部署 Prometheus”,而是“从零搭一套监控运维平台”。
别从 Deployment + ConfigMap 开始
你确实可以用几个 YAML 文件把 prom/prometheus 镜像跑起来,但很快会遇到这些问题:
-
scrape_configs里写死static_configs,根本没法自动发现新 Pod 或 Service - 想监控 kube-apiserver、etcd、kube-scheduler 这些组件?它们用的是 TLS 双向认证,
prometheus.yml里得手动配tls_config和service_account,且每次证书轮换都要改 - 没
PrometheusRule,告警规则只能塞进容器里挂载,改一次就得重启 Pod - 没
ServiceMonitor,你自己的应用暴露了/metrics,但 Prometheus 压根不知道该去哪拉
这些不是“配置问题”,是架构缺失。硬补只会让 YAML 越来越长、越来越难维护。
用 Helm 安装 kube-prometheus-stack 的关键动作
它本质是 prometheus-operator + 一整套预置 CRD + 默认监控目标(node-exporter、kube-state-metrics 等)的封装。执行前确保:
- Helm CLI 已安装,且
kubectl能连上集群 - 集群有默认
StorageClass(否则 Prometheus 启不来,报Pending状态) - 命名空间
monitoring已创建:kubectl create namespace monitoring
安装命令示例:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install prometheus prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set prometheus.prometheusSpec.retention="30d" \ --set grafana.enabled=true \ --set alertmanager.enabled=true
注意几个易错点:
-
--set prometheus.prometheusSpec.storageSpec如果要持久化,必须显式指定volumeClaimTemplate,不能只靠默认值 - 如果集群启用了 PodSecurityPolicy 或 PodSecurity Admission,需额外加
--set prometheus.prometheusSpec.securityContext.fsGroup=2000类似参数,否则启动失败 -
grafana.adminPassword默认是随机生成的,想自定义就加--set grafana.adminPassword="xxx"
部署后第一件事:验证 ServiceMonitor 是否生效
Operator 不是装完就自动干活的。它只监听自己 CRD 的变更。你自己的应用要被监控,得自己写一个 ServiceMonitor 并 apply 进集群。
比如你的应用 Service 名叫 my-app,端口是 http-metrics,且 Pod 注解了 prometheus.io/scrape: "true":
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-app-monitor
namespace: monitoring
labels:
release: prometheus
spec:
selector:
matchLabels:
app: my-app
namespaceSelector:
matchNames:
- default
endpoints:
- port: http-metrics
interval: 15s
重点看三处:
-
selector.matchLabels必须和你应用 Service 的labels对得上,不是 Pod 的 label -
namespaceSelector.matchNames写错会导致 Operator 根本不扫描那个命名空间 -
endpoints.port是 Service 的 port 名(不是 targetPort),必须和 Service 定义里ports[].name一致
写完之后,进 Prometheus UI → Status → Targets,搜 my-app,看到状态是 UP 才算真正接入成功。
数据存哪?别信 emptyDir 或默认 PVC
很多教程用 emptyDir 演示,这在生产环境等于没存——Pod 重建,所有指标全丢。而 Helm Chart 默认的 PVC 配置依赖 StorageClass 自动供给,但实际中:
- 某些集群(如阿里云 ACK 托管版)默认 StorageClass 是
alicloud-disk-efficiency,但kube-prometheus-stackChart 默认用standard,导致 PVC 卡在Pending - 如果你用
hostPath,跨节点调度时数据不一致,且无法扩容 - 长期运行必须考虑 retention:默认是 10 天,磁盘爆满后 Prometheus 会拒绝写入,整个监控中断
稳妥做法是显式指定存储:
--set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.storageClassName="alicloud-disk-ssd" \ --set prometheus.prometheusSpec.retention="30d" \ --set prometheus.prometheusSpec.resources.requests.storage="100Gi"
最后提醒一句:Prometheus 本身不是长期存储方案。超过 30 天的数据,该上 Thanos 或对接 MetricStore,别指望单实例扛住半年指标。











