title: Helm 部署 Prometheus:kube-prometheus-stack 六步跑通 + 3 个 K8s 新手必踩坑
description: Helm 部署 Prometheus 完整教程:kube-prometheus-stack 是什么、六步实操、ServiceMonitor 接入真实应用、Grafana 登录与告警规则。含 3 个 K8s 新手必踩坑。
tags: [prometheus, helm, kubernetes, k8s-monitoring]
lang: zh
date: 2026-10-22
answer: |
K8s 集群监控首选 kube-prometheus-stack:一个 Helm Chart 装 6 个组件(Prometheus + Grafana + Alertmanager + node-exporter + kube-state-metrics + Operator)。六步:装 Helm → 建 namespace → 加 repo → helm install → 验证 pod → 加 ServiceMonitor。
K8s 新手必踩 3 个坑:Grafana 默认密码是 prom-operator(不是 admin)、CRD 装不上导致所有 pod Pending、ServiceMonitor 没打 release label Prometheus 找不到。
faq:
- q: kube-prometheus-stack 和普通 prometheus 有什么区别?
a: 一个是完整栈(含 Grafana、Alertmanager、node-exporter、kube-state-metrics、Prometheus Operator),一个是纯 Prometheus 二进制。栈用 Helm 装、通过 CRD 管理配置,Prometheus 二进制要手写 YAML 且不含告警。K8s 场景必用栈,别用二进制。
- q: Grafana 装完默认密码是什么?
a: kube-prometheus-stack 的默认密码是 prom-operator,不是官方 Grafana 的 admin。admin 用户名不变。登录立刻改,kubectl get secret -n monitoring -o jsonpath="{.data.admin-password}" kube-prometheus-stack-grafana | base64 -d 可以取到实际密码。
- q: ServiceMonitor 建了但 Prometheus 抓不到目标?
a: 99% 是 label 不匹配。kube-prometheus-stack 默认只抓带 release: monitoring 标签的 Service。你的 ServiceMonitor 要加 labels: release: monitoring(值必须是 helm install 时 --name 的值),或者改 values 里的 prometheus.serviceMonitorSelectorNilUsesHelmValues。
Helm 部署 Prometheus:kube-prometheus-stack 六步跑通 + 3 个 K8s 新手必踩坑
Prometheus 单机装法我之前写过了(Prometheus 部署实战),单机够用但一到 K8s 集群就不实用——你不可能在一台 K8s 节点上跑 Prometheus 然后去抓其他节点的 target。K8s 集群监控的正确姿势是 kube-prometheus-stack,一个 Helm Chart 装一整套,含 Prometheus、Grafana、Alertmanager、node-exporter、kube-state-metrics 和 Prometheus Operator。
这篇文章讲怎么从零装起来,然后接入一个真实应用做监控,最后配一条告警规则。K8s 新手必踩的 3 个坑都在最后,装之前先看能省一小时。
概念:kube-prometheus-stack 到底装了什么
装之前先搞清楚 Helm Chart 里都包含哪些组件。搞不清就容易装完找不到 Grafana:
| 组件 | 作用 | 端口 |
|---|---|---|
| prometheus | 抓指标、存 TSDB、跑 PromQL | 9090 |
| grafana | 可视化仪表盘 | 3000 |
| alertmanager | 告警路由、去重、通知 | 9093 |
| node-exporter | 节点 CPU/内存/磁盘指标 | 9100 |
| kube-state-metrics | K8s 对象状态(Pod、Deployment、PVC) | 8080 |
| prometheus-operator | 通过 CRD 管理 Prometheus 配置 | 8080 |
Prometheus Operator 是核心——它把 Prometheus 配置、告警规则、ServiceMonitor 都变成 K8s CRD,你不需要手动 restart Prometheus 加载配置。CRD 就是 Custom Resource Definition,K8s 的扩展机制。
6 步实操
步骤 1:装 Helm 3
你应该看到什么:version.BuildInfo{Version:"v3.x.x"...}。Helm 3 是当前主流,Helm 2 已经 EOL。
步骤 2:建 monitoring namespace
你应该看到什么:monitoring Active 0s。
为什么单独一个 namespace:K8s 生产实践强烈建议工具类组件(Prometheus、Grafana)与业务分开。namespace 是 K8s 的资源隔离单位,也方便后续 RBAC 授权。
步骤 3:加 Helm repo
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 看有哪些 chart
helm search repo prometheus-community/ | head -20
你应该看到什么:末尾输出大量 chart 名,包括 prometheus-community/kube-prometheus-stack。
步骤 4:写 values.yaml(关键!)
默认 values 装出来 Grafana 密码是 prom-operator,retention 15 天,存储无持久化。生产环境建议改:
# values.yaml
# Grafana 改密码
grafana:
adminPassword: "CHANGE_ME_to_a_strong_password"
# Prometheus 保留期 + 存储
prometheus:
prometheusSpec:
retention: 30d
retentionSize: 20GB
storageSpec:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: standard # 按你的集群实际 storageClass 改
resources:
requests:
storage: 20Gi
resources:
requests:
memory: 2Gi
cpu: 1000m
limits:
memory: 4Gi
cpu: 2000m
# 抓自己
ruleStorage:
volumeClaimTemplate:
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: standard
resources:
requests:
storage: 5Gi
# Alertmanager 告警通道
alertmanager:
alertmanagerSpec:
config:
receivers:
- name: "wechat-webhook"
webhook_configs:
- url: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
send_resolved: true
route:
receiver: "wechat-webhook"
group_by: ["alertname", "namespace"]
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
# 装
helm install monitoring prometheus-community/kube-prometheus-stack \
-n monitoring \
-f values.yaml \
--timeout 10m
你应该看到什么:NAME: monitoring / STATUS: deployed / REVISION: 1。
步骤 5:验证 Pod 就绪
# 等所有 pod Ready
kubectl wait --for=condition=Ready pods --all -n monitoring --timeout=300s
# 看 pod 状态
kubectl get pods -n monitoring
你应该看到什么:一堆 pod 都是 Running 状态,READY 列都是 1/1 或 2/2。
# 看 Prometheus Targets
kubectl port-forward -n monitoring svc/monitoring-prometheus 9090:9090 &
# 浏览器打开 http://localhost:9090/targets
你应该看到什么:Targets 页面所有 job 都是绿色 UP 状态。
步骤 6:接入真实应用(ServiceMonitor)
装完 kube-prometheus-stack 只能监控 K8s 自己。要监控你自己的业务应用,得写 ServiceMonitor。假设你的应用已有一个 Service 暴露 /metrics:
# app-servicemonitor.yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: demo-app-monitor
namespace: monitoring
labels:
release: monitoring # 关键!必须是 helm install 时的 release name
spec:
selector:
matchLabels:
app: demo-app
# namespace 匹配需要在别的字段指定,见下
endpoints:
- port: http # Service 里 targetPort 对应的 name
path: /metrics
interval: 30s
namespaceSelector:
any: true
matchNames:
- default # 你的应用所在 namespace
kubectl apply -f app-servicemonitor.yaml
# 30 秒后看 Prometheus Targets 有没有 demo-app
kubectl port-forward -n monitoring svc/monitoring-prometheus 9090:9090 &
# 浏览器 http://localhost:9090/targets 搜索 demo-app
你应该看到什么:Targets 页面出现 demo-app job,状态绿色 UP。
# 在 Grafana 里查一下数据
kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80 &
# 打开 http://localhost:3000 登录,Explore 页写 PromQL
看到有数就成功。
3 个 K8s 新手必踩坑
坑一:Grafana 密码错了登不进去
症状:浏览器打开 Grafana 页面,用 admin/admin 登录报 "Invalid credentials"。
根因:kube-prometheus-stack 默认密码是 prom-operator,不是官方 Grafana 的 admin。
验证:
kubectl get secret -n monitoring monitoring-grafana \
-o jsonpath="{.data.admin-password}" | base64 -d
你应该看到什么:返回一串明文密码,默认是 prom-operator。
修复:立即改密码,或者装的时候用 --set grafana.adminPassword=your_password。
坑二:所有 pod Pending(CRD 未装)
症状:helm install 成功,但 kubectl get pods 显示多个 pod Pending 或 ContainerCreating 卡住。
排查:
你应该看到什么:末尾 Events 里有 FailedCreate: pods "xxx" is forbidden: no matches for kind "ServiceMonitor" in version "monitoring.coreos.com/v1"。
根因:kube-prometheus-stack 依赖一堆 CRD(ServiceMonitor、PrometheusRule、PodMonitor 等)。如果 K8s 版本太老(1.19 以下)或 CRD 安装失败,所有 pod 都会 Pending。
修复:
# 单独装 CRD
helm install monitoring prometheus-community/kube-prometheus-stack \
-n monitoring \
--set crds.enabled=true \
-f values.yaml
# 或确认 K8s 版本 ≥ 1.22
kubectl version --short
坑三:ServiceMonitor 建了 Prometheus 找不到
症状:ServiceMonitor kubectl get servicemonitor 有输出,但 Prometheus Targets 里搜不到对应 job。
根因:ServiceMonitor 的 label 与 Prometheus 的 selector 不匹配。kube-prometheus-stack 默认 prometheus.serviceMonitorSelectorNilUsesHelmValues: true,即只选带 release: monitoring 标签的 ServiceMonitor。
排查:
你应该看到什么:每个 ServiceMonitor 都应有 labels: release: monitoring。
修复:
或者改 values:
权衡:false 会抓到所有 namespace 的 ServiceMonitor,灵活但可能暴露过多 target。生产建议保留默认 true 并显式打 label。
告警规则:PrometheusRule CRD
装完就能配告警,不用改 Prometheus 的 prometheus.yml:
# app-alerts.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: demo-app-alerts
namespace: monitoring
labels:
release: monitoring
spec:
groups:
- name: demo-app.rules
interval: 30s
rules:
- alert: DemoAppDown
expr: up{job="demo-app"} == 0
for: 2m
labels:
severity: critical
team: backend
annotations:
summary: "demo-app 挂了"
description: "demo-app 已经 2 分钟没有响应,最后抓取时间 {{ $labels.instance }}"
- alert: DemoAppHighLatency
expr: |
histogram_quantile(0.95,
rate(http_request_duration_seconds_bucket{job="demo-app"}[5m])
) > 1
for: 10m
labels:
severity: warning
annotations:
summary: "demo-app P95 延迟超 1s"
description: "过去 10 分钟 P95 请求延迟超过 1 秒,当前 {{ $value }}s"
kubectl apply -f app-alerts.yaml
# 验证规则已加载
kubectl port-forward -n monitoring svc/monitoring-prometheus 9090:9090 &
# 浏览器 http://localhost:9090/rules 搜索 DemoApp
你应该看到什么:Rules 页面出现 DemoAppDown 和 DemoAppHighLatency 两条规则,状态 firing: false(说明当前没触发)。
Cheat Sheet:Helm 部署常用命令
| # | 命令 | 用途 |
|---|---|---|
| 1 | helm list -n monitoring |
看已装的 Chart |
| 2 | helm status monitoring -n monitoring |
看 Chart 状态 |
| 3 | helm get values monitoring -n monitoring |
看实际生效的 values |
| 4 | helm get manifest monitoring -n monitoring |
看渲染出的完整 YAML |
| 5 | helm upgrade monitoring ... -f values.yaml |
升级 Chart |
| 6 | helm history monitoring -n monitoring |
看版本历史 |
| 7 | helm rollback monitoring <rev> -n monitoring |
回滚 |
| 8 | helm uninstall monitoring -n monitoring |
卸载 |
| 9 | kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80 |
本地访问 Grafana |
| 10 | kubectl port-forward -n monitoring svc/monitoring-prometheus 9090:9090 |
本地访问 Prometheus |
| 11 | kubectl logs -n monitoring -l app.kubernetes.io/name=prometheus -f |
看 Prometheus 日志 |
| 12 | kubectl get servicemonitor -A |
看所有 ServiceMonitor |
| 13 | kubectl get prometheusrule -A |
看所有告警规则 |
| 14 | kubectl get alertmanager -n monitoring |
看 Alertmanager CRD |
| 15 | kubectl delete pvc -n monitoring -l app.kubernetes.io/name=prometheus |
清 Prometheus 数据(慎用) |
收尾:什么场景该选 Helm,什么场景不该选
该选 kube-prometheus-stack 的场景: - 已有 K8s 集群,1.22+ 版本 - 有运维能力,能读 CRD YAML - 需要 K8s 对象状态指标(kube-state-metrics) - 需要 GitOps 管理(所有配置都是 YAML)
不该选的场景: - 单机 / 少量虚拟机 → 用 Docker 装法 更简单 - 需要 Windows 监控 → 用 Zabbix,Prometheus 生态没好的 Windows exporter - 已经买了 Datadog / New Relic → 别重复造轮子
我个人倾向 kube-prometheus-stack,但坦率说它踩坑门槛比 Docker 装法高——CRD 概念、values 覆盖、ServiceMonitor 选择器这些都要理解到位。装完之后维护成本也不低,尤其是 Prometheus 版本升级、CRD 兼容性这些坑会时不时冒出来。能不能省时间,取决于团队对 K8s 的熟悉程度。
延伸阅读
- Prometheus 部署实战:Docker / systemd / K8s 三种方案 — 单机装法
- PromQL 速查:5 类黄金指标 — PromQL 语法
- Alertmanager 告警规则配置 — 告警路由与静音
- Grafana 部署与仪表盘搭建 — Grafana 单机装法与变量