用途
本技能面向已由 Kubespray 部署的 Kubernetes 集群,用于搭建生产级监控体系。资料给出的方案是三层结构:NFS provisioner 提供持久存储、kube-prometheus-stack 负责指标采集与告警、etcd 指标暴露提供集群健康可见性。
核心原则:监控需覆盖所有集群层级——基础设施(node-exporter)、Kubernetes 组件(API server、scheduler、controller-manager)、etcd(leader、WAL、peer 延迟)以及工作负载(通过 kube-state-metrics 采集 Pod 指标)。
适用场景
- 在 Kubespray 集群上搭建 Prometheus、Grafana、Alertmanager
- 部署 NFS 存储 provisioner 以支持监控持久化
- 导入社区或自定义 Grafana 仪表盘
- 启用 etcd 指标采集
- 编写集群健康相关的 PromQL 查询
不适用:集群初始部署、高可用配置、集群升级、故障排查(分别由其他技能处理)。
主要能力与使用方式
1. NFS Subdir External Provisioner
kube-prometheus-stack 需要持久卷存放 Prometheus 与 Grafana 数据;没有 StorageClass 时 PVC 会停留在 Pending,Pod 无法启动。通过 Helm 安装 NFS subdir external provisioner,创建基于已有 NFS 服务器的默认 StorageClass。关键参数:nfs.server 为 NFS 服务器 IP,nfs.path 为导出路径,storageClass.defaultClass=true 使其成为默认存储类。安装后用 kubectl get storageclass 确认显示 (default),并检查 provisioner Pod 运行状态。
2. kube-prometheus-stack 安装
先添加 prometheus-community Helm 仓库。资料给出 custom-values.yaml 的关键配置:
- prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues: false —— 否则 Prometheus 只发现带 Helm 标签的 ServiceMonitor,遗漏自定义监控
- storageSpec.volumeClaimTemplate 申请 10Gi 存储
- additionalScrapeConfigs 添加静态抓取目标:HAProxy(192.168.10.10:8405)与 etcd(2381 端口)
- Prometheus、Grafana、Alertmanager 均配置为 NodePort(30001/30002/30003)
- Grafana 设置 adminPassword、5Gi 持久化、sidecar 仪表盘(label 为 grafana_dashboard,labelValue "1",searchNamespace: ALL)
- nodeExporter.tolerations 容忍 control-plane 的 NoSchedule 污点,使 DaemonSet 覆盖控制平面节点
安装命令使用 Helm,指定 monitoring 命名空间并创建,版本 80.13.3。安装后 2-5 分钟检查 monitoring 命名空间 Pod 全部 Running,并用 -o wide 确认 node-exporter 在每个节点(含控制平面)运行。访问地址为 http://NODE_IP:30001(Prometheus)、30002(Grafana,admin/prom-operator)、30003(Alertmanager)。
3. Grafana 仪表盘导入
推荐通过 ConfigMap sidecar 方式:Grafana sidecar 自动加载带 grafana_dashboard: "1" 标签的 ConfigMap,仪表盘在 Pod 重启后仍保留。资料示例下载社区仪表盘 Kubernetes Monitoring(ID 12693)与 Node Exporter Full(ID 15661),创建 ConfigMap 并打标签,约 60 秒内出现在 Grafana。还给出一个内联 JSON 的 API Server 自定义仪表盘 ConfigMap 示例,包含请求速率、P99 延迟、错误率与 inflight 请求四个面板及对应 PromQL。
4. 启用 etcd 指标
默认 etcd 仅监听 HTTPS 2379 并使用 mTLS;资料建议暴露独立 HTTP 指标端点以避免证书分发复杂度。在 group_vars/etcd.yml 中设置 etcd_metrics: true 与 etcd_listen_metrics_urls: "http://0.0.0.0:2381"。说明理由:HTTP 端点不含敏感数据、0.0.0.0 允许跨节点访问、2381 端口避开 2379/2380。用 ansible-playbook 加 --tags etcd --limit etcd -b 执行,Kubespray 会逐台滚动重启 etcd,并在 /var/backups/ 创建备份。验证方式为 curl 各 etcd 成员的 2381/metrics,并在 Prometheus Targets 页面确认 etcd 作业三个目标均为 UP;若 DOWN 可从防火墙、网络连通、etcd 监听、进程参数四方面排查。
5. 示例 PromQL
资料提供 etcd 健康查询(leader 状态、WAL fsync P99、数据库大小、peer RTT P99、leader 变更率)与集群健康查询(节点 CPU/内存使用率、Pod 重启率、API server 错误率)。
目标汇总与常见问题
完整配置后,5 节点集群(3 控制平面 + 2 工作节点)应有 18 个目标、6 个作业:kubernetes-apiservers、kubernetes-nodes、node-exporter、kube-state-metrics、haproxy、etcd。
常见错误包括:缺少 StorageClass 导致 Prometheus Pod Pending;Helm 发布名已存在需用 upgrade;etcd 未监听指标端口;节点时钟偏差需启用 NTP;Grafana 显示 No data 需先检查 Prometheus 目标与数据源 URL;节点 9100 端口被占用导致 node-exporter CrashLoopBackOff。常见错误做法包括:缺少 serviceMonitorSelectorNilUsesHelmValues: false、etcd 指标走 HTTPS 未分发证书、未给 node-exporter 加容忍、忘记 sidecar 的 searchNamespace: ALL、更新时误用 helm install、防火墙未放行 2381、首次安装未加 --create-namespace。