Prometheus · 集群监控与告警栈
Prometheus 是 yldm K3s 集群的核心监控栈,以 kube-prometheus-stack(Helm chart 79.6.1)的形式部署在 prometheus 命名空间,由 prometheus-operator 用 CRD 管理。它负责采集集群与业务指标,通过 Alertmanager 把告警推送到 Telegram,Prometheus Web UI 经 oauth2-proxy 做 OIDC 鉴权后对外暴露。
整套栈包含 prometheus-operator、Prometheus、Alertmanager、kube-state-metrics、node-exporter 以及一组采集 etcd / Traefik / Consul 的 ServiceMonitor,所有组件统一调度到 workload: infra 节点。本仓库目录 applications/observability/prometheus/ 里既有 Helm 渲染产物 kube-prometheus-stack.yaml,也手工补充了 oauth2-proxy、Ingress、备份 CronJob、ExternalSecret、NetworkPolicy 与大量 PrometheusRule。
部署形态
- Name
- 命名空间
- Description
- prometheus
- Name
- 工作负载类型
- Description
- prometheus-operator 管理的 Prometheus / Alertmanager CRD(operator 据此生成 StatefulSet),外加 kube-state-metrics 与 oauth2-proxy 两个 Deployment、node-exporter DaemonSet、备份 CronJob
- Name
- 核心镜像
- Description
- prometheus-operator v0.91.0、Prometheus v3.12.0(spec.version v3.7.3)、Alertmanager v0.33.0(spec.version v0.29.0)、kube-state-metrics v2.19.1、node-exporter v1.11.1、oauth2-proxy v7.15.3
- Name
- 副本数
- Description
- Prometheus 1(shards 1)、Alertmanager 1、kube-state-metrics 1、prometheus-operator 1、oauth2-proxy 1;node-exporter 按节点 DaemonSet
- Name
- 调度
- Description
- 全部
nodeSelector: workload: infra;Prometheus 带按 hostname 的 preferred podAntiAffinity
- Name
- 端口
- Description
- Prometheus 9090、Alertmanager 9093、oauth2-proxy 4180
- Name
- 存储
- Description
- Prometheus volumeClaimTemplate 50Gi、Alertmanager 10Gi,均用 storageClass
nfs-client(RWX);备份 PVCmonitoring-backup100Gi、同样 nfs-client RWX
- Name
- 数据保留
- Description
- Prometheus retention 15d、WAL 压缩开启;Alertmanager retention 120h
- Name
- 采集间隔
- Description
- scrapeInterval 与 evaluationInterval 均 30s;externalLabels
cluster: prod-k3s
命名空间内还设了资源边界:ResourceQuota 限制 limits.cpu 6 / limits.memory 8Gi、requests.cpu 3 / requests.memory 6Gi、最多 20 Pod 与 5 PVC;LimitRange 给容器默认 requests/limits 并设上下限。
配置与依赖
Prometheus 的 spec 开启了 enableAdminAPI(供备份用快照)、enableRemoteWriteReceiver,关闭了 OTLP receiver。它通过带 prometheus: kube-prometheus 标签的 ServiceMonitor / PodMonitor / Probe / Rule 选择器发现采集目标(跨所有命名空间),ScrapeConfig 选择器则匹配 release: kube-prometheus。Alertmanager 由 Prometheus 的 alerting.alertmanagers 指向(端口 http-web、API v2)。
仓库内额外挂了若干采集目标的 ServiceMonitor:etcd(配合 services-etcd.yaml / endpoints-etcd.yaml,并挂载 etcd-client-cert secret 做 mTLS)、Traefik metrics(services-traefik-metrics.yaml)、Consul exporter、生产应用与 Velero。
Secret 全部走 ExternalSecret 从 Vault ClusterSecretStore vault-backend 拉取:
- Name
- prometheus-oauth2-proxy
- Description
remoteRef.key: monitoring/prometheus/oauth2-proxy,取 client-id / client-secret / cookie-secret;同时在 template 里内联authenticated-emails白名单(suzukaze.haduki@gmail.com、evan@yldm.tech)
- Name
- alertmanager-telegram-credentials
- Description
dataFrom.extract.key: monitoring/alertmanager/telegram,取 bot_token / chat_id 供 Alertmanager 推 Telegram
证书由 cert-manager 签发(certificate-prometheus.yaml / certificate-alertmanager.yaml)。NetworkPolicy 控制东西向流量:放行来自 ingress 的访问、kube-apiserver proxy、node-exporter egress、kube-api egress、Alertmanager 与 oauth2-proxy 的 egress。
访问与监控
两个 Ingress 都走 ingressClassName: traefik,经 Cloudflare Tunnel(external-dns 注解,cloudflare-proxied: true,target 指向同一 cfargotunnel 隧道)对外:
| 域名 | 后端 Service | 端口 | 鉴权 |
|---|---|---|---|
| prometheus.yldm.tech | oauth2-proxy-prometheus | 4180 | oauth2-proxy OIDC(dex) |
| alertmanager.yldm.tech | kube-prometheus-alertmanager | 9093 | 无(由 Ingress 直连) |
Prometheus UI 不直接暴露,而是经 oauth2-proxy 反代:provider oidc、issuer https://dex.yldm.tech,upstream http://kube-prometheus-prometheus:9090,cookie domain .yldm.tech,登录身份按 authenticated-emails 白名单放行。
监控自身:本目录内有大量 PrometheusRule(node-exporter、kubernetes-apps/resources/storage/system、apiserver SLO、kube-state-metrics、prometheus / prometheus-operator / alertmanager 自监控、config-reloaders、critical-services、app-slo 等),由 promtool 在 CI 校验 PromQL。VPA prometheus-server-vpa 以 Recreate 模式管理 Prometheus 资源(min 100m/512Mi,max 2000m/4Gi);另有 alertmanager、kube-state-metrics、operator、oauth2-proxy 的 VPA。本目录未见 HPA 或 PDB。
注意事项
备份由 CronJob backup-prometheus 每天 03:00 执行:用 Prometheus Admin API(/api/v1/admin/tsdb/snapshot)创建快照,再 cp 到 monitoring-backup PVC,保留最近 15 天。关键点是备份 Pod 挂载 prometheus-data PVC 时必须用与 Prometheus StatefulSet 相同的 subPath: prometheus-db,否则在 /prometheus/snapshots/ 里看不到快照、备份形同虚设。脚本不再回退到全量 tar(TSDB 远大于备份 PVC,会撑爆磁盘),快照失败即终止(exit 1)。
CLAUDE.md 未对 Prometheus 单列踩坑段,但提示:本仓库 manifest 合并到 main 后 ArgoCD 会在几分钟内自动同步到集群,没有手动 kubectl apply 步骤,合错即部署,务必先用 CI 同款检查(kustomize build + kubeconform + promtool check rules)在本地验证再合并。
返回 observability 总览