1. 为什么需要n9e+categraf监控K8s集群?
在Kubernetes环境中,监控体系的搭建往往面临三个典型痛点:首先,原生监控组件(如kube-state-metrics)提供的数据维度有限,难以满足企业级监控需求;其次,传统监控方案(如Prometheus单独部署)在动态伸缩场景下配置维护成本高;最后,多套监控系统并存导致数据孤岛,运维人员需要在不同平台间切换。
n9e(夜莺监控)作为开源的企业级监控解决方案,配合categraf这个全能采集器,恰好能解决这些问题。我去年在金融行业容器化改造项目中,就采用这套组合替代了原有的Prometheus+Granfana方案,运维效率提升了40%以上。具体优势体现在:
- 一体化采集:categraf通过单个Agent即可完成节点基础指标、K8s组件指标、业务容器指标的采集,相比传统方案需要部署node-exporter、kubelet-metrics等多套采集器,部署复杂度大幅降低
- 动态服务发现:基于K8s的自动发现机制,新扩容的Pod无需手动配置即可纳入监控范围
- 统一视图管理:n9e的监控看板可以整合基础设施监控、K8s集群监控、业务监控等多个维度数据
实际部署中发现,当集群规模超过200节点时,建议将categraf的采集间隔调整为30秒(默认15秒),否则可能造成监控服务端过载。这个参数对应categraf配置中的
interval字段。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与组件部署
2.1 基础环境要求
在开始配置前,需要确保满足以下条件:
- Kubernetes集群版本 ≥ 1.16(测试验证过1.16-1.26版本兼容性)
- 每个Worker节点至少预留100MB内存、50mCPU给categraf
- 已配置好kubeconfig文件并具有cluster-admin权限
- 节点时间同步(NTP服务正常)
2.2 categraf的DaemonSet部署
推荐使用Helm进行部署,以下是values.yaml的关键配置示例:
yaml复制agent:
config:
global:
hostname: "$HOSTNAME"
interval: 30
prometheus:
enabled: true
urls: ["http://n9e-server:19000/prometheus/v1/write"]
kubelet:
enabled: true
url: "https://$NODE_IP:10250"
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
insecure_skip_verify: true
部署命令:
bash复制helm repo add n9e https://github.com/n9e/helm-charts
helm install categraf n9e/categraf -n monitoring -f values.yaml
这里有几个关键点需要注意:
prometheus.urls需要指向n9e-server的remote write地址- Kubelet监控需要配置跳过证书验证(生产环境建议配置合法证书)
- 建议通过Pod反亲和性避免单个节点部署多个categraf实例
2.3 n9e服务端部署
n9e支持容器化部署,以下是最简docker-compose配置:
yaml复制version: '3'
services:
n9e:
image: n9e/n9e:latest
ports:
- "19000:19000"
volumes:
- ./data:/home/n9e/data
environment:
- DB_URL=mysql://user:pass@mysql:3306/n9e
首次启动后需要访问http://<n9e-server>:19000完成初始化配置,重点设置:
- 数据源类型选择"Prometheus"
- 配置存储策略(建议按指标重要性分级存储)
3. K8s监控指标采集配置
3.1 核心指标采集策略
categraf通过插件机制采集各类指标,针对K8s环境需要特别关注以下插件配置:
- kubelet插件(必需):
toml复制[[instances]]
url = "https://127.0.0.1:10250"
metrics_path = "/metrics"
# 采集cAdvisor指标
include_filter = ["container_", "pod_", "kubelet_"]
- kube-state-metrics插件(推荐):
toml复制[[instances]]
url = "http://kube-state-metrics:8080/metrics"
metric_types = ["*"]
- APIServer监控(可选):
toml复制[[instances]]
url = "https://kubernetes.default.svc:443/metrics"
bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"
tls_config = { insecure_skip_verify = true }
3.2 自定义业务指标采集
对于业务Pod暴露的自定义指标,可以通过annotations自动发现:
yaml复制apiVersion: v1
kind: Pod
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
prometheus.io/path: "/metrics"
categraf会自动发现这类Pod并采集其暴露的指标。实测中发现,当Pod频繁创建销毁时,建议在categraf配置中添加:
toml复制[prometheus]
discovery_interval = "1m"
避免服务发现过于频繁影响性能。
4. n9e监控看板配置实战
4.1 内置看板与自定义看板
n9e提供多个K8s监控预设看板:
- Kubernetes / Cluster
- Kubernetes / Node
- Kubernetes / Pod
以Node看板为例,关键指标包括:
- CPU/Memory/Disk使用率
- 网络IO和TCP连接数
- 容器组(Pod)数量变化趋势
创建自定义看板的操作路径:
- 导航到"可视化" → "仪表盘"
- 点击"新建"选择"Kubernetes"模板
- 添加图表时选择对应的PromQL表达式
4.2 关键告警规则配置
在"监控" → "告警规则"中配置核心告警:
- 节点不可用:
promql复制up{job="categraf-kubelet"} == 0
- Pod频繁重启:
promql复制sum by (namespace, pod) (changes(kube_pod_container_status_restarts_total[5m])) > 3
- 节点内存压力:
promql复制(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) < 0.2
告警通知建议配置分级策略:
- P0级(如节点宕机):立即电话通知
- P1级(如磁盘空间不足):企业微信/钉钉通知
- P2级(如Pod重启):仅邮件通知
4.3 性能优化技巧
在大规模集群中,我们总结出以下优化经验:
- 指标采样优化:
toml复制[global]
precision = 2 # 指标值保留2位小数
drop_metric_prefixes = ["go_", "process_"] # 丢弃无用指标
- 查询性能优化:
- 对高频查询指标配置Recording Rules
- 使用
rate()函数时合理选择时间窗口(通常5m)
- 存储策略优化:
- 核心指标(如CPU、内存)保留30天
- 中间件指标保留7天
- 单次性任务指标保留1天
5. 典型问题排查指南
5.1 指标采集失败排查
当看板无数据显示时,按以下步骤排查:
- 检查categraf日志:
bash复制kubectl logs -n monitoring <categraf-pod>
常见错误:
- 证书问题:
x509: certificate signed by unknown authority - 网络连通性:
connection refused
- 验证指标端点可访问性:
bash复制kubectl exec -it <categraf-pod> -- curl -k https://127.0.0.1:10250/metrics
- 检查n9e数据写入:
sql复制-- 在n9e数据库执行
SELECT count(*) FROM prometheus_metric;
5.2 看板数据异常分析
当看板数据显示异常时:
- 确认时间范围:检查看板右上角时间选择器是否合理
- 验证原始数据:在"探索"页面直接运行PromQL查询
- 对比历史趋势:使用时间对比功能(如对比昨天同时段)
曾遇到一个典型案例:某服务CPU使用率显示突降至0,实际是Pod被驱逐但K8s未及时更新状态。解决方案是在告警规则中添加状态判断:
promql复制kube_pod_status_phase{phase="Running"} == 1 AND
rate(container_cpu_usage_seconds_total[1m]) == 0
5.3 资源占用过高处理
当categraf占用资源过高时:
- 调整采集间隔:
toml复制[global]
interval = 60 # 调整为60秒采集一次
- 限制指标采集数量:
toml复制[kubelet]
metric_filter = ["container_cpu_usage_seconds_total", "container_memory_working_set_bytes"]
- 启用资源限制:
yaml复制# 在Deployment/DaemonSet中配置
resources:
limits:
cpu: "500m"
memory: "512Mi"
在百万级指标量的集群中,经过上述优化后categraf的内存消耗可以从1.2GB降至300MB左右。
