Files
argus/src/sys/tests
yuyr 34cb239bf4 完成H20服务器部署及重启测试 (#51)
当前部署情况
- h1: 部署server & client
- h2: 部署client
- 部署2025-11-25
- 部署目录:  /home2/argus/server  ,  /home2/argus/client
- 部署使用账号:argus

网络拓扑:
- h1 作为docker swarm manager
- h2 作为worker加入docker swarm
- docker swarm 上创建overlay network

访问方式:
- 通过ssh到h1服务器,端口转发 20006-20011 端口到笔记本本地;
- 门户网址:http://localhost:20006/dashboard

部署截图:
![image.png](/attachments/86c1a7af-dacc-4ba7-a182-f7cefd4e6427)
![image.png](/attachments/06f20852-771c-4264-b031-e6acd0f6ea1c)
![image.png](/attachments/091ab5a8-95bf-466f-a394-3255dcb49735)

注意事项:
- server各容器使用域名作为overlay network上alias别名,实现域名访问,当前版本禁用bind作为域名解析,原因是容器重启后IP变化场景bind机制复杂且不稳定。
- client 构建是内置安装包,容器启动时执行安装流程,后续重启容器跳过安装步骤。
- UID/GID:部署使用 argus账号 uid=2133, gid=2015。

Reviewed-on: #51
Reviewed-by: sundapeng <sundp@mail.zgclab.edu.cn>
Reviewed-by: xuxt <xuxt@zgclab.edu.cn>
Reviewed-by: huhy <husteryezi@163.com>
2025-11-25 15:54:29 +08:00
..

ARGUS 系统级端到端测试(Sys E2E)

本目录包含将 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-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]
    • 主机具备 Docker 与 Docker Compose。

    • UID/GID 配置(用于容器内文件属主与挂载卷写入权限)

      • 默认值:UID=2133、GID=2015。

      • 方式 A(推荐):在仓库根目录创建 configs/build_user.local.conf:

        UID=<你的宿主用户UID> GID=<你的宿主用户GID>

        例如:

        UID=1000 GID=1000

      • 方式 B:通过环境变量覆盖(优先级最高):

        export ARGUS_BUILD_UID=1000 export ARGUS_BUILD_GID=1000

      • 说明:scripts/common/build_user.sh 会按顺序读取 configs/build_user.local.conf → configs/build_user.conf → 环境变量,最终值会用于镜像构建参数与测试脚本,并在 01_bootstrap.sh 中对 src/sys/tests/private/argus/* 进行 chown 以匹配容器内运行用户。

  • 一键执行

    • cd src/sys/tests
    • ./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/02_up.sh 启动 Compose 栈(工程名 argus-sys)
    • ./scripts/03_wait_ready.sh 等待 ES/Kibana/Master/Fluent‑Bit/Bind/Prometheus/Grafana/Alertmanager/Web‑Proxy 就绪(Kibana 必须 200 且 overall.level=available;Web‑Proxy 8084/8085 要有 CORS 头)
    • ./scripts/04_verify_dns_routing.sh 校验 bind 解析与节点内域名解析
    • ./scripts/05_agent_register.sh 获取两个节点的 node_id 与初始 IP,检查本地 node.json
    • ./scripts/06_write_health_and_assert.sh 写健康文件并断言 nodes.json 仅包含 2 个在线节点
    • ./scripts/07_logs_send_and_assert.sh 向两个节点写日志,断言 ES train-*/infer-* 计数增长
    • ./scripts/08_restart_agent_reregister.sh node-b 改为固定 IP 172.31.0.200,验证保持同一节点 ID 且 IP/时间戳更新
    • ./scripts/10_metric_publish.sh 发布 metric 客户端包到 FTP
    • ./scripts/11_metric_node_install.sh 在 CPU 节点安装并验证端点
    • ./scripts/12_metric_gpu_install.sh 在 GPU 节点安装并等待 9100/9400 就绪(仅启用 GPU 时)
    • ./scripts/13_metric_verify.sh 对 master/Prometheus/数据面/Grafana 做综合校验(含 GPU 时校验 dcgm 指标)
    • ./scripts/15_alert_verify.sh 对alertmanager进行校验
    • ./scripts/16_web_verify.sh 对web页面进行校验综合校验。
    • ./scripts/14_metric_cleanup.sh 清理 FTP 产物
    • ./scripts/09_down.sh 回收容器、网络并清理 private*/、tmp/
  • 重置环境

    • 任何阶段失败可执行 ./scripts/09_down.sh 后重跑 01→…。

