服务卡片 · 监控
Netdata:当你觉得哪里不对时打开的那个每秒视图
Prometheus 回答关于趋势的问题,而且是以三十秒为步长回答。Netdata 回答的是另一个问题——此刻正在发生什么——并且用足够细的分辨率回答,让一个尖峰看起来是尖峰,而不是一个像素的凸起。两个都跑并不冗余;它们是在不同心情下用的。
| 容器镜像 | netdata/netdata:v2.2.0 |
|---|---|
| 宿主端口 | :19999/tcp |
| 数据目录 | /srv/homelab/netdata/config |
| 内存预留 | 420 MB |
| CPU 上限 | 0.60 vCPU (cpus: "0.60") — it collects every second, which is the product and the cost |
| 更新节奏 | monthly, and the parent-child streaming feature means the update has to be done on every node at roughly the same time if streaming is used |
| ARM 兼容 | arm64 native with a built-in collector set that includes the Pi's thermal zones and the throttling flags out of the box |
| 宿主 | 容器 | proto | 暴露 | 用途 |
|---|---|---|---|---|
| :19999 | 19999 | tcp | 仅局域网 | live dashboards, per-second, with alerts evaluated on the agent |
部署步骤
建好三个目录,先启动一次把镜像拉下来
lib 和 cache 是写入最重的两个目录,应该和其它一切一起待在固态盘上,而不是放在同时也装着操作系统的 SD 卡里。
run sudo mkdir -p /srv/homelab/netdata/{config,lib,cache} cd /srv/homelab/netdata && docker compose up -d docker logs --tail 20 netdata显式关掉云和注册表功能
放着不管的话,agent 会到厂商云上注册并上报这台机器的清单。显式设置这个开关,和「假设默认是关的」不是一回事。
run docker exec netdata grep -i -E 'cloud|registry' /etc/netdata/netdata.conf || echo '没有覆盖项' # 上文 compose 文件里已设置 NETDATA_DISABLE_CLOUD=1调整那些在派上为正常行为触发的健康告警
默认阈值是按余量更充裕的服务器写的。每天都响的告警就是没人会看的告警,所以要把对这套硬件属于噪音的那些静音掉。
run docker exec netdata ls /etc/netdata/health.d | head docker exec netdata tail -20 /var/log/netdata/health.log # 编辑 /etc/netdata/health.d/*.conf 后重启生效
一秒的分辨率,以及它的代价
Netdata 每秒采集一次,并保留一个近期数据的环形缓冲——一小时的高分辨率,之后逐渐变粗、覆盖一天。这正是它能找到被 Prometheus 抹平的东西的原因:某容器每三十秒尖峰两秒,在三十秒抓取下看起来就是一条直线。
代价是 420MB 内存和在派上可观的 CPU。它是这台机架上第二重的服务,而它值得的理由是:想要这个分辨率,替代方案是一个每月费用就超过整台机架运行成本的商业服务。
| Netdata | Prometheus | |
|---|---|---|
| 分辨率 | 1 秒 | 30 秒 |
| 保留的历史 | 完整细节数小时,降采样一天 | 15 天 |
| 本机架内存 | 420 MB | 760 MB |
| 回答什么问题 | 现在正在发生什么 | 这是不是在往坏的方向走 |
| 告警在哪 | agent 上 | 告警规则里 |
光凭 ARM 上这些默认图表就值回安装
ARM 上默认的采集项包含温度区和树莓派降频标志,这两者加起来不需要任何配置就能回答「它慢是不是因为热」。降频图表是一个位掩码,面板会把它解码成真正有意义的词:欠压、频率被限制、当前正在降频。
尤其是欠压标志,是这台机架上最有用的单个指标。供电余量不足的派会间歇性降频,而其它所有症状——掉帧、扫描变慢、容器超时——最终都指向它。
# 值得钉在面板顶部的两张图
# sensors.temp -> 各分区温度
# sensors.throttled -> 位掩码,已解码
vcgencmd get_throttled
# 0x0 表示开机以来什么都没出过问题流式传输,以及这里刻意没用的父子结构
Netdata 能把每个节点的指标流式传到一个父节点,这对一群机器来说是对的设计。这台机架只有一台机器,所以父子配置刻意关着——它只会多出一层配置面和一个数据存放点,换不来任何好处。
等第二台派加入的那天,流式配置就是选 Netdata 而不是再开一个 Prometheus 实例的理由:每个子节点的 netdata.conf 里加一行就能把数据推到父节点,抓取配置完全不用改。
# 将来若有子节点:
# [stream]
# destination = 192.168.10.20:19999
# api key = <取自父节点 /var/lib/netdata/netdata.api.key>compose 文件
整份文件放在 /srv/homelab/netdata/compose.yaml。标签固定版本号,不用 latest——树莓派上回滚比升级麻烦得多。
services:
netdata:
image: netdata/netdata:v2.2.0
container_name: netdata
restart: unless-stopped
ports:
- "19999:19999/tcp"
environment:
TZ: Asia/Shanghai
NETDATA_DISABLE_CLOUD: "1"
volumes:
- /srv/homelab/netdata/config:/etc/netdata
- /srv/homelab/netdata/lib:/var/lib/netdata
- /srv/homelab/netdata/cache:/var/cache/netdata
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /etc/os-release:/host/etc/os-release:ro
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
networks: [rack]
networks:
rack:
external: true加固清单
- 关闭注册表和云连接功能,agent 除了本地面板之外不向任何地方上报
- 面板只在局域网内可达——它默认没有登录,而且是机架上对宿主机内部最详细的视图
- 容器只挂载磁盘和进程指标所需的最少宿主机路径,而不是文档里那套完整特权配方
- 健康告警走本地通知路径而不是邮件,后者需要把凭据存在某处
备份方案
数据库是近期指标的环形缓冲,刻意不备份;丢了它就丢最近一小时的图。真正持久的是配置、健康告警定义和自定义采集项,它们在 git 里。
上线后验证
- 面板在局域网内两秒内加载完,图表每秒实时更新
- 降频图表显示开机以来全程为零,或者能解释为什么不是
- 杀掉一个容器后,容器图表在两秒内出现台阶
- 云连接和注册表功能已关闭,可由容器自身的网络图中没有任何外连来确认
踩过的坑
- Netdata 默认没有认证。待在局域网里、前面有代理的访问规则就没问题;发布到公网上,它就是把这台机器的完整清单交给任何找到它的人。
- 某些版本的注册表和云功能默认开启,会静静地把宿主机的清单发给第三方。要显式设置 NETDATA_DISABLE_CLOUD,不要靠假设。
- 在 SD 卡上做每秒采集会产生持续的小写入,把卡写坏。把 /var/lib/netdata 和其它数据一起挪到固态盘,或者接受更短的卡寿命。
- 健康告警的默认值是按资源更充裕的服务器调的,在派上会为正常行为触发。要么调整,要么关掉那些噪音项——因为每天都响的告警,就是没人会看的告警。
硬件与选型问答
- 只能跑一个的话,Netdata 还是 Prometheus?
- 想要历史和趋势分析,就用 Prometheus 加 Grafana,因为它就是干这个的,而三十秒分辨率下的十五天保留足够回答大多数问题。如果主要是想「现在就看看这台机器」并且要开箱即用的告警,就用 Netdata。在负担得起的派上,两个一起比任何一个单独用都更好。
- 为什么它的保留时间更短、内存却比 Prometheus 大?
- 因为它的分辨率细三十倍,而且环形缓冲把一切都放在内存里、后面才落库。内存和图表数量、分辨率成正比,和保留时长无关;Netdata 是用内存换响应速度。
- 它能在通知上替代 Uptime Kuma 吗?
- 它的健康告警能发现同一台宿主机上 Uptime Kuma 能发现的大部分问题,但它没法从网络外部检查一个外部服务或一个 URL。两者在这里共存:Uptime Kuma 从外面看服务,Netdata 从里面看机器。