Skip to content

Runtime ​

源码 packages/dn42_schemas/dn42_schemas/runtime.py。描述节点上要跑哪些容器、在什么网络里、怎么构建。


RouterRuntimeSpec ​

字段类型必填说明
project_namestr | None否runtime 项目名;None 时由节点名推导。须匹配 [a-z0-9][a-z0-9_-]*
underlayUnderlayNetworkSpec是underlay 网络定义
rpkiRpkiSpec否(默认值)RPKI cache 参数
router_dockerfileRouterDockerfileSpec否(默认值)路由器镜像构建模板参数
wireguard_port_rangeWireGuardPortRangeSpec | None否对外对等的 WG UDP 端口段;设置后驱动端口发布注入
wireguard_internal_port_rangeWireGuardPortRangeSpec | None否节点间内部链路的 WG UDP 端口段。可空表示未启用分段,全部端口按外部段口径处理(向后兼容)。两段都会被 normalize 钩子注入发布
serviceslist[RuntimeServiceSpec]是runtime 服务列表

RuntimeServiceSpec ​

字段类型必填说明
namestr是服务名;同一 deployment 内唯一
roleServiceRole是服务语义角色;决定必需挂载与默认 IP 推导
imagestr | None否直接使用的镜像名;与 build 互斥
buildBuildSpec | None否构建参数;与 image 互斥
ipv4_addressstr | None否underlay 中的显式 IPv4。用 network_mode 时不得设置
commandlist[str]否(默认 [])启动命令;wg-gateway 与 bird-router 角色必填
environmentdict[str, str]否(默认 {})环境变量
portslist[PortPublishSpec]否(默认 [])发布端口。用 network_mode 时不得发布端口
network_modestr | None否网络模式,如 service:<name>;service: 的目标须存在
cap_addlist[str]否(默认 [])额外 Linux capability;未设时按角色默认回落
deviceslist[str]否(默认 [])透传设备
sysctlsdict[str, str]否(默认 {})创建时应用的 sysctl;未设时按角色默认回落
volumeslist[VolumeMount]否(默认 [])挂载卷;部分角色有必需的挂载目标
depends_onlist[str]否(默认 [])启动依赖;目标须存在
healthcheckHealthCheckSpec | None否健康检查;未设时部分角色有默认
enabledbool否(默认 True)是否参与最终渲染

ServiceRole 取值:router-netns / wg-gateway / bird-router / rpki-cache / dns / debug-shell。

服务级校验 ​

RouterRuntimeSpec.validate_services:

  • 服务名唯一。
  • enabled 服务必须覆盖三个必需角色:router-netns、wg-gateway、bird-router。
  • depends_on 与 network_mode service:<name> 引用的服务都须存在。
  • 用 network_mode 的服务不得同时设 ipv4_address,也不得发布端口。
  • 角色必需挂载:wg-gateway 须挂 /opt/dn42/scripts 与 /etc/wireguard;bird-router 须挂 /opt/dn42/scripts 与 /etc/bird;不共享 netns 的 dns 角色须发布 53/udp 与 53/tcp。
  • 服务 IPv4 须落在 underlay 子网内,不得等于 underlay 网关,且不得与其它服务重复。
  • 发布端口(含范围)在同一 (host_ip, host_port, protocol) 上不得冲突。

单个服务的校验:image 与 build 不可同设;wg-gateway 与 bird-router 必须有 command。


VolumeMount ​

字段类型必填说明
sourcestr是宿主路径、命名卷或相对来源
targetstr是容器内挂载目标
readonlybool否(默认 True)是否只读

HealthCheckSpec ​

字段类型必填说明
testlist[str]是健康检查命令数组
interval_secondsint(ge=1)否(默认 15)检查间隔
timeout_secondsint(ge=1)否(默认 5)单次超时
retriesint(ge=1)否(默认 5)连续失败次数阈值
start_period_secondsint(ge=0)否(默认 10)启动宽限期

BuildSpec ​

字段类型必填说明
targetstr | None否多阶段构建的 target 名
argsdict[str, str]否(默认 {})build args

Dockerfile 内容由 runtime.router_dockerfile 在 agent 内生成,并经 Docker Engine API 内存构建——没有构建上下文目录,也没有落盘的 Dockerfile。


PortPublishSpec ​

字段类型必填说明
container_portint(ge=1, le=65535)是容器端口
container_port_endint | None否容器端口范围末端;须 ≥ container_port
host_portint | None否宿主端口;None 表示仅声明容器端口
host_port_endint | None否宿主端口范围末端;须先有 host_port
protocolstr否(默认 "tcp")限 tcp / udp / sctp,归一化为小写
host_ipstr | None否绑定的宿主地址

validate_ranges:只给 host_port 与 container_port_end 时自动补算 host_port_end;宿主与容器端口范围的大小须一致;host_port_end 须 ≤65535 且 ≥ host_port。


WireGuardPortRangeSpec ​

字段类型必填说明
startint(ge=1, le=65535)是容器侧端口范围起点
endint(ge=1, le=65535)是容器侧端口范围终点;须 ≥ start
host_startint | None否宿主侧起始端口;推导出的宿主末端不得 >65535
host_ipstr | None否绑定的宿主地址

派生属性:effective_host_start(= host_start or start)、effective_host_end、contains(port)。

两段的实际值由 materializer 从 port_pools 表派生(external / internal 两个 scope),见 fleet 供给收权。

⚠️ wireguard_internal_port_range 是较晚加入的 runtime 字段:StrictModel 的 extra="forbid" 会让不认识它的旧版 agent 整份拒收 DesiredState。启用分段前必须先把 agent 升到认识该字段的版本,见 锁步契约。


UnderlayNetworkSpec ​

字段类型必填说明
namestr否(默认 "router_underlay")underlay 网络名
subnetstr是underlay IPv4 子网 CIDR
gatewaystr是underlay IPv4 网关
ipv6_subnetstr | None否underlay IPv6 ULA 子网;设置后启用 IPv6(NAT66 出网)
ipv6_gatewaystr | None否underlay IPv6 网关;设 ipv6_subnet 时必填

ipv6_subnet 纳入容器 config_hash,改动会触发声明式重建。


RpkiSpec ​

字段类型必填说明
enabledbool否(默认 True)是否启用 RPKI cache
cache_urlstr否(默认 dn42 ROA JSON 源)上游 RPKI JSON 源
listen_hoststr否(默认 "10.254.42.3")underlay 内监听地址
listen_portint(ge=1, le=65535)否(默认 8282)监听端口

RouterDockerfileSpec ​

字段类型必填说明
base_imagestr否(默认 "debian:13-slim")路由器镜像的基础镜像
debian_mirrorstr否(默认 "deb.debian.org")Debian 包源镜像