NAS 备忘录其四:TrueNAS Scale 24.04 部署Docker 和 Influx + Telegraf + Grafana 监测栈
大家好,这里是爱小憩的小爱。本篇将详细介绍如何在最新发布的 TrueNAS Scale 24.04 系统中部署 Docker 和自建 Telegraf、InfluxDB、Grafana 监测栈。本篇适用于 24.04 和 23.10 版本,更早前的尚未进行测试。
一、背景介绍
全新版本:TrueNAS Scale 24.04
在四月 22 日,Scale 24.04 版本粉墨登场。相较于笔者在上篇引入的 23.10 版,其增加了诸多特性,包括:
Linux 内核改用最新长期维护分支,即 6.6——新内核可以支持更多硬件,例如 Intel Arc 系列显卡、十二代及以上 Core 处理器集成 GPU;
动态缓存(ARC)改进,现在其表现和 TrueNAS Core 分支一致;
SMB/NFS 连接状态监测;
不间断电源(UPS)状态监测,支持 USB 和网络接口;
内置 Netdata 监测服务,可一键抵达;
如此等等,不一而足。
问题来了
既然有 Netdata,为什么要自建监测栈?
首先我们来看在网页管理界面上的“报告”一页:
TrueNAS 报告页这里有一项严重的局限性,便是观测范围,选项仅有一小时、24 小时和七天,而且仅对单个图表适用。此外,可以看到诸硬盘的指标各自为政,未聚合于一处。 那么 Netdata 界面有何表现?我们点击右上角的 Netdata,来到它的控制台:
内置 Netdata 服务控制台可以看到,进入控制台后,处理器占用随即上升 25% 左右,远超背景使用率(5% 以下)。这是不可接受的:监测栈的资源占用应该尽量小,避免影响到宿主机上其余业务。 综上,我们需要一套独立的监测栈,要求资源占用小、信息聚合展示、可选任意时间节点监看。
为什么不用系统自带应用功能,而是部署 Docker?
主要原因是网络连接不便。 无论是官方应用列表还是第三方列表 TrueCharts,均要求连接国际开源交流平台,需特殊手段来辅助;而 Docker 除了搜索镜像稍有不便以外,可用镜像站俯拾皆是,可用性是有保障的,不需要特殊手段。
这些服务用 apt 也可以部署,为什么还需要 Docker?
为了方便未来升级系统后重新部署服务。 TrueNAS 的更新方式特殊,更新后会创建一个新的系统实例,保留 Web 界面中的设置,但不会保留任何通过命令行部署的服务或其他操作(这些都存放于旧实例中)。尽管 Docker 本身也不会保留,但重新部署后通过事先准备的 Docker Compose 脚本,仍可快速恢复各项服务。
为何选择这个监测栈组合?
以前在群晖系统上用过,仅此而已(笑)
其实这三者是当下非常成熟的监测栈组合之一;Telegraf 负责接收遥测数据,InfluxDB 负责记录数据,而 Grafana 是最重要的:分析数据并可视化,其界面可以定制,资源消耗则远小于 Netdata。
事不宜迟,开始正题。
二、Docker 部署
初始状态下,TrueNAS Scale 会限制包管理器 apt 的使用;如试图调用之,会提示“在 TrueNAS 系统中,包管理器已被禁用”字样,拒绝执行。
原生环境试图执行 apt 的结果据官方文档介绍,通过执行命令 install-dev-tools 可进入开发者模式,此时会部署开发环境、解除系统目录的只读状态并开放 apt 权限。但如果仅仅希望获取 apt 权限,可改为运行一个内置 Python 脚本:
# python /usr/local/libexec/disable-rootfs-protection
注意:启用开发者模式不受 TrueNAS 官方支持,一切后果自负!切勿尝试以 apt 更新系统!
然后,编辑 apt 软件源配置 /etc/apt/sources.list,加入位于内地的任意 Debian 镜像站链接(如南方科大 mirrors.sustech.edu.cn/debian/),保存后执行 apt update,更新数据库。
这样万事俱备,以命令 apt install docker.io 即可部署 Docker 服务。服务会自动打开,无需额外操作。如通过 Docker Compose 部署容器,还需安装软件包 docker-compose。
三、数据源准备
监测数据从何而来呢?除了 Linux 底层接口以外,TrueNAS 还可向指定主机或端口(包括自身)发送 Graphite 格式的遥测数据,其中有处理器、内存、硬盘吞吐、网络吞吐、ARC 命中率等参数,比较全面;尽管该数据流未报告诸存储池的使用率、以及诸硬盘除温度以外的一切 SMART 参数等,但相对易于获取和分析,本篇里也将用到。
进入 Web 管理界面的“报告”一栏,点击右上角“导出器(Exporter)”,然后添加一项导出任务:
监测数据导出其中:
名称任意,仅用于在管理界面中识别;
目前类型仅有 Graphite 选项,选择之;
目标 IP(Destination IP)改为本机,即 127.0.0.1(如果监测栈部署于其他主机,可改为该主机的 IP);
目标端口(Destination Port)任意,记住端口号;
前缀(Prefix)、命名空间(Namespace)任意;
更新间隔(Update Every)任意,单位为秒,可设定 5 秒或 10 秒;
报告失败时的缓存间隔(Buffer On Failures)任意,一般为更新间隔的两倍;
报告项目名而非 ID(Send Names instead of Ids)可留空,系统将自动填写 true(启用);
监测项目(Matching Charts)任意,一般监测全部,即留星号(*)。
保存设置,数据源准备完成。
四、配置文件和目录准备
部署容器前,先准备好配置文件和存储目录。 笔者登录命令行,在 SSD 存储池、Docker 数据集 /mnt/SSD/docker 之下建立以下目录:influx、influx-config、telegraf、grafana。
随后,在 telegraf 目录下编写配置文件 telegraf.conf:
[global_tags] [agent] # 更新间隔设置,和第 3 节一致 interval = "5s" round_interval = true metric_batch_size = 1000 metric_buffer_limit = 10000 collection_jitter = "0s" # 刷新间隔设置,和第 3 节“缓存间隔”一致 flush_interval = "10s" flush_jitter = "0s" precision = "1ms" debug = false quiet = false logfile = "" # 主机名任意,此值写入数据库,供日后查询 hostname = "truenas" omit_hostname = false [[outputs.influxdb_v2]] # 数据库设置,记住桶(bucket)和组织(organization)名称,用于数据库初始化,口令(token)留空,稍后填写 urls = ["http://influxdb:8086"] bucket = "telegraf" organization = "smzdm" token = "" [[inputs.socket_listener]] # 监听端口设置,端口号和第 3 节所用端口一致 service_address = "tcp://:19039" data_format = "graphite" templates = ["os.host.measurement.type.field"]
五、容器部署
以下提供两种部署方式:Docker Compose 脚本或命令行。当然,引入 Portainer 等容器管理器也是可行的。
5.1 Docker Compose 部署
应用以下配置:
version: "3" services: influxdb: container_name: influxdb hostname: influxdb # Alpine 封装版本可节约空间 image: influxdb:alpine # 服务端口映射,此后登录 IP:9100 进行数据库初始化 ports: - 9100:8086/tcp restart: always volumes: - /mnt/SSD/docker/influx:/var/lib/influxdb2 - /mnt/SSD/docker/influx-config:/etc/influxdb2 # 内联网络,诸容器应保持一致 networks: - monitor telegraf: container_name: telegraf hostname: telegraf image: telegraf:alpine # 监听端口映射设置,和第 3 节所用一致 ports: - 19039:19039/tcp restart: unless-stopped volumes: - /mnt/SSD/docker/telegraf:/etc/telegraf:ro networks: - monitor grafana: container_name: grafana hostname: grafana image: grafana/grafana-oss:latest networks: - monitor # 管理端口映射,稍后登录 IP:3000 ports: - 3000:3000/tcp restart: unless-stopped # 用于访问宿主目录的用户 ID,admin = 950,admin 是 grafana 目录的所有者 user: 950 volumes: - /mnt/SSD/docker/grafana:/var/lib/grafana networks: monitor: driver: bridge external: true
保存后,以命令 docker compose up -d 部署并启动上述容器。
5.2 命令行部署
执行以下命令:
# docker network create monitor
以下将 InfluxDB 管理端口映射至宿主的 9100 端口,稍后以 IP:9100 访问。主机名(Hostname)必须设置,以下 Grafana 需要引用数据库主机名。
# docker run -d -p 9100:8086
--name influxdb --hostname influxdb
-v /mnt/SSD/docker/influx:/var/lib/influxdb2
-v /mnt/SSD/docker/influx-config:/etc/influxdb2
--restart always
--network monitor
influxdb:alpine
以下端口仍和第 3 节、第 4 节所设置的一致。
# docker run -d -p 19039:19039
--name telegraf
-v /mnt/SSD/docker/telegraf:/etc/telegraf:ro
--restart unless-stopped
--network monitor
telegraf:alpine
以下用户设置和目录 /mnt/SSD/docker/grafana 的所有者一致。
# docker run -d -p 3000:3000
--name grafana
-v /mnt/SSD/docker/grafana:/var/lib/grafana
--user 950
--restart unless-stopped
--network monitor
grafana/grafana-oss:latest
六、数据库初始化
待容器部署完成后,浏览器访问 <主机IP>:9100,按以下提示进行初始化:
InfluxDB 初始化按下“继续”,会弹出一个写有管理员口令的窗口。妥善保存该口令,请勿直接用于容器。
此后,我们从左侧“载入数据”(Load Data)进入“API 口令”(API Token)管理页面,生成(Generate)一个口令。一般“全功能口令”(All Access API Token)足够我们的容器使用。以下填写新口令名称。
创建新口令按下保存(Save),会弹出新口令,妥善保存,口令仅会展示一次。如丢失该口令,需重新生成一个。
将该口令写入 Telegraf 配置文件 /mnt/SSD/docker/telegraf/telegraf.conf 里面的留空处,然后重启 Telegraf 容器:
# docker restart telegraf
这样,齿轮开始转动,遥测数据源源不断输入到数据库中。
七、Grafana 设置
浏览器访问 <主机IP>:3000,填入默认用户 admin、密码 admin 以登录。密码随后可自行更改。 我们从左侧“连接”(Connections)进入“数据源”(Data sources),于右上角添加新数据源,选择 InfluxDB:
Grafana 数据源页面此后,我们需键入数据库主机名和端口、组织、桶和访问口令等:
Grafana 数据源设置蓝色按钮保存并测试连接。
接着,我们从左侧进入“面板”(Dashboards)页面,于右上角“新增”(New)处选择“导入面板”(Import):
Grafana 面板页面下面有两种选择,一是外国友人做好的成品,于中间一栏键入 “20199” 再点击 Load 即可导入;二是笔者借该友人之福,调校并汉化的成品,访问这个 Gitee 仓库,复制其中 grafana.json 的内容并粘贴到下方一栏以导入。
最后就到了奇迹的时刻!
Grafana 监测面板成品笔者的版本较原面板有以下变更:
原面板含有二级动态缓存(L2ARC)的展示,但笔者的系统未部署任何 L2ARC(相信有不少家用 TrueNAS 实例也未部署),故显示为空。已移除。如有相关需求,可以考虑从 20199 号面板取用。
拆分了内存和 Swap 使用曲线。
处理器使用率改以时间—曲线展示。
移除了开机时间(Uptime)背景的直线。
移除了内存使用饼状图,加入 UPS 剩余电量指示。
注意:UPS 电量指示仅适用于 TrueNAS Scale 24.04,如低于此版本则不会记录到。
恭喜你完成了 TrueNAS 监测栈的搭建!如有任何疑问或建议,欢迎在下面留言,我们下次再会!
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~