二、测试部署架构(docker-compose)

  • 网络

    • 自定义 bridge:sysnet(Compose 工程名为 argus-sys 时实际为 argus-sys_sysnet),子网 172.31.0.0/16
    • 固定地址:bind=172.31.0.2,master=172.31.0.10
  • 服务与端口(宿主机映射端口由 01_bootstrap.sh 自动分配并写入 .env)

    • 关键变量:MASTER_PORT、ES_HTTP_PORT、KIBANA_PORT、NODE_A_PORT、NODE_B_PORT、PROMETHEUS_PORT、GRAFANA_PORT、ALERTMANAGER_PORT、WEB_PROXY_PORT_8080..8085、FTP_PORT、FTP_DATA_PORT、FTP_PASSIVE_HOST_RANGE
    • bind(argus-bind9:latest):监听 53/tcp+udp;负责同步 *.argus.com 记录
    • master(argus-master:latest):对外 ${MASTER_PORT}→3000;API http://localhost:${MASTER_PORT}
    • es(argus-elasticsearch:latest):${ES_HTTP_PORT}→9200;单节点,无安全
    • kibana(argus-kibana:latest):${KIBANA_PORT}→5601
    • node-a(argus-sys-node:latest):同时运行 Fluent Bit + argus-agent,hostname=dev-yyrshare-nbnyx10-cp2f-pod-0,${NODE_A_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
    • 两个节点使用独立数据卷,互不与核心服务混用:
      • node-a:./private-nodea/argus/agent/<HOST> → /private/argus/agent/<HOST>
      • node-b:./private-nodeb/argus/agent/<HOST> → /private/argus/agent/<HOST>
    • 节点容器的 Fluent Bit/agent 资产以只读方式挂载到 /assets//usr/local/bin/argus-agent
  • DNS 配置

    • 节点容器通过 compose 配置 dns: [172.31.0.2] 指向 bind,不挂载 /etc/resolv.conf,也不依赖 update-dns.sh
    • master/es/kibana 仍共享 ./private,master 启动会写 /private/argus/etc/master.argus.com 供 bind 同步 A 记录
  • 节点入口

    • scripts/node_entrypoint.sh:
      • 离线优先:将 /assets/fluent-bit/packages 与 etc 拷贝到 /private,执行 /private/start-fluent-bit.sh 安装/拉起 Fluent Bit(监听 2020)
      • 以运行用户(映射 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

三、脚本与验证目标

  • 01_bootstrap.sh

    • 目的:准备目录结构、修正 ES/Kibana 数据目录属主、分发 update-dns.sh(仅核心服务使用)、构建 agent 二进制、写 .env
    • 失败排查:若 ES 无法写入数据,重跑本步骤确保目录属主为指定 UID/GID
  • 02_up.sh

    • 目的:以工程名 argus-sys 启动全栈;自动清理旧栈/网络
  • 03_wait_ready.sh

    • 目的:等待关键端口/健康接口可用
    • 判定:
      • ES /_cluster/health?wait_for_status=yellow 成功
      • Kibana GET /api/status 返回 200 且 overall.level=available
      • Master /readyz 成功
      • Fluent Bit 指标接口 :2020/:2021 可访问
      • bind named-checkconf 通过
      • Prometheus /-/ready 可用
      • Grafana GET /api/health 返回 200 且 database=ok
      • Alertmanager GET /api/v2/status 成功
      • Web‑Proxy:8080 首页 200;8083 首页 200/302;8084/8085 对来自 8080 的请求需返回 Access-Control-Allow-Origin(CORS)
  • 04_verify_dns_routing.sh

    • 目的:验证从 bind → 节点容器的解析链路
    • 判定:
      • private/argus/etc/master.argus.com 存在且为 master IP
      • 在 node-a/node-b 内 getent hosts master.argus.com 成功解析到 master IP
      • 在 metric CPU/GPU 节点内可解析 master.argus.com 与 prom.metric.argus.com
  • 05_agent_register.sh

    • 目的:确认两个节点注册到 master 并持久化 node.json
    • 输出:tmp/node_id_a|b、tmp/initial_ip_a|b、tmp/detail_*.json
  • 06_write_health_and_assert.sh

    • 目的:模拟节点健康上报并在 master 侧可见;nodes.json 仅保留在线节点
    • 操作:写 log-fluentbit.json、metric-node-exporter.json 至两个节点的 health 目录
  • 07_logs_send_and_assert.sh

    • 目的:通过 Fluent Bit 将两类日志注入 ES,计数应较基线增长且达到阈值(≥4)
    • 同时校验 ES 健康 green|yellow
  • 08_restart_agent_reregister.sh

    • 目的:验证节点重启与 IP 变更时保持相同 id 并更新 meta_data.ip 与 last_updated
    • 操作:以固定 IP 172.29.0.200 重建 node‑b 后轮询校验
  • 09_down.sh

    • 目的:栈销毁与环境清理;必要时使用临时容器修正属主再删除 private* 目录
  • 15_alert_verify.sh

    • 目的:验证alertmanager的可用性、Prometheus到alertmanager的连通性。
    • 操作:在Prometheus中增加一个恒为真的告警规则,查看alertmanager是否收到该告警
  • 16_web_verify.sh

    • 目的:验证web页面是否可用。
    • 使用playwright分别验证各个模块的页面是否可用,以及符合预期。

常见问题与排查

  • Kibana 长时间 503:机器较慢时初始化较久;脚本最长等待 ~15 分钟;先确认 ES 已就绪。
  • Fluent Bit 指标未就绪:检查节点容器日志与环境变量 CLUSTER/RACK 是否设置;确认入口脚本已经复制资产到 /private。
  • ES 无法启动:多为宿主目录权限问题;重跑 01_bootstrap.sh,或手动 chown -R <UID:GID> src/sys/tests/private/argus/log/*。

注意事项(2025‑10‑29 更新)

  • 宿主 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 指针导致 node‑exporter 启动失败

    • 现象:第 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 中追加查询与校验逻辑。


可选:GPU 流程说明

  • 前置条件:宿主安装 NVIDIA 驱动与 nvidia-container-toolkit,nvidia-smi 在宿主可用。
  • 启用方式:
    • 一键:./scripts/00_e2e_test.sh --enable-gpu
    • 分步:设置 ARGUS_SYS_ENABLE_GPU=true 后执行 01_bootstrap.sh、02_up.sh;或直接在 .env 中将 ENABLE_GPU=true 后单独运行 02_up.sh。
  • 01_bootstrap.sh 会写入:
    • METRIC_TEST_HOSTNAME_GPU=test-metric-gpu-node-001
    • METRIC_TEST_INSTANCE_GPU=172.31.0.51:9100
    • METRIC_TEST_DCGM_GPU=172.31.0.51:9400
  • 验证点:04_verify_dns_routing.sh 增加对 metric 节点的域名解析;12_metric_gpu_install.sh 等待 9100/9400;13_metric_verify_* 校验 dcgm 指标与 Grafana 面板。