在原有 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_usage、node_memory_usage、node_disk_usage |
节点资源瓶颈排查 |
| Pod / 容器 | container_cpu_usage_seconds_total、container_memory_usage_bytes |
容器资源占用、异常资源消耗 |
| 控制器状态 | kube_deployment_ready_replicas、kube_statefulset_ready_replicas |
部署 / 有状态集副本是否正常 |
| 网络状态 | kube_pod_network_rx_bytes_total、kube_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
访问地址:
- Prometheus:http://localhost:9090
- Grafana:http://localhost:3000(账号 admin,密码为部署时设置的 Admin@123456)
- Alertmanager:http://localhost:9093
三、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 访问仪表盘
- 登录 Grafana(http://localhost:3000);
- 左侧菜单栏 →
Dashboards→Browse; - 筛选
kube-prometheus-stack前缀的仪表盘,即可查看 K8s 集群监控数据。
4.3 自定义 K8s 仪表盘(示例)
若需监控自定义指标(如应用接口 QPS),可新建仪表盘:
-
点击
+→Dashboard→Add Panel; -
选择 Prometheus 数据源,输入 K8s 相关 PromQL:
# 示例:监控default命名空间所有Pod的CPU使用率 sum(rate(container_cpu_usage_seconds_total{namespace="default"}[1m])) by (pod) -
配置图表类型(折线图)、阈值(如 CPU 使用率 > 80% 标红),保存仪表盘。
五、K8s 监控进阶优化
5.1 持久化 Prometheus 数据(避免数据丢失)
kube-prometheus-stack 默认通过 StatefulSet 部署 Prometheus,并挂载 PVC 持久化数据,需确保:
-
K8s 集群已配置存储类(StorageClass);
-
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 监控核心要点)
- 部署选型 :新手优先用
kube-prometheus-stack(Helm 一键部署),避免手动部署多个组件; - 监控特性 :利用 K8s 的
ServiceMonitor实现监控目标自动发现,替代传统静态配置; - 核心维度:重点监控节点资源、Pod 状态、控制器副本、集群事件,覆盖 "节点→容器→应用→集群" 全层级;
- 告警重点:聚焦 Pod 重启、节点资源不足、副本不可用、集群事件异常等核心故障场景;
- 高可用:生产环境需配置 Prometheus/Alertmanager 多副本 + 数据持久化,避免监控中断。