Kubernetes 全栈监控体系:kube-prometheus-stack + 7 大 Exporter 生产实践

Kubernetes 全栈监控体系:kube-prometheus-stack + 7 大 Exporter 生产实践

本文基于 kube-prometheus-stack Helm Chart 在 Kubernetes 上构建完整监控体系的实战,覆盖 Prometheus、Grafana、Alertmanager 及 7 个专用 Exporter 的部署与配置。


一、监控体系全景架构

整套监控以 kube-prometheus-stack 为核心,通过 ServiceMonitor CRD 自动发现并采集 7 大数据源,配合 Alertmanager 分级告警与 Grafana 可视化:

全景架构

组件 版本 作用
Prometheus v2.45.0 指标采集与存储,10 天数据保留
Alertmanager v0.25.0 告警路由与邮件推送,2 副本 HA
Grafana 11.1.1 可视化面板,Ingress 暴露
Prometheus Operator 管理 Prometheus/Alertmanager 生命周期

所有组件运行在 monitoring Namespace,通过 NFS 持久化存储保障数据安全。


二、NFS 持久化存储规划

Prometheus、Alertmanager、Grafana、Thanos 各组件均使用 NFS 作为持久存储,通过静态 PV + PVC 绑定:

NFS PV 规划

组件 PV 名称 容量 StorageClass 访问模式
Prometheus nfs-pv-prometheus-prometheus 300Gi nfs-prometheus-prometheus ReadWriteMany
Alertmanager-0 nfs-pv-prometheus-alertmanager 300Gi nfs-prometheus-alertmanager ReadWriteMany
Alertmanager-1 nfs-pv-prometheus-alertmanager-1 300Gi nfs-prometheus-alertmanager ReadWriteMany
Grafana nfs-pv-prometheus-grafana 300Gi nfs-prometheus-grafana ReadWriteMany
Thanos nfs-pv-prometheus-thanos 300Gi nfs-prometheus-thanos ReadWriteMany
spec:
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: <nfs-server-ip>
    path: "/home/data/share/prometheus/prometheus/"
  • Retain 回收策略确保 PV 删除后数据不丢失
  • ReadWriteMany 允许多 Pod 同时读写(Alertmanager 2 副本共享同 StorageClass 下不同 PV)

三、7 大 ServiceMonitor 采集源

ServiceMonitor 采集源

3.1 APISIX 指标采集

跨 Namespace 采集 APISIX 网关指标,5 秒高频采集:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: prometheus-apisix
  namespace: monitoring
  labels:
    release: kube-prometheus-stack
spec:
  selector:
    matchLabels:
      app: apisix-metircs
  namespaceSelector:
    matchNames:
      - "bjac-apisix"
  endpoints:
    - port: metircs
      interval: 5s
      path: /apisix/prometheus/metrics

3.2 Micrometer(Java 应用)指标采集

采集 Spring Boot 应用的 Micrometer 指标,跨环境选择:

spec:
  selector:
    matchExpressions:
      - { key: app, operator: In, values: [micrometer-doc-api-test-metircs, micrometer-doc-api-metircs] }
      - { key: environment, operator: NotIn, values: [dev] }
  namespaceSelector:
    matchNames:
      - "bjac-case"
  endpoints:
    - port: metrics
      interval: 15s
      path: /actuator/prometheus
      metricRelabelings:
        - sourceLabels: [instance]
          targetLabel: ipport
        - sourceLabels: [pod]
          targetLabel: instance

关键设计:matchExpressions 排除 dev 环境,metricRelabelings 将 pod 标签替换 instance,便于 Grafana 按实例筛选。

3.3 MinIO 指标采集

MinIO 需要 Bearer Token 认证才能访问指标端点:

endpoints:
  - port: metrics
    interval: 30s
    path: /minio/v2/metrics/cluster
    bearerTokenSecret:
      key: bearer_token
      name: minio-bjac-bearer-token

同时采集 bucket 级别指标(/minio/v2/metrics/bucket),通过独立 ServiceMonitor 实现。

3.4 Kafka Exporter

通过 hostAliases 解决 Kafka 集群 DNS 解析:

