Prometheus 监控 K8s 集群全指南(适配 K8s 特性 + 实操部署)

在原有 Prometheus 监控体系基础上,监控 K8s 集群需适配其动态扩缩容、容器化部署、资源编排 的特性,核心是通过 K8s 原生的监控组件(如 kube-state-metrics)+ Prometheus 的 K8s 服务发现能力,实现集群全维度监控。以下是从架构设计→部署实施→配置监控→可视化告警的完整指南。

一、K8s 监控核心架构

1.1 核心组件说明(适配 K8s 场景)

组件名称 部署方式 核心作用
Prometheus StatefulSet 核心监控引擎,通过 K8s 服务发现自动拉取集群 / 容器指标,持久化存储时序数据
kube-state-metrics Deployment 采集 K8s 核心资源指标(Pod/Node/Deployment/Service/ConfigMap 等生命周期数据)
node-exporter DaemonSet 每个 K8s 节点部署一个,采集节点级指标(CPU / 内存 / 磁盘 / 网络)
cAdvisor 内置(Kubelet) 每个节点的 Kubelet 自带,采集容器级指标(CPU / 内存 / 磁盘 IO / 网络)
alertmanager StatefulSet 接收 Prometheus 告警,实现告警聚合、路由、抑制
Grafana Deployment 可视化 K8s 集群指标,提供预制仪表盘(节点 / Pod / 控制器 / 集群状态)
ServiceMonitor K8s 自定义资源 替代传统 prometheus.yml 的静态配置,自动发现 K8s 内的监控目标(Pod/Service)
kube-prometheus-stack Helm Chart 一站式部署包(包含以上所有组件),简化 K8s 监控部署(新手首选)

1.2 核心监控维度(K8s 必监控)

监控维度 核心指标示例 监控意义
集群状态 kube_cluster_info(集群健康)、etcd_server_has_leader(etcd 主节点) 集群基础可用性
节点资源 node_cpu_usagenode_memory_usagenode_disk_usage 节点资源瓶颈排查
Pod / 容器 container_cpu_usage_seconds_totalcontainer_memory_usage_bytes 容器资源占用、异常资源消耗
控制器状态 kube_deployment_ready_replicaskube_statefulset_ready_replicas 部署 / 有状态集副本是否正常
网络状态 kube_pod_network_rx_bytes_totalkube_service_endpoints Pod 网络流量、Service 端点可达
事件监控 kube_event_severity(Error/Warning 级别事件) 集群异常事件(如 Pod 调度失败)

二、快速部署:基于 kube-prometheus-stack(新手首选)

手动部署多个组件易出错,推荐用Helm 部署kube-prometheus-stack(官方维护的 K8s 监控套件),一键集成所有核心组件。

2.1 前置准备

(1)环境要求
  • K8s 集群版本:1.20+(适配 kube-prometheus-stack 最新版)

  • 已安装 Helm 3.x:

    复制代码
    # 安装Helm(Linux)
    curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    # 验证
    helm version
  • 集群节点至少 2GB 内存(Prometheus/Grafana 需占用资源)

(2)添加 Helm 仓库
复制代码
# 添加prometheus-community仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

2.2 部署 kube-prometheus-stack

(1)创建命名空间
复制代码
kubectl create namespace monitoring
(2)一键部署(基础配置)
复制代码
helm install k8s-monitor prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --set prometheus.retention=15d \  # 数据保留15天
  --set prometheus.storageSpec.storageClassName=default \  # 替换为你的存储类(如nfs、ceph)
  --set prometheus.storageSpec.resources.requests.storage=10Gi \  # Prometheus数据卷大小
  --set grafana.adminPassword=Admin@123456 \  # Grafana管理员密码
  --set alertmanager.enabled=true  # 启用Alertmanager
(3)验证部署
复制代码
# 查看Pod状态(所有Pod应为Running)
kubectl get pods -n monitoring

