# RMDC-Watchdog 内部交互流程 ## 一、交互流程总览 本文档详细描述了RMDC-Watchdog系统内部各组件之间的交互流程,包括Agent心跳上报、Node信息上报以及项目级别(二级授权中心)的完整业务流程。 ### 1.1 组件关系图 ```mermaid graph TB subgraph "项目环境 (K8S集群)" WATCHDOG["rmdc-watchdog
(二级授权中心)
Port: 8990"] AGENT1["rmdc-watchdog-agent
业务Pod A"] AGENT2["rmdc-watchdog-agent
业务Pod B"] NODE1["rmdc-watchdog-node
节点1 (DaemonSet)"] NODE2["rmdc-watchdog-node
节点2 (DaemonSet)"] end NODE1 --"POST /api/node/info
主机信息+运行指标"--> WATCHDOG NODE2 --"POST /api/node/info
主机信息+运行指标"--> WATCHDOG AGENT1 <--"POST /api/heartbeat
心跳+TOTP验证"--> WATCHDOG AGENT2 <--"POST /api/heartbeat
心跳+TOTP验证"--> WATCHDOG style WATCHDOG fill:#4ecdc4 style AGENT1 fill:#ff8787 style AGENT2 fill:#ff8787 style NODE1 fill:#a9e34b style NODE2 fill:#a9e34b ``` --- ## 二、Agent心跳上报流程 Agent是嵌入到业务Pod中的启动器,负责向Watchdog发送心跳请求进行授权验证。 ### 2.1 首次连接流程 ```mermaid sequenceDiagram autonumber participant Agent as rmdc-watchdog-agent
(业务启动器) participant Watchdog as rmdc-watchdog
(二级授权中心) rect rgb(200, 255, 200) Note over Agent,Watchdog: ===== 首次连接 - 获取TOTP密钥 ===== end Agent->>Agent: 1. 收集环境信息
GetEnvInfo() Agent->>Agent: 2. 收集主机信息
host_info.GetAllInfo() Agent->>Watchdog: 3. POST /api/heartbeat
{HostInfo, EnvInfo, Timestamp, TOTPCode=""} Watchdog->>Watchdog: 4. 验证时间戳有效性
|now - timestamp| < 5分钟 Watchdog->>Watchdog: 5. 添加主机信息到集合
AddHostInfo() Watchdog->>Watchdog: 6. 检测TOTPCode为空
返回TOTP密钥 Watchdog-->>Agent: 7. 返回响应
{Authorized:false, SecondTOTPSecret:secret} Agent->>Agent: 8. 保存TOTP密钥
tierTwoTotpSecret = secret Note over Agent: 密钥保存在内存中
后续心跳使用此密钥 ``` ### 2.2 后续心跳流程 ```mermaid sequenceDiagram autonumber participant Agent as rmdc-watchdog-agent
(业务启动器) participant Watchdog as rmdc-watchdog
(二级授权中心) participant Business as 业务进程
(Java/Python) rect rgb(220, 255, 220) Note over Agent,Business: ===== 心跳循环 - 授权验证 ===== end loop 心跳循环 (成功后2小时, 失败后1小时) Agent->>Agent: 1. 生成TOTP验证码
GenerateTierTwoTOTPCode(secret)
6位, 30秒有效 Agent->>Watchdog: 2. POST /api/heartbeat
{HostInfo, EnvInfo, Timestamp, TOTPCode} Watchdog->>Watchdog: 3. 验证时间戳有效性 Watchdog->>Watchdog: 4. 验证TOTP验证码
VerifyTierTwoTOTPCode() alt TOTP验证成功 Watchdog->>Watchdog: 5. 检查主机授权状态
IsHostAuthorized(hostInfo) Watchdog->>Watchdog: 6. 生成响应TOTP验证码
(双向验证) Watchdog-->>Agent: 7. 返回{Authorized:true/false, TOTPCode} Agent->>Agent: 8. 验证服务端TOTP
双向验证确保安全 alt 授权成功 Agent->>Agent: 9. failCount = 1
等待2小时 else 授权失败 Agent->>Agent: 9. failCount++
等待1小时 end else TOTP验证失败 Watchdog-->>Agent: 返回错误:无效的TOTP验证码 Agent->>Agent: failCount++ end alt failCount >= 12 Note over Agent,Business: 死手系统触发 Agent->>Business: 10. 发送SIGTERM信号 Note over Business: 业务进程终止 end end ``` ### 2.3 心跳请求/响应数据结构 | 字段 | 类型 | 说明 | |------|------|------| | **HeartbeatRequest** | | | | host_info | HostInfo | 主机硬件信息 | | env_info | EnvInfo | 环境信息(K8S_NAMESPACE, APPLICATION_NAME等) | | timestamp | int64 | 请求时间戳 | | totp_code | string | TOTP验证码(首次为空) | | **HeartbeatResponse** | | | | authorized | bool | 是否已授权 | | totp_code | string | 响应TOTP验证码(双向验证) | | timestamp | int64 | 响应时间戳 | | second_totp_secret | string | 二级TOTP密钥(首次连接时返回) | --- ## 三、Node主机信息上报流程 Node以DaemonSet方式运行在每个K8S节点上,负责收集主机硬件信息和运行指标。 ### 3.1 Node上报流程 ```mermaid sequenceDiagram autonumber participant Node as rmdc-watchdog-node
(DaemonSet) participant Watchdog as rmdc-watchdog
(二级授权中心) rect rgb(200, 220, 255) Note over Node,Watchdog: ===== 首次上报 - 获取TOTP密钥 ===== end Node->>Node: 1. 收集主机硬件信息
CollectHostInfo() Node->>Node: 2. 收集运行指标
CollectMetrics() Node->>Watchdog: 3. POST /api/node/info
{NodeID, HostInfo, Metrics, Timestamp, TOTPCode=""} Watchdog->>Watchdog: 4. 验证时间戳 Watchdog->>Watchdog: 5. 存储Node信息 Watchdog->>Watchdog: 6. 同步更新AuthService
AddHostInfo() Watchdog-->>Node: 7. 返回{Success:true, SecondTOTPSecret:secret} Node->>Node: 8. 保存TOTP密钥 rect rgb(220, 255, 220) Note over Node,Watchdog: ===== 定时上报 (默认60秒) ===== end loop 定时上报 Node->>Node: 9. 生成TOTP验证码 Node->>Node: 10. 收集最新指标 Node->>Watchdog: 11. POST /api/node/info
{NodeID, HostInfo, Metrics, Timestamp, TOTPCode} Watchdog->>Watchdog: 12. 验证TOTP Watchdog->>Watchdog: 13. 更新Node信息 Watchdog->>Watchdog: 14. 生成响应TOTP Watchdog-->>Node: 15. 返回{Success:true, TOTPCode} Node->>Node: 16. 验证响应TOTP(双向) end ``` ### 3.2 Node信息数据结构 | 字段 | 类型 | 说明 | |------|------|------| | **NodeInfoRequest** | | | | node_id | string | 节点唯一标识(MachineID) | | host_info | HostInfo | 主机硬件信息 | | metrics | NodeRuntimeMetrics | 运行指标 | | timestamp | int64 | 请求时间戳 | | totp_code | string | TOTP验证码 | | **NodeRuntimeMetrics** | | | | cpu_usage | float64 | CPU使用率(%) | | memory_usage | float64 | 内存使用率(%) | | disk_usage | float64 | 磁盘使用率(%) | | network_rx_kb | uint64 | 网络接收KB | | network_tx_kb | uint64 | 网络发送KB | | collect_time | int64 | 采集时间戳 | --- ## 四、项目级别(二级授权中心)完整业务流程 ### 4.1 完整授权流程 ```mermaid sequenceDiagram autonumber participant Node as rmdc-watchdog-node
(DaemonSet) participant Agent as rmdc-watchdog-agent
(业务启动器) participant Watchdog as rmdc-watchdog
(二级授权中心) participant MQTT as Exchange-Hub
(MQTT Server) participant Center as rmdc-watchdog-center
(一级授权中心) rect rgb(200, 220, 255) Note over Node,Center: ===== 阶段1: 信息收集与初始化 ===== end Note over Node: 项目部署后
DaemonSet启动 Node->>Watchdog: 1. 上报主机信息
POST /api/node/info Watchdog-->>Node: 2. 返回TOTP密钥 Note over Agent: 业务Pod启动 Agent->>Watchdog: 3. 发送首次心跳
POST /api/heartbeat Watchdog-->>Agent: 4. 返回TOTP密钥 rect rgb(220, 255, 220) Note over Node,Center: ===== 阶段2: 授权申请 ===== end Watchdog->>Watchdog: 5. 生成授权文件
GenerateAuthorizationFile() Note over Watchdog: 授权文件包含:
- EncryptedHostMap
- TOTPCode (8位,30分钟)
- EncryptedNamespace Watchdog->>MQTT: 6. 发布授权申请Command
wdd/RDMC/command/up MQTT->>Center: 7. 转发授权申请 rect rgb(255, 240, 220) Note over Node,Center: ===== 阶段3: 授权验证与下发 ===== end Center->>Center: 8. 解密项目命名空间 Center->>Center: 9. 验证Tier-One TOTP验证码 Center->>Center: 10. 验证主机信息完整性 alt 验证成功 Center->>Center: 11. 生成新TOTP验证码 Center->>Center: 12. 构造授权码 Center->>MQTT: 13. 发布授权码
wdd/RDMC/command/down/{project_id} else 验证失败 Center->>MQTT: 发布授权拒绝消息 end MQTT->>Watchdog: 14. 推送授权码 rect rgb(230, 230, 255) Note over Node,Center: ===== 阶段4: 授权存储与生效 ===== end Watchdog->>Watchdog: 15. 验证返回的TOTP Watchdog->>Watchdog: 16. 解密并验证命名空间 Watchdog->>Watchdog: 17. 解密每个主机信息 Watchdog->>Watchdog: 18. 计算时间偏移
timeOffset = now - firstAuthTime Watchdog->>Watchdog: 19. 加密并持久化保存 rect rgb(200, 255, 200) Note over Node,Center: ===== 阶段5: 授权使用 ===== end loop Agent心跳循环 Agent->>Watchdog: 20. 发送心跳请求 Watchdog->>Watchdog: 21. 检查主机授权状态 Watchdog-->>Agent: 22. 返回{Authorized:true} end Note over Agent: 授权成功
业务正常运行 ``` ### 4.2 授权状态机 ```mermaid stateDiagram-v2 [*] --> 未初始化: 项目部署 未初始化 --> 收集主机信息: Node/Agent连接 收集主机信息 --> 等待授权: 生成授权文件 等待授权 --> 已授权: 收到有效授权码 等待授权 --> 未授权: 授权被拒绝 已授权 --> 已授权: 心跳成功 已授权 --> 授权过期: 时间篡改检测 已授权 --> 未授权: 授权撤销 未授权 --> 等待授权: 重新申请 授权过期 --> 未授权: 需重新授权 ``` --- ## 五、API接口清单 ### 5.1 Watchdog API (Port: 8990) | 路径 | 方法 | 说明 | |------|------|------| | `/api/heartbeat` | POST | Agent心跳接口 | | `/api/heartbeat/hosts` | GET | 获取所有心跳主机 | | `/api/node/info` | POST | Node信息上报接口 | | `/api/node/list` | GET | 获取所有Node列表 | | `/api/node/metrics/:node_id` | GET | 获取指定Node的运行指标 | | `/api/authorization/generate` | GET | 生成授权文件 | | `/api/authorization/auth` | POST | 接收授权码 | | `/api/authorization/hosts` | GET | 获取所有已授权主机 | --- ## 六、安全机制 ### 6.1 TOTP验证机制 | 场景 | 验证方式 | 参数 | |------|----------|------| | Agent ↔ Watchdog | Tier-Two TOTP | 6位码, 30秒有效, SHA1 | | Node ↔ Watchdog | Tier-Two TOTP | 6位码, 30秒有效, SHA1 | | Watchdog ↔ Center | Tier-One TOTP | 8位码, 30分钟有效, SHA256 | ### 6.2 双向验证流程 1. **客户端(Agent/Node)** 生成TOTP验证码并发送请求 2. **服务端(Watchdog)** 验证客户端TOTP后,生成新的TOTP验证码返回 3. **客户端** 验证服务端返回的TOTP验证码 4. 双向验证确保通信双方身份合法 ### 6.3 死手系统 Agent内置死手系统,当连续12次心跳失败后,将发送SIGTERM信号终止业务进程。 | 参数 | 值 | 说明 | |------|------|------| | maxRetryCount | 12 | 最大重试次数 | | defaultHeartbeatInterval | 2小时 | 成功后心跳间隔 | | failWaitInterval | 1小时 | 失败后等待间隔 |