Skip to content

Node Agent 配置

配置类:apps/node-agent/agent/core/config.pyAgentConfig / load_agent_config()),CLI 解析在 agent/main.py。CLI 全参数与退出码见 CLI 与脚本


三来源与优先级

CLI 参数  >  环境变量 (DN42_AGENT_*)  >  TOML 文件  >  内置默认值

加载流程:

  1. load_agent_config(toml_path) 先取 AgentConfig() 默认,TOML 文件存在则 _apply_toml 覆盖,再 _apply_env 用环境变量覆盖,最后 _validate_choices 校验枚举。
  2. CLI 层 _config_from_args 在上一步结果之上叠加命令行覆盖。

约定:

  • TOML 文件不存在不报错,相当于跳过该来源。路径由 --config 指定,约定默认 /etc/dn42-control/agent.toml
  • TOML 顶层可用 [agent] 表,也可直接平铺。
  • TOML 只识别白名单字段,出现未知键抛 ConfigError——避免静默拼写错误。
  • 各层的覆盖只应用None 的项,所以低优先级来源不会被高优先级来源的「未提供」清空。

CLI 只暴露身份与模式类参数--controller-url / --enrollment-token / --state-dir / --mode / 诊断三选一等)。下表 http_timeout_seconds 及其后的全部调优项——间隔、阈值、socket 路径——只能通过环境变量或 TOML 设置。


身份与模式

环境变量字段类型默认说明
DN42_AGENT_CONTROLLER_URLcontroller_urlstr | NoneNoneControl Server 基础 URL(不带尾斜杠)。常驻模式必需
DN42_AGENT_ENROLLMENT_TOKENenrollment_tokenstr | NoneNone一次性 enrollment token
DN42_AGENT_REQUESTED_NODE_IDrequested_node_idstr | NoneNone希望绑定的 node_id
DN42_AGENT_HOSTNAMEhostnamestr | NoneNone覆盖 inventory 中的 hostname
DN42_AGENT_STATE_DIRstate_dirPath/var/lib/dn42-control本地状态目录
DN42_AGENT_RENDERED_DIRrendered_dirPath | NoneNone(派生)渲染输出目录。留空则从节点目录派生
DN42_AGENT_MODEmodeapply / write-rendered / plan-onlyapplyreconcile 深度;非法值抛 ConfigError
DN42_AGENT_LOG_LEVELlog_levelstrINFO日志级别

desired_state_path 只能经 TOML 或 CLI --desired-state 设置(无对应环境变量),用于离线运行;与 controller_url 互斥。


网络与收敛

环境变量字段类型默认说明
DN42_AGENT_HTTP_TIMEOUT_SECONDShttp_timeout_secondsfloat30.0控制面 HTTP 读超时。大节点的上报端点在服务端处理加跨境路径延迟下可能逼近 10s,超时过短会造成对账假失败
DN42_AGENT_LOCAL_CONVERGENCElocal_convergenceboolTrue是否执行本机收敛(birdc configure、按接口同步 WireGuard)

旁路任务周期

每一项都独立于 reconcile 闭环,设 0 即关闭该任务

环境变量字段默认(秒)任务
DN42_AGENT_ROUTING_INTERVAL_SECONDSrouting_interval_seconds300.0路由全表周期采集(直连 BIRD 控制 socket 的纯观测)
DN42_AGENT_TRAFFIC_INTERVAL_SECONDStraffic_interval_seconds30.0WG 流量轻量采集:一次 wg show all transfer 求和上报,供控制面画比完整快照更细粒度的吞吐曲线
DN42_AGENT_RERESOLVE_INTERVAL_SECONDSreresolve_interval_seconds45.0WG endpoint 周期重解析:对端走动态 DNS、IP 变更后内核仍钉死旧 IP,本任务据握手超时用域名重设 endpoint
DN42_AGENT_L3_HEAL_INTERVAL_SECONDSl3_heal_interval_seconds60.0L3 漂移自愈:比对期望接口(WG + dummy)与 netns 实际接口,缺失即重跑补齐。容器 Up 但接口被删的运行时漂移,config_hash 看不见
DN42_AGENT_SELF_MONITOR_INTERVAL_SECONDSself_monitor_interval_seconds60.0进程自观测:采集自身 CPU% 与 RSS 写 metrics 文件
DN42_AGENT_HEARTBEAT_INTERVAL_SECONDSheartbeat_interval_seconds30.0WS 心跳:报活 + 报版本 + 报 apply 态,并写本地健康文件供自更新器的健康门轮询。设 0 同时关闭心跳与自更新
DN42_AGENT_FLAPFEED_INTERVAL_SECONDSflapfeed_interval_seconds60.0前缀级 flap 打分上报 tick。进程内 BGP 采集会话持续收 UPDATE,按此间隔上报衰减计分快照

任务清单与实现见 Node Agent 内部


阈值与路径

环境变量字段类型默认说明
DN42_AGENT_CPU_WARN_PERCENTcpu_warn_percentfloat80.0自身 CPU% 告警阈值:单次自观测窗口占用 ≥ 此值即 WARN(多核可 >100)。80% 足以揪出「烧满一个核」的背景循环热点,又不会被正常突发刷屏
DN42_AGENT_BIRD_SOCKET_PATHbird_socket_pathstr | NoneNone(派生)BIRD 控制 socket 路径的显式覆盖。留空则从渲染目录推导 <rendered_dir>/run/bird/bird.ctl,与 bird 容器的可写挂载落点一致。仅非常规部署或联调需要指向别处时设置
DN42_AGENT_EXABGP_BINexabgp_binstr | NoneNone已废弃。取值不再被读取;字段保留只为容忍存量配置里的残留键——配置加载对未知键报错,删掉字段会让带旧键的节点起不来

状态目录布局

AgentPathsagent/core/paths.py)定义,所有节点级文件落在 <state_dir>/nodes/<node_id>/ 之下:

路径内容
identity.json持久化的 agent 身份与世代信息
desired-state.json最近一次成功获取的 DesiredState 本地副本
rendered/渲染输出(配置文件与镜像构建上下文根;rendered_dir 留空时即此处)
snapshots/RuntimeSnapshot 与 ReconciliationReport 历史归档
metrics.jsonreconcile 运行指标(次数 / 失败 / 时长 / 最近状态)
containers/已应用的容器定义记录(字段级 diff reason 的数据源)
secrets/遗留目录(0700,启动时创建)。节点密钥已收归控制面,当前无任何内容写入

配置示例

TOML

toml
# /etc/dn42-control/agent.toml
[agent]
controller_url = "https://api.example.dn42"
enrollment_token = "change-me"
requested_node_id = "edge1"
state_dir = "/var/lib/dn42-control"
log_level = "INFO"

# 可选调参(0 关闭对应旁路任务)
# http_timeout_seconds = 30.0
# routing_interval_seconds = 300.0
# reresolve_interval_seconds = 45.0
# flapfeed_interval_seconds = 60.0

systemd env-file(生产推荐)

模板单元 deploy/tools/systemd/dn42-node-agent@.service%i 作为 node_id,并读取 /etc/dn42-control/%i.env

dotenv
# /etc/dn42-control/edge1.env
DN42_AGENT_CONTROLLER_URL=https://api.example.dn42
DN42_AGENT_ENROLLMENT_TOKEN=change-me
# STATE_DIR 与 REQUESTED_NODE_ID 已由 unit 注入(=/var/lib/dn42-control、=%i)

启用:sudo systemctl enable --now dn42-node-agent@edge1

完整部署步骤见 节点 Agent 部署,内部机制见 Node Agent 内部