# 查看Service(获取访问地址)
kubectl get svc -n monitoring
# 关键Service:
# - prometheus-k8s:Prometheus服务(ClusterIP,需端口转发/Ingress暴露)
# - grafana:Grafana服务(ClusterIP)
# - alertmanager-main:Alertmanager服务(ClusterIP)
(4)暴露服务(访问 Prometheus/Grafana)

新手推荐用端口转发临时访问,生产环境用 Ingress 暴露:

复制代码
# 暴露Prometheus(前台运行,按Ctrl+C停止)
kubectl port-forward svc/prometheus-k8s 9090:9090 -n monitoring

# 暴露Grafana(新开终端)
kubectl port-forward svc/grafana 3000:80 -n monitoring

# 暴露Alertmanager(可选)
kubectl port-forward svc/alertmanager-main 9093:9093 -n monitoring

访问地址:

三、K8s 监控核心配置(适配 K8s 特性)

3.1 自动发现监控目标(ServiceMonitor)

kube-prometheus-stack 默认通过ServiceMonitor实现 K8s 内监控目标的自动发现(替代传统 prometheus.yml 的 static_configs),无需手动修改 Prometheus 配置。

(1)查看默认 ServiceMonitor
复制代码
kubectl get servicemonitors -n monitoring
# 默认包含:
# - k8s-monitor-kube-prometheus:监控Prometheus自身
# - k8s-monitor-kube-state-metrics:监控kube-state-metrics
# - k8s-monitor-node-exporter:监控node-exporter
(2)自定义 ServiceMonitor(监控 K8s 应用)

若需监控 K8s 内的自定义应用(如 Java 服务),需创建 ServiceMonitor 关联应用的 Service:

复制代码
# 示例:监控名为my-app的应用(暴露/metrics端口)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: my-app-monitor
  namespace: monitoring
spec:
  namespaceSelector:
    matchNames:
      - default  # 应用所在的命名空间
  selector:
    matchLabels:
      app: my-app  # 匹配应用Service的标签
  endpoints:
    - port: http  # 应用Service的端口名
      path: /metrics  # 应用暴露指标的路径
      interval: 15s  # 拉取频率

应用配置:

复制代码
kubectl apply -f my-app-monitor.yml

验证:Prometheus 页面 → Status → ServiceDiscovery → 查看是否发现 my-app 的监控目标。

3.2 K8s 核心监控规则(告警配置)

kube-prometheus-stack 默认内置了 K8s 集群的核心告警规则(如节点磁盘满、Pod 重启次数多、Deployment 副本不足),可通过PrometheusRule自定义扩展。

(1)查看默认告警规则
复制代码
kubectl get prometheusrules -n monitoring
(2)自定义 K8s 告警规则(示例)
复制代码
# k8s-custom-alert.yml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: k8s-custom-rules
  namespace: monitoring
spec:
  groups:
  - name: k8s-custom-alerts
    rules:
    # 1. Pod重启次数过多告警
    - alert: PodRestartTooMany
      expr: increase(kube_pod_container_restarts_total[10m]) > 5
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "Pod {{ $labels.pod }} 重启次数过多"
        description: "命名空间 {{ $labels.namespace }} 的Pod {{ $labels.pod }} 10分钟内重启{{ $value }}次,超过5次阈值。"
    
    # 2. 节点内存使用率过高
    - alert: NodeMemoryUsageHigh
      expr: 100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) > 90
      for: 5m
      labels:
        severity: critical
      annotations:
        summary: "节点 {{ $labels.node }} 内存使用率过高"
        description: "节点 {{ $labels.node }} 内存使用率{{ $value | printf \"%.2f\" }}%,超过90%阈值。"
    
    # 3. Deployment副本不可用
    - alert: DeploymentUnavailable
      expr: kube_deployment_status_unavailable_replicas > 0
      for: 3m
      labels:
        severity: critical
      annotations:
        summary: "Deployment {{ $labels.deployment }} 副本不可用"
        description: "命名空间 {{ $labels.namespace }} 的Deployment {{ $labels.deployment }} 有{{ $value }}个副本不可用。"

应用配置:

复制代码
kubectl apply -f k8s-custom-alert.yml

