1110 字
6 分钟

Nomad自动分配Beszel监控

一、在Beszel中添加客户端#

Beszel Hub部署此处略过,请参照官网部署Beszel.dev

复制通用令牌和SSH公钥,后面连接时要用到。

注意一定是通用令牌并设置为永久,后续才能实现服务器监控的自动添加

二、在Nomad中新建job 连接Beszel#

新建job代码如下,保存并运行即可 注意,机器需要开启raw_exec才能正常运行beszel监控

# 这个变量用于控制 job 要部署到哪些 datacenter。
# 默认是 dc1;如果你的 Nomad 环境使用别的 datacenter,可在运行时覆盖。
variable "datacenters" {
type = list(string)
default = ["dc1"]
}
# Beszel Agent system job。
# type = system 表示:每个符合约束条件的 Nomad Client 节点都会部署 1 个 allocation。
job "beszel-agent-system" {
type = "system"
datacenters = var.datacenters
# 只允许在 Linux 节点上运行。
constraint {
attribute = "${attr.kernel.name}"
value = "linux"
}
# 只允许在启用了 raw_exec 驱动的节点上运行。
# 因为这个任务会直接在宿主机执行 Beszel Agent,而不是通过容器运行。
constraint {
attribute = "${attr.driver.raw_exec}"
value = "1"
}
group "agent" {
network {
mode = "host"
# 让 Nomad 为每个节点自动分配一个可用端口,避免固定端口冲突。
port "agent" {
}
}
# 当 agent 异常退出时的重启策略。
restart {
attempts = 10
interval = "1h"
delay = "15s"
mode = "delay"
}
task "beszel-agent" {
# 使用 raw_exec 直接在宿主机运行二进制。
driver = "raw_exec"
# 直接注入 Beszel Agent 所需环境变量。
# 这里保留原始写法:Hub / Token / 公钥直接写在 job 中。
env {
BESZEL_VERSION = "0.18.4"
HUB_URL = "你部署的Hub地址"
TOKEN = "上一步获取的永久token"
KEY = "上一步获取的SSH公钥"
DATA_DIR = "/var/lib/beszel-agent"
}
# 先执行 Nomad 模板渲染出来的启动脚本。
config {
command = "/bin/bash"
args = ["-lc", "exec \"$NOMAD_TASK_DIR/start-beszel-agent.sh\""]
}
# 启动脚本:负责选择端口、下载 agent、检测 GPU,并最终启动 Beszel Agent。
template {
destination = "local/start-beszel-agent.sh"
perms = "0755"
data = <<-EOF_SCRIPT
#!/usr/bin/env bash
set -euo pipefail
log() {
printf '[beszel-nomad] %s\n' "$1"
}
if [ -z "$BESZEL_VERSION" ]; then
log "BESZEL_VERSION 未设置,退出"
exit 1
fi
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
ARCH=$(uname -m)
# 识别宿主机 CPU 架构,并映射到 Beszel Release 的命名。
case "$ARCH" in
x86_64|amd64)
ARCH="amd64"
;;
aarch64|arm64)
ARCH="arm64"
;;
armv7l|armv6l|arm)
ARCH="arm"
;;
ppc64le)
ARCH="ppc64le"
;;
riscv64)
ARCH="riscv64"
;;
*)
log "不支持的 CPU 架构: $ARCH"
exit 1
;;
esac
# 优先使用 Nomad 分配的动态端口;如果没有,则回退到 45876。
LISTEN_VALUE=$(printenv NOMAD_PORT_agent 2>/dev/null || true)
if [ -n "$LISTEN_VALUE" ]; then
export LISTEN="$LISTEN_VALUE"
else
export LISTEN="45876"
fi
log "使用监听端口: $LISTEN"
STATE_DIR="$DATA_DIR"
CACHE_DIR="$STATE_DIR/nomad-cache"
# 优先写入宿主机持久目录;失败时回退到 allocation 目录。
if ! mkdir -p "$STATE_DIR" "$CACHE_DIR" 2>/dev/null; then
STATE_DIR="$NOMAD_ALLOC_DIR/beszel-agent-data"
CACHE_DIR="$NOMAD_ALLOC_DIR/beszel-agent-cache"
mkdir -p "$STATE_DIR" "$CACHE_DIR"
export DATA_DIR="$STATE_DIR"
log "回退到分配目录保存状态: $STATE_DIR"
fi
BIN_PATH="$CACHE_DIR/beszel-agent"
# 第一次启动时下载 Beszel Agent;后续直接复用缓存的二进制。
if [ ! -x "$BIN_PATH" ]; then
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"' EXIT
ARCHIVE_URL="https://github.com/henrygd/beszel/releases/download/v$BESZEL_VERSION/beszel-agent_"$OS"_"$ARCH".tar.gz"
ARCHIVE_PATH="$TMP_DIR/beszel-agent.tar.gz"
log "下载 Beszel Agent v$BESZEL_VERSION ($OS/$ARCH)"
if command -v curl >/dev/null 2>&1; then
curl -fsSL --retry 5 --connect-timeout 15 "$ARCHIVE_URL" -o "$ARCHIVE_PATH"
elif command -v wget >/dev/null 2>&1; then
wget -qO "$ARCHIVE_PATH" "$ARCHIVE_URL"
else
log "需要 curl 或 wget 来下载 Beszel Agent"
exit 1
fi
tar -xzf "$ARCHIVE_PATH" -C "$TMP_DIR"
install -m 0755 "$TMP_DIR/beszel-agent" "$BIN_PATH"
fi
# 尽量识别当前节点的 GPU 类型;如果没有 GPU,也正常启动 agent。
nvidia_found=0
amd_found=0
intel_found=0
if command -v nvidia-smi >/dev/null 2>&1; then
nvidia_found=1
fi
for vendor_file in /sys/class/drm/card*/device/vendor; do
[ -f "$vendor_file" ] || continue
case "$(cat "$vendor_file")" in
0x10de)
nvidia_found=1
;;
0x1002)
amd_found=1
;;
0x8086)
intel_found=1
;;
esac
done
# NVIDIA GPU 存在但缺少 nvidia-smi 时给出提示。
if [ "$nvidia_found" -eq 1 ] && ! command -v nvidia-smi >/dev/null 2>&1; then
log "检测到 NVIDIA GPU,但宿主机没有 nvidia-smi;请确认已安装驱动工具"
fi
# Intel GPU 存在但缺少常用采集工具时给出提示。
if [ "$intel_found" -eq 1 ] && ! command -v intel_gpu_top >/dev/null 2>&1 && ! command -v nvtop >/dev/null 2>&1; then
log "检测到 Intel GPU,但宿主机没有 intel_gpu_top 或 nvtop;Intel GPU 监控可能不完整"
fi
# 没有 GPU 时只上报主机指标;有 GPU 时记录识别结果。
if [ "$nvidia_found" -eq 0 ] && [ "$amd_found" -eq 0 ] && [ "$intel_found" -eq 0 ]; then
log "当前节点未检测到 GPU,Beszel 将仅上报主机指标"
else
summary=""
[ "$nvidia_found" -eq 1 ] && summary="$summary NVIDIA"
[ "$amd_found" -eq 1 ] && summary="$summary AMD"
[ "$intel_found" -eq 1 ] && summary="$summary Intel"
log "检测到 GPU 类型:$summary"
fi
# 启动 Beszel Agent 主进程。
exec "$BIN_PATH"
EOF_SCRIPT
}
# 这个任务本身占用的 Nomad 资源非常低。
resources {
cpu = 100
memory = 128
}
}
}
}

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Nomad自动分配Beszel监控
https://cablog.cacode.qzz.io/posts/08-nomad-config-for-beszel/
作者
CodeAtlantis
发布于
2026-03-01
许可协议
CC BY-NC-SA 4.0
最后更新于 2026-03-01,距今已过 41 天

部分内容可能已过时

Profile Image of the Author
CodeAtlantis
人道洛阳花似锦,偏我来时不逢春
公告
博客正式上线。记录个人成长路线。欢迎交流,共同成长。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
10
分类
5
标签
20
总字数
4,763
运行时长
0
最后活动
0 天前

目录