kafkaServer:
  - kafka01:9092
  - kafka02:9092
  - kafka03:9092
hostAliases:
  - ip: "xxx.xxx.xxx.xxx"
    hostnames:
      - "kafka01"

ServiceMonitor 10 秒采集间隔,additionalLabels.release: kube-prometheus-stack 确保 Prometheus Operator 自动发现。

3.5 Blackbox Exporter

黑盒探测 HTTP 可用性与 SSL 证书状态,自定义探测模块:

config:
  modules:
    http_2xx_reg_doc4j:
      prober: http
      timeout: 5s
      http:
        valid_status_codes: [200, 301, 302]
        fail_if_body_not_matches_regexp:
          - "<operational>true</operational>"

此模块不仅检查 HTTP 状态码,还验证响应体内容是否包含 <operational>true</operational>,确保业务真正可用。

3.6 Pushgateway

接收短生命周期任务的推送指标,Ingress 暴露 pushgateway.xxx.org

persistentVolume:
  enabled: true
  storageClass: "minio-storage"
  size: 2Gi
serviceMonitor:
  honorLabels: true

honorLabels: true 保留推送端原始 job/instance 标签,避免与 Pushgateway 自身标签冲突。

3.7 Windows Exporter(外部服务发现)

External Service 发现模式

Windows 节点不在 Kubernetes 集群内,采用 Service + Endpoints 手动注册模式:

apiVersion: v1
kind: Service
metadata:
  name: external-service-windows-exporter
  namespace: monitoring
spec:
  ports:
    - port: 9182
      targetPort: 9182
      name: metrics
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-service-windows-exporter
subsets:
  - addresses:
    - ip: xxx.xxx.xxx.xxx
      nodeName: doc4j-183
    - ip: xxx.xxx.xxx.xxx
      nodeName: doc4j-184
    ports:
    - name: metrics
      port: 9182

Service 与 Endpoints 同名绑定,Prometheus 通过 ServiceMonitor 发现该 Service,进而从 Endpoints 指定的外部 IP 采集指标。

同样模式也用于采集集群外的 MinIO Converter 实例。


四、告警体系

4.1 Alertmanager 分级路由

告警分级路由

route:
  group_by: ['namespace', 'alertname', 'cluster']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 12h
  routes:
    - matchers:
        - severity =~ "warning|info"
      receiver: 'menglb'
    - matchers:
        - severity =~ "critical"
      receiver: 'team-it'
级别 接收者 说明
critical team-it 邗组 紧急问题,全员通知
warning menglb 个人 预警提醒,单人关注
InfoInhibitor/Watchdog null 静默忽略,抑制低级告警

抑制规则确保同一 namespace + alertname 下,critical 告警自动抑制 warning/info。

4.2 Blackbox 探测告警

Blackbox 告警规则

规则 表达式 级别 说明
接口宕机 probe_success == 0 critical 立即告警,零容忍
HTTP 异常状态码 status <= 199 或 >= 400 critical 非 2xx/3xx 即异常
探测超时 avg duration > 1s (5m) warning 持续慢响应
SSL 证书即将过期 cert expiry < 30d warning 30 天预警
SSL 证书已过期 cert expiry <= 0 critical 证书失效

4.3 Kafka 告警规则

Kafka 告警规则

规则 表达式 级别
Broker 宕机 kafka_brokers < 3 critical
副本不足 in_sync_replica < 3 critical
消费延迟 consumer_lag > 50 critical
消费者数不足 members < 15 critical

4.4 MinIO 告警规则

规则 表达式 级别
节点离线 nodes_offline > 0 (5m) warn
磁盘离线 disk_offline > 0 (5m) warn

4.5 Micrometer 自定义告警

- alert: kafka客户端发送消息失败
  expr: kafka_producer_success > 0
  for: 0m
  labels:
    severity: critical

业务级告警,零容忍 —— 任何 Kafka 生产失败立即触发。


五、关键配置详解

5.1 Prometheus 存储

