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);备份 PVC monitoring-backup 100Gi、同样 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.comevan@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.techoauth2-proxy-prometheus4180oauth2-proxy OIDC(dex)
alertmanager.yldm.techkube-prometheus-alertmanager9093无(由 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-vpaRecreate 模式管理 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)创建快照,再 cpmonitoring-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 总览

评论