验证:Prometheus 页面 → Alerts → 查看自定义规则是否生效。

3.3 对接 Alertmanager 告警渠道(K8s 场景)

K8s 内的 Alertmanager 通过 ConfigMap 管理告警渠道配置(如邮件、钉钉、企业微信),无需手动修改容器内文件。

示例:配置邮件告警(修改 Alertmanager ConfigMap)
复制代码
# 编辑Alertmanager配置
kubectl edit configmap alertmanager-k8s-monitor-alertmanager -n monitoring

修改data.alertmanager.yml内容:

复制代码
global:
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: 'your_email@163.com'
  smtp_auth_username: 'your_email@163.com'
  smtp_auth_password: '你的邮箱授权码'
  smtp_require_tls: false

route:
  group_by: ['alertname', 'namespace']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'email-receiver'

receivers:
- name: 'email-receiver'
  email_configs:
  - to: 'admin@example.com'
    subject: '【K8s告警】{{ .CommonLabels.alertname }}'
    html: |
      <h3>告警详情</h3>
      <p>告警名称:{{ .CommonLabels.alertname }}</p>
      <p>级别:{{ .CommonLabels.severity }}</p>
      <p>命名空间:{{ .CommonLabels.namespace }}</p>
      <p>描述:{{ .CommonAnnotations.description }}</p>
      <p>触发时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}</p>

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'namespace']

保存后重启 Alertmanager Pod(使配置生效):

复制代码
kubectl delete pods -l app=alertmanager -n monitoring

四、K8s 监控可视化(Grafana 预制仪表盘)

kube-prometheus-stack 默认向 Grafana 导入了 K8s 核心仪表盘,无需手动导入,直接使用即可。

4.1 核心仪表盘列表(K8s 必看)

仪表盘名称 Grafana ID 监控内容
Kubernetes Cluster Status 12740 集群整体状态(节点数、Pod 数、控制器状态、资源使用率)
Kubernetes Node Exporter 1860 节点级详细监控(CPU / 内存 / 磁盘 / 网络 / 负载)
Kubernetes Pods 9808 Pod / 容器级监控(资源占用、重启次数、网络流量)
Kubernetes Deployment 14205 Deployment/ReplicaSet 监控(副本数、可用率、更新状态)
Kube State Metrics 10856 K8s 资源生命周期监控(Pod 创建 / 销毁、节点就绪状态、Service 端点)