prometheusSpec:
  retention: 10d
  walCompression: true
  replicas: 1
  storageSpec:
    volumeClaimTemplate:
      spec:
        storageClassName: nfs-prometheus-prometheus
        accessModes: ["ReadWriteMany"]
        resources:
          requests:
            storage: 100Gi
  • 10 天数据保留,平衡存储成本与排查需求
  • WAL 压缩减少磁盘 I/O
  • 单副本部署,NFS 存储保障数据持久

5.2 Alertmanager 高可用

alertmanagerSpec:
  replicas: 2
  retention: 120h
  storage:
    volumeClaimTemplate:
      spec:
        storageClassName: nfs-prometheus-alertmanager
        resources:
          requests:
            storage: 100Gi

2 副本确保告警不丢失,120 小时告警历史保留。

5.3 Grafana 配置

grafana:
  adminPassword: <grafana-password>
  persistence:
    enabled: true
    storageClassName: nfs-prometheus-grafana
    size: 100Gi
  ingress:
    enabled: true
    ingressClassName: nginx
    hosts:
      - grafana.xxx.org
  sidecar:
    dashboards:
      searchNamespace: ALL
    datasources:
      defaultDatasourceEnabled: true
  • Ingress 暴露 grafana.xxx.org
  • sidecar 自动发现所有 Namespace 的 Dashboard ConfigMap
  • 默认数据源自动指向 Prometheus

5.4 Windows 监控启用

windowsMonitoring:
  enabled: true
  job: prometheus-windows-exporter

kube-prometheus-stack 开箱支持 Windows 监控,自动部署 Windows Dashboard 和告警规则。

5.5 节点调度

nodeSelector:
  flink-server: "true"  # Prometheus/Alertmanager/Thanos
  kubernetes.io/hostname: stream-node-03  # Grafana

Prometheus 组件调度到计算节点,Grafana 固定到特定节点。

5.6 iptables 安全加固

iptables -I INPUT -p tcp --dport 9100 -j DROP
iptables -I INPUT -s xxx.xxx.xxx.0/24 -p tcp --dport 9100 -j ACCEPT
iptables -I INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 9100 -j ACCEPT

限制 node-exporter 9100 端口仅允许内网访问,防止指标泄露。


六、部署流程

部署流程

步骤 1:创建 Namespace

kubectl create ns monitoring

步骤 2:拉取镜像并推送到私有仓库

部分镜像(如 webhook-certgen)需从 registry.k8s.io 拉取后推送至私有仓库:

docker pull registry.k8s.io/ingress-nginx/kube-webhook-certgen:<tag>
docker tag <image> <private-registry>/tools/<image-name>:<tag>
docker push <private-registry>/tools/<image-name>:<tag>

步骤 3:配置 NFS PV

kubectl apply -f nfs-pv.yaml

步骤 4:Helm 部署 kube-prometheus-stack

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm pull prometheus-community/kube-prometheus-stack --untar
cd /home/helm/kube-prometheus-stack
helm install kube-prometheus-stack . --namespace monitoring

步骤 5:部署各 Exporter

# Blackbox
helm install prometheus-blackbox-exporter . --namespace monitoring

# Kafka Exporter
helm install prometheus-kafka-exporter . --namespace monitoring

# Pushgateway
helm install prometheus-pushgateway-bjac . --namespace monitoring

步骤 6:配置告警规则与 ServiceMonitor

# APISIX
kubectl apply -f apisix/servicemonitor.yaml

# Micrometer
kubectl apply -f micrometer/servicemonitor.yaml
kubectl apply -f micrometer/prometheusrule.yaml

# MinIO
kubectl apply -f minio/servicemonitor.yaml
kubectl apply -f minio/servicemonitor-converter.yaml
kubectl apply -f minio/prometheusrule.yaml

# Kafka 告警
kubectl apply -f prometheus-kafka-exporter/prometheusrule.yaml

# Windows Exporter
kubectl apply -f containerd-windows-exporter/servicemonitor.yaml

七、实践总结

