完成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 部署截图:    注意事项: - 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>
This commit was merged in pull request #51.
This commit is contained in:
7
src/sys/tests/.gitignore
vendored
Normal file
7
src/sys/tests/.gitignore
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
private/
|
||||
private-nodea/
|
||||
private-nodeb/
|
||||
tmp/
|
||||
|
||||
.env
|
||||
@@ -1,13 +1,17 @@
|
||||
# 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]`
|
||||
- 主机具备 Docker 与 Docker Compose。
|
||||
|
||||
@@ -33,11 +37,12 @@
|
||||
- 一键执行
|
||||
- `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 就绪(Kibana 必须返回 200 且 overall.level=available)
|
||||
- `./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 个在线节点
|
||||
@@ -60,7 +65,7 @@
|
||||
## 二、测试部署架构(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`
|
||||
|
||||
- 服务与端口(宿主机映射端口由 `01_bootstrap.sh` 自动分配并写入 `.env`)
|
||||
@@ -68,9 +73,15 @@
|
||||
- `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`;通过 `ELASTICSEARCH_HOSTS=http://es:9200` 访问 ES
|
||||
- `node-a`(`ubuntu:22.04`):同时运行 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`
|
||||
- `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`
|
||||
@@ -85,7 +96,7 @@
|
||||
|
||||
- 节点入口
|
||||
- `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`
|
||||
- 节点环境变量:`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` 成功
|
||||
- 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 → 节点容器的解析链路
|
||||
@@ -151,6 +166,28 @@
|
||||
|
||||
---
|
||||
|
||||
## 注意事项(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` 中追加查询与校验逻辑。
|
||||
|
||||
---
|
||||
|
||||
@@ -32,12 +32,9 @@ echo "[INFO] initial counts: train=${train0} infer=${infer0} total=${base}"
|
||||
send_logs() {
|
||||
local cname="$1"; local hosttag="$2"
|
||||
docker exec "$cname" sh -lc 'mkdir -p /logs/train /logs/infer'
|
||||
docker exec "$cname" sh -lc "ts=\
|
||||
\$(date '+%F %T'); echo \"\$ts INFO [$hosttag] training step=1 loss=1.23 model=bert\" >> /logs/train/train-demo.log"
|
||||
docker exec "$cname" sh -lc "ts=\
|
||||
\$(date '+%F %T'); echo \"\$ts INFO [$hosttag] training step=2 loss=1.10 model=bert\" >> /logs/train/train-demo.log"
|
||||
docker exec "$cname" sh -lc "ts=\
|
||||
\$(date '+%F %T'); echo \"\$ts WARN [$hosttag] inference slow on batch=2 latency=1.9s\" >> /logs/infer/infer-demo.log"
|
||||
docker exec "$cname" sh -lc "ts=\$(date -u +%Y-%m-%dT%H:%M:%SZ); echo \"\$ts INFO [$hosttag] training step=1 loss=1.23 model=bert\" >> /logs/train/train-demo.log"
|
||||
docker exec "$cname" sh -lc "ts=\$(date -u +%Y-%m-%dT%H:%M:%SZ); echo \"\$ts INFO [$hosttag] training step=2 loss=1.10 model=bert\" >> /logs/train/train-demo.log"
|
||||
docker exec "$cname" sh -lc "ts=\$(date -u +%Y-%m-%dT%H:%M:%SZ); echo \"\$ts WARN [$hosttag] inference slow on batch=2 latency=1.9s\" >> /logs/infer/infer-demo.log"
|
||||
}
|
||||
|
||||
# Determine container names
|
||||
|
||||
0
src/sys/tests/scripts/15_alert_verify.sh
Normal file → Executable file
0
src/sys/tests/scripts/15_alert_verify.sh
Normal file → Executable file
0
src/sys/tests/scripts/16_web_verify.sh
Normal file → Executable file
0
src/sys/tests/scripts/16_web_verify.sh
Normal file → Executable file
Reference in New Issue
Block a user