4.2 访问仪表盘

  1. 登录 Grafana(http://localhost:3000);
  2. 左侧菜单栏 → DashboardsBrowse
  3. 筛选kube-prometheus-stack前缀的仪表盘,即可查看 K8s 集群监控数据。

4.3 自定义 K8s 仪表盘(示例)

若需监控自定义指标(如应用接口 QPS),可新建仪表盘:

  1. 点击+DashboardAdd Panel

  2. 选择 Prometheus 数据源,输入 K8s 相关 PromQL:

    复制代码
    # 示例:监控default命名空间所有Pod的CPU使用率
    sum(rate(container_cpu_usage_seconds_total{namespace="default"}[1m])) by (pod)
  3. 配置图表类型(折线图)、阈值(如 CPU 使用率 > 80% 标红),保存仪表盘。

五、K8s 监控进阶优化

5.1 持久化 Prometheus 数据(避免数据丢失)

kube-prometheus-stack 默认通过 StatefulSet 部署 Prometheus,并挂载 PVC 持久化数据,需确保:

  1. K8s 集群已配置存储类(StorageClass);

  2. PVC 容量足够(建议至少 10Gi,根据集群规模调整);验证 PVC:

    kubectl get pvc -n monitoring

    查看prometheus-k8s-db-prometheus-k8s-0是否Bound

5.2 监控 K8s 集群外的目标(混合监控)

若需同时监控 K8s 集群外的服务器 / 数据库(如物理机、MySQL),可通过AdditionalScrapeConfigs向 Prometheus 添加静态配置:

复制代码
# prometheus-additional-config.yml
apiVersion: v1
kind: Secret
metadata:
  name: prometheus-additional-configs
  namespace: monitoring
stringData:
  additional-scrape-configs.yaml: |
    - job_name: "external-mysql"
      static_configs:
        - targets: ["192.168.1.100:9104"]  # 集群外MySQL的mysqld_exporter地址
    - job_name: "external-server"
      static_configs:
        - targets: ["192.168.1.101:9100"]  # 集群外服务器的node-exporter地址

应用配置并更新 Prometheus:

复制代码
kubectl apply -f prometheus-additional-config.yml
helm upgrade k8s-monitor prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --set prometheus.prometheusSpec.additionalScrapeConfigsSecret.name=prometheus-additional-configs

5.3 高可用部署(生产环境必做)

  • Prometheus 高可用 :通过 Helm 设置副本数≥2,实现多实例采集,避免单点故障:

    复制代码
    helm upgrade k8s-monitor prometheus-community/kube-prometheus-stack \
      --namespace monitoring \
      --set prometheus.prometheusSpec.replicas=2
  • Alertmanager 高可用 :设置副本数≥2,实现告警集群化:

    复制代码
    helm upgrade k8s-monitor prometheus-community/kube-prometheus-stack \
      --namespace monitoring \
      --set alertmanager.alertmanagerSpec.replicas=2

5.4 常见问题排查(K8s 监控专属)

问题现象 根因分析 解决方案
Prometheus 未发现 K8s 目标 ServiceMonitor 标签匹配错误 / 命名空间不一致 1. 检查 ServiceMonitor 的 selector 标签是否匹配应用 Service;2. 确认 namespaceSelector 包含应用命名空间
节点指标缺失 node-exporter DaemonSet 未覆盖所有节点 检查 node-exporter Pod 的节点亲和性:kubectl describe daemonset k8s-monitor-node-exporter -n monitoring
容器指标缺失 Kubelet 的 cAdvisor 未启用 / 端口未暴露 检查 Kubelet 配置:`ps -ef grep kubelet,确保包含--cadvisor-port=4194`
Grafana 无 K8s 数据 Prometheus 数据源未配置 / 指标拉取失败 1. 验证 Grafana 的 Prometheus 数据源是否指向http://prometheus-k8s:9090;2. 在 Prometheus 中测试 K8s 指标是否存在

六、总结(K8s 监控核心要点)

  1. 部署选型 :新手优先用kube-prometheus-stack(Helm 一键部署),避免手动部署多个组件;
  2. 监控特性 :利用 K8s 的ServiceMonitor实现监控目标自动发现,替代传统静态配置;
  3. 核心维度:重点监控节点资源、Pod 状态、控制器副本、集群事件,覆盖 "节点→容器→应用→集群" 全层级;
  4. 告警重点:聚焦 Pod 重启、节点资源不足、副本不可用、集群事件异常等核心故障场景;
  5. 高可用:生产环境需配置 Prometheus/Alertmanager 多副本 + 数据持久化,避免监控中断。
相关推荐
王旭晨1 小时前
【高并发架构】从 0 到亿,从单机部署到 K8s 编排:高并发架构的 8 级演进之路
容器·架构·kubernetes
阿方索2 小时前
Kubernetes 1.28 高可用集群安装指南(Docker 运行时)
docker·容器·kubernetes
独自归家的兔3 小时前
解决k8s UI界面进不去
云原生·容器·kubernetes
last demo3 小时前
docker基础
运维·docker·容器·eureka
孤岛悬城3 小时前
59 k8s集群调度
云原生·kubernetes
独自归家的兔4 小时前
K8s 核心概念深度解析:Pod 是什么?
云原生·容器·kubernetes
咕叽咕叽的汪4 小时前
Es/Kibana7.17.9中数据迁移到openSearch3.4.0【DockerDesktop模拟】
运维·spring boot·elasticsearch·docker·容器·devops
xzl044 小时前
Docker Overlay2 迁移至 CentOS Home 完整指南
docker·eureka·centos
Mr. Cao code4 小时前
Docker文件数据卷实战:挂载与优化
运维·docker·容器