[#30] wsl部署测试;更新README

This commit is contained in:
yuyr 2025-10-29 16:33:38 +08:00
parent b6da5bc8b8
commit ed0d1ca904
6 changed files with 112 additions and 10 deletions

View File

@ -1 +1 @@
1.35.0 1.37.0

View File

@ -48,6 +48,15 @@ if [[ ${#missing_files[@]} -gt 0 ]]; then
exit 1 exit 1
fi fi
# 防御:阻止将 Git LFS 指针文件打包
for f in bin/dcgm-exporter bin/datacenter-gpu-manager_3.3.9_amd64.deb; do
if head -n1 "$f" 2>/dev/null | grep -q '^version https://git-lfs.github.com/spec/v1$'; then
echo "[ERROR] $f 是 Git LFS 指针文件,未还原为真实制品"
echo " 请在仓库根目录执行: git lfs fetch --all && git lfs checkout"
exit 1
fi
done
log_success "所有必要文件检查完成" log_success "所有必要文件检查完成"
# 创建临时目录 # 创建临时目录

View File

@ -47,6 +47,13 @@ if [[ ${#missing_files[@]} -gt 0 ]]; then
exit 1 exit 1
fi fi
# 防御:阻止将 Git LFS 指针文件打包
if head -n1 bin/node_exporter 2>/dev/null | grep -q '^version https://git-lfs.github.com/spec/v1$'; then
echo "[ERROR] bin/node_exporter 是 Git LFS 指针文件,未还原为真实二进制"
echo " 请在仓库根目录执行: git lfs fetch --all && git lfs checkout"
exit 1
fi
log_success "所有必要文件检查完成" log_success "所有必要文件检查完成"
# 创建临时目录 # 创建临时目录

View File

@ -216,6 +216,36 @@ if [[ ${#missing_components[@]} -gt 0 ]]; then
exit 1 exit 1
fi fi
# 额外校验:阻止将 Git LFS 指针文件打进安装包
# 仅检查各组件目录下的 bin/ 内文件(常见为二进制或 .deb/.tar.gz 制品)
is_lfs_pointer() {
local f="$1"
# 读取首行判断是否为 LFS pointer无需依赖 file 命令)
head -n1 "$f" 2>/dev/null | grep -q '^version https://git-lfs.github.com/spec/v1$'
}
log_info "检查组件二进制是否已从 LFS 拉取..."
while IFS= read -r component; do
component_path=$(grep "^$component:" "$TEMP_DIR/component_paths.txt" | cut -d':' -f2-)
bin_dir="$component_path/bin"
[[ -d "$bin_dir" ]] || continue
while IFS= read -r f; do
# 只检查常见可执行/包后缀;无后缀的也检查
case "$f" in
*.sh) continue;;
*) :;;
esac
if is_lfs_pointer "$f"; then
log_error "检测到 Git LFS 指针文件: $f"
log_error "请在仓库根目录执行: git lfs fetch --all && git lfs checkout"
log_error "或确保 CI 在打包前已还原 LFS 大文件。"
rm -rf "$TEMP_DIR"
exit 1
fi
done < <(find "$bin_dir" -maxdepth 1 -type f 2>/dev/null | sort)
done < "$COMPONENTS_FILE"
log_success "LFS 校验通过:未发现指针文件"
# 打包各个组件 # 打包各个组件
log_info "开始打包组件..." log_info "开始打包组件..."
@ -234,7 +264,19 @@ while IFS= read -r component; do
# 进入组件目录 # 进入组件目录
cd "$component_path" cd "$component_path"
# 组件内二次防御:若包脚本缺失 LFS 校验,这里再次阻断
if [[ -d bin ]]; then
for f in bin/*; do
[[ -f "$f" ]] || continue
if head -n1 "$f" 2>/dev/null | grep -q '^version https://git-lfs.github.com/spec/v1$'; then
log_error "组件 $component 含 LFS 指针文件: $f"
log_error "请执行: git lfs fetch --all && git lfs checkout"
cd "$CURRENT_DIR"; rm -rf "$TEMP_DIR"; exit 1
fi
done
fi
# 检查组件是否有 package.sh # 检查组件是否有 package.sh
if [[ ! -f "package.sh" ]]; then if [[ ! -f "package.sh" ]]; then
log_error "$component 缺少 package.sh 文件" log_error "$component 缺少 package.sh 文件"

7
src/sys/tests/.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
private/
private-nodea/
private-nodeb/
tmp/
.env

View File

@ -1,13 +1,17 @@
# ARGUS 系统级端到端测试Sys E2E # ARGUS 系统级端到端测试Sys E2E
本目录包含将 log 与 agent 两线验证合并后的系统级端到端测试。依赖 bind/master/es/kibana + 两个“日志节点”(每个节点容器内同时运行 Fluent Bit 与 argus-agent 本目录包含将 log、metric 与 agent 三线验证合并后的系统级端到端测试。依赖 bind/master/es/kibana/metric(ftp+prometheus+grafana+alertmanager)/web-proxy/web-frontend + 两个“计算节点”(每个节点容器内同时运行 Fluent Bit 与 argus-agent
--- ---
## 一、如何运行 ## 一、如何运行
- 前置条件 - 前置条件
- 已构建镜像:`argus-elasticsearch:latest``argus-kibana:latest``argus-bind9:latest``argus-master:latest` - 已构建镜像:
- 基座:`argus-elasticsearch:latest``argus-kibana:latest``argus-bind9:latest``argus-master:latest`
- 节点:`argus-sys-node:latest`
- 指标:`argus-metric-ftp:latest``argus-metric-prometheus:latest``argus-metric-grafana:latest``argus-alertmanager:latest`
- 前端与代理:`argus-web-frontend:latest``argus-web-proxy:latest`
- 可用根目录命令构建:`./build/build_images.sh [--intranet]` - 可用根目录命令构建:`./build/build_images.sh [--intranet]`
- 主机具备 Docker 与 Docker Compose。 - 主机具备 Docker 与 Docker Compose。
@ -33,11 +37,12 @@
- 一键执行 - 一键执行
- `cd src/sys/tests` - `cd src/sys/tests`
- `./scripts/00_e2e_test.sh`CPU-only`./scripts/00_e2e_test.sh --enable-gpu`(启用 GPU 流程) - `./scripts/00_e2e_test.sh`CPU-only`./scripts/00_e2e_test.sh --enable-gpu`(启用 GPU 流程)
- 可选:`--no-clean` 跳过清理,便于失败后现场排查
- 分步执行(推荐用于排查) - 分步执行(推荐用于排查)
- `./scripts/01_bootstrap.sh` 生成目录/拷贝 `update-dns.sh`/构建 agent 二进制/写 `.env` - `./scripts/01_bootstrap.sh` 生成目录/拷贝 `update-dns.sh`/构建 agent 二进制/写 `.env`
- `./scripts/02_up.sh` 启动 Compose 栈(工程名 `argus-sys` - `./scripts/02_up.sh` 启动 Compose 栈(工程名 `argus-sys`
- `./scripts/03_wait_ready.sh` 等待 ES/Kibana/Master/FluentBit/Bind 就绪Kibana 必须返回 200 且 overall.level=available - `./scripts/03_wait_ready.sh` 等待 ES/Kibana/Master/FluentBit/Bind/Prometheus/Grafana/Alertmanager/WebProxy 就绪Kibana 必须 200 且 overall.level=availableWebProxy 8084/8085 要有 CORS 头
- `./scripts/04_verify_dns_routing.sh` 校验 bind 解析与节点内域名解析 - `./scripts/04_verify_dns_routing.sh` 校验 bind 解析与节点内域名解析
- `./scripts/05_agent_register.sh` 获取两个节点的 `node_id` 与初始 IP检查本地 `node.json` - `./scripts/05_agent_register.sh` 获取两个节点的 `node_id` 与初始 IP检查本地 `node.json`
- `./scripts/06_write_health_and_assert.sh` 写健康文件并断言 `nodes.json` 仅包含 2 个在线节点 - `./scripts/06_write_health_and_assert.sh` 写健康文件并断言 `nodes.json` 仅包含 2 个在线节点
@ -60,7 +65,7 @@
## 二、测试部署架构docker-compose ## 二、测试部署架构docker-compose
- 网络 - 网络
- 自定义 bridge`argus-sys-net`,子网 `172.31.0.0/16` - 自定义 bridge`sysnet`Compose 工程名为 `argus-sys` 时实际为 `argus-sys_sysnet`,子网 `172.31.0.0/16`
- 固定地址bind=`172.31.0.2`master=`172.31.0.10` - 固定地址bind=`172.31.0.2`master=`172.31.0.10`
- 服务与端口(宿主机映射端口由 `01_bootstrap.sh` 自动分配并写入 `.env` - 服务与端口(宿主机映射端口由 `01_bootstrap.sh` 自动分配并写入 `.env`
@ -68,9 +73,15 @@
- `bind``argus-bind9:latest`):监听 53/tcp+udp负责同步 `*.argus.com` 记录 - `bind``argus-bind9:latest`):监听 53/tcp+udp负责同步 `*.argus.com` 记录
- `master``argus-master:latest`):对外 `${MASTER_PORT}→3000`API `http://localhost:${MASTER_PORT}` - `master``argus-master:latest`):对外 `${MASTER_PORT}→3000`API `http://localhost:${MASTER_PORT}`
- `es``argus-elasticsearch:latest``${ES_HTTP_PORT}→9200`;单节点,无安全 - `es``argus-elasticsearch:latest``${ES_HTTP_PORT}→9200`;单节点,无安全
- `kibana``argus-kibana:latest``${KIBANA_PORT}→5601`;通过 `ELASTICSEARCH_HOSTS=http://es:9200` 访问 ES - `kibana``argus-kibana:latest``${KIBANA_PORT}→5601`
- `node-a``ubuntu:22.04`):同时运行 Fluent Bit + argus-agent`hostname=dev-yyrshare-nbnyx10-cp2f-pod-0``${NODE_A_PORT}→2020` - `node-a``argus-sys-node:latest`):同时运行 Fluent Bit + argus-agent`hostname=dev-yyrshare-nbnyx10-cp2f-pod-0``${NODE_A_PORT}→2020`
- `node-b``ubuntu:22.04`):同时运行 Fluent Bit + argus-agent`hostname=dev-yyrshare-uuuu10-ep2f-pod-0``${NODE_B_PORT}→2020` - `node-b``argus-sys-node:latest`):同时运行 Fluent Bit + argus-agent`hostname=dev-yyrshare-uuuu10-ep2f-pod-0``${NODE_B_PORT}→2020`
- `ftp``argus-metric-ftp:latest``${FTP_PORT}→21`/`${FTP_DATA_PORT}→20`/`${FTP_PASSIVE_HOST_RANGE}` 被动端口
- `prometheus``argus-metric-prometheus:latest``${PROMETHEUS_PORT}→9090`
- `grafana``argus-metric-grafana:latest``${GRAFANA_PORT}→3000`
- `alertmanager``argus-alertmanager:latest``${ALERTMANAGER_PORT}→9093`
- `web-frontend``argus-web-frontend:latest`):内部访问页面,使用 `web-proxy` 暴露的对外端口渲染超链
- `web-proxy``argus-web-proxy:latest`):多端口转发 8080..8085首页、Grafana、Prometheus、Kibana、Alertmanager、Master API
- 卷与目录 - 卷与目录
- 核心服务bind/master/es/kibana共享宿主 `./private` 挂载到容器 `/private` - 核心服务bind/master/es/kibana共享宿主 `./private` 挂载到容器 `/private`
@ -85,7 +96,7 @@
- 节点入口 - 节点入口
- `scripts/node_entrypoint.sh` - `scripts/node_entrypoint.sh`
- 复制 `/assets/fluent-bit/*` 到容器 `/private`,后台启动 Fluent Bit监听 2020 - 离线优先:将 `/assets/fluent-bit/packages``etc` 拷贝到 `/private`,执行 `/private/start-fluent-bit.sh` 安装/拉起 Fluent Bit监听 2020
- 以运行用户(映射 UID/GID前台启动 `argus-agent` - 以运行用户(映射 UID/GID前台启动 `argus-agent`
- 节点环境变量:`MASTER_ENDPOINT=http://master.argus.com:3000``REPORT_INTERVAL_SECONDS=2``ES_HOST=es``ES_PORT=9200``CLUSTER=local``RACK=dev` - 节点环境变量:`MASTER_ENDPOINT=http://master.argus.com:3000``REPORT_INTERVAL_SECONDS=2``ES_HOST=es``ES_PORT=9200``CLUSTER=local``RACK=dev`
@ -108,6 +119,10 @@
- Master `/readyz` 成功 - Master `/readyz` 成功
- Fluent Bit 指标接口 `:2020/:2021` 可访问 - Fluent Bit 指标接口 `:2020/:2021` 可访问
- bind `named-checkconf` 通过 - bind `named-checkconf` 通过
- Prometheus `/-/ready` 可用
- Grafana `GET /api/health` 返回 200 且 `database=ok`
- Alertmanager `GET /api/v2/status` 成功
- WebProxy8080 首页 2008083 首页 200/3028084/8085 对来自 8080 的请求需返回 `Access-Control-Allow-Origin`CORS
- `04_verify_dns_routing.sh` - `04_verify_dns_routing.sh`
- 目的:验证从 bind → 节点容器的解析链路 - 目的:验证从 bind → 节点容器的解析链路
@ -151,6 +166,28 @@
--- ---
## 注意事项20251029 更新)
- 宿主 inotify 限制导致 03 卡住Fluent Bit in_tail EMFILE
- 现象:`03_wait_ready.sh` 一直等待 `:2020/:2021 /api/v2/metrics`;节点日志出现 `tail_fs_inotify.c errno=24 Too many open files`Fluent Bit 启动失败。
- 根因:宿主 `fs.inotify.max_user_instances` 上限过低(常见默认 128被其他进程占满并非容器内 `ulimit -n` 过低。
- 处理:在宿主执行(临时):
- `sudo sysctl -w fs.inotify.max_user_instances=1024 fs.inotify.max_user_watches=1048576`
- 建议永久:写入 `/etc/sysctl.d/99-argus-inotify.conf``sudo sysctl --system`
- 提示:节点入口里对 sysctl 的写操作不影响宿主;需在宿主调整。
- Metric 安装制品包含 Git LFS 指针导致 nodeexporter 启动失败
- 现象:第 11 步在线安装后,日志显示 `Node Exporter 服务启动失败`;容器内 `/usr/local/bin/node-exporter` 头部是文本:`version https://git-lfs.github.com/spec/v1`
- 根因:发布到 FTP 的安装包在打包前未执行 `git lfs fetch/checkout`,将指针文件打入制品。
- 处理:在仓库根目录执行 `git lfs fetch --all && git lfs checkout` 后,重跑 `src/metric/tests/scripts/02_publish_artifact.sh` 再重试 `11_metric_node_install.sh`
- 防呆:已在 `all-in-one-full/scripts/package_artifact.sh` 与组件 `plugins/*/package.sh` 增加 LFS 指针校验,发现即失败并提示修复。
建议:
- 运行前检查宿主 inotify 值≥1024/≥1048576与宿主端口占用8080..8085、9200/5601/9090/9093/2020/2021/32300 等)。
- 如需排查失败,使用 `--no-clean` 保留现场,配合 `docker logs``curl``tmp/*.json` 进行定位。
---
如需更严格的断言(例如 Kibana 载入具体插件、ES 文档字段校验),可在 `07_*.sh` 中追加查询与校验逻辑。 如需更严格的断言(例如 Kibana 载入具体插件、ES 文档字段校验),可在 `07_*.sh` 中追加查询与校验逻辑。
--- ---