要点 说明 核心收益
kube-prometheus-stack 一键部署 Helm Chart 统一编排 减少运维复杂度
NFS 持久存储 静态 PV + ReadWriteMany 数据安全,多副本共享
Alertmanager 2 副本 HA 部署 告警零丢失
告警分级路由 critical → team-it, warning → menglb 精准通知,避免告警疲劳
告警抑制 critical 抑制同 namespace warning 减少重复告警
7 大 ServiceMonitor K8s 内 + 外部全覆盖 全栈可观测
External Service 模式 Service + Endpoints 手动注册 无需改造 Windows/外部节点
Bearer Token 认证 MinIO 指标端点认证 安全采集
Micrometer 标签重写 pod → instance Grafana 实例筛选友好
Windows 监控 containerd + windows-exporter 混合集群全覆盖
iptables 端口限制 node-exporter 9100 仅内网访问 指标安全
Ingress 统一暴露 grafana/alertmanager/pushgateway 域名化访问

阅读更多

Ghost 邮箱订阅功能在中国大陆的困境:Mailgun 注册受阻实录

Ghost 邮箱订阅功能在中国大陆的困境:Mailgun 注册受阻实录

本文记录了 Ghost 博客邮箱订阅功能因 Mailgun 在中国大陆无法注册而被迫关闭的完整过程,包括注册尝试、工单沟通及最终应对方案。 一、背景:Ghost 与 Mailgun Ghost 博客平台内置了邮箱订阅(Newsletter)功能,读者可以通过输入邮箱地址订阅博客更新,Ghost 会自动将新文章以邮件形式推送给订阅者。这一功能的邮件发送能力依赖于第三方邮件服务——Mailgun。 Ghost 官方推荐使用 Mailgun 作为邮件传输层,配置方式如下: 配置项 说明 示例值 mail.from 发件人地址 newsletter@yourdomain.com mail.transport 传输协议 SMTP mail.options.host SMTP 主机 smtp.mailgun.org mail.options.port

By 菱角
基于 Docker Compose 部署 Apache APISIX:全栈 API 网关实践

基于 Docker Compose 部署 Apache APISIX:全栈 API 网关实践

本文基于 APISIX 3.9.1 + Dashboard 3.0.1 + etcd 3.5.15 + Prometheus + Grafana 的生产级 Docker Compose 部署实践。 一、整体架构 本次部署采用 Docker Compose 编排五大组件,形成从配置管理到流量监控的完整闭环: 组件 版本 作用 端口 APISIX 3.9.1-debian API 网关核心,路由转发、插件执行 9080/9443 Dashboard 3.0.1-alpine 可视化配置管理界面 9000 etcd 3.5.15

By 菱角
在 Kubernetes 上部署 Apache Flink:生产实战指南

在 Kubernetes 上部署 Apache Flink:生产实战指南

本文基于 Flink 1.15.2 + Kubernetes 的生产环境部署实践。 一、架构概览 Flink 在 Kubernetes 上采用经典的 JobManager + TaskManager 主从架构,JobManager 负责作业调度与协调,TaskManager 承载实际的计算任务。 资源分配一览 组件 作用 副本数 Task Slots 内存配置 JobManager 作业调度、Checkpoint 管理、协调 1 — 8G TaskManager 执行计算任务 3 80/Pod 48G 总计 — 4 240 — 二、Namespace 隔离 为 Flink 创建独立 Namespace,

By 菱角
Kubernetes 环境下的 PostgreSQL 部署

Kubernetes 环境下的 PostgreSQL 部署

基于官方 postgres 镜像的生产级部署与备份实践 前言 PostgreSQL 作为最强大的开源关系型数据库之一,在企业级应用中扮演着重要角色。将 PostgreSQL 部署在 Kubernetes 环境中,不仅能享受容器化带来的便利,还能利用 Kubernetes 的弹性伸缩和自愈能力。 今天,我将分享一套完整的 PostgreSQL K8s 部署方案,包括 StatefulSet 部署、用户权限管理、以及自动备份策略。 为什么选择 Kubernetes 部署 PostgreSQL? 优势 说明 高可用 Kubernetes 自动重启故障 Pod,保证服务持续运行 弹性伸缩 根据负载动态调整资源配额 版本管理 通过镜像版本轻松实现数据库升级 资源隔离 独立的 Namespace 和资源配额 存储管理 HostPath 或持久卷灵活配置 整体架构一览 先来看一张部署架构图:

By 菱角