外观
共享 DNS
L1 配置事实源(分层模型见分层与存储角色):声明式配置,丢了不可重建,必须进备份。
以记录为中心的三级模型(app/db/models/dns.py):组 → zone → 记录。节点经 Node.dns_group_id 订阅,materializer 将三级组装为 DnsSpec。多个节点订阅同一组即获得同一份配置,即构成 anycast。DNS 不按节点保存,这是本册与其余 L1 表最大的结构差异。
操作步骤见 DNS 与任播,接口见 管理面 API,组装逻辑在 materialize 流程的第 6 步(写入路径)。
dns_groups
一份可被多节点订阅的 DNS 配置。
| 列 | 类型 | 约束 / 默认 | 说明 |
|---|---|---|---|
id | Integer | PK,autoincrement | 主键 |
name | String(255) | NOT NULL,unique | 组名 |
bind_addresses | JSON | NOT NULL,默认 [] | 提供 DNS 服务的 IP(任播监听地址)。任播地址的唯一真相源:normalize 阶段据此派生 dns-anycast dummy 接口地址与进 BGP 的任播前缀 |
cache_ttl_seconds | Integer | NOT NULL,默认 300 | 缓存 TTL |
forwards | JSON | NOT NULL,默认 [] | 转发(递归 resolver)配置;纯权威部署留空 |
enabled | Boolean | NOT NULL,默认 True | 禁用则订阅节点不部署 DNS |
created_at / updated_at | DateTime(tz) | server_default now,updated_at 带 onupdate | 时间戳 |
关系:zones cascade="all, delete-orphan"。
dns_group_zones
组声明的权威 zone 与可选 SOA 覆盖。
| 列 | 类型 | 约束 / 默认 | 说明 |
|---|---|---|---|
id | Integer | PK,autoincrement | 主键 |
dns_group_id | Integer | FK→dns_groups.id(CASCADE),NOT NULL,index | 所属组 |
zone | String(255) | NOT NULL | 权威 zone(正向 example.dn42,反向 20.172.in-addr.arpa) |
primary_ns | String(255) | 可空 | SOA 主 NS;留空自动取 ns.<zone> |
admin_email | String(255) | 可空 | SOA 管理邮箱;留空自动取 hostmaster.<zone> |
soa_refresh / soa_retry / soa_expire / soa_minimum | Integer | 可空 | SOA 参数;留空用默认 |
default_ttl | Integer | 可空 | 默认 TTL |
enabled | Boolean | NOT NULL,默认 True | 禁用的 zone 不输出 |
created_at / updated_at | DateTime(tz) | server_default now,updated_at 带 onupdate | 时间戳 |
唯一约束 UNIQUE(dns_group_id, zone)。关系:records cascade="all, delete-orphan"。
dns_records
扁平 DNS 资源记录。
| 列 | 类型 | 约束 / 默认 | 说明 |
|---|---|---|---|
id | Integer | PK,autoincrement | 主键 |
dns_group_zone_id | Integer | FK→dns_group_zones.id(CASCADE),NOT NULL,index | 所属 zone |
name | String(255) | NOT NULL | zone 内主机名(相对名、@ 或 FQDN) |
type | String(16) | NOT NULL | 记录类型;rDNS 即反向 zone 下的 PTR |
content | Text | NOT NULL | 记录值 |
ttl | Integer | 可空 | 记录 TTL |
comment | Text | 可空 | 仅供界面展示,不进 zone 文件 |
enabled | Boolean | NOT NULL,默认 True | disabled 记录不输出 |
sort_order | Integer | NOT NULL,默认 0 | 排序键 |
created_at / updated_at | DateTime(tz) | server_default now,updated_at 带 onupdate | 时间戳 |
组装规则
materializer 的 _load_dns_group:
- 节点未分配组、组不存在、或组被禁用 →
dns=None(不部署 DNS)。 - 否则按 组 → enabled zone → enabled 记录 组装
DnsSpec,每个 zone 内联其记录,SOA 留空则自动生成。 - 空 zone 不输出:Corefile 引用了却缺少对应 zone 文件会导致 CoreDNS 加载失败。
- 无任何可服务 zone 且无 forwards →
None(无可服务内容则不部署)。 dns非空会触发 DesiredState 校验注入 CoreDNS 服务。
记录查询以一条 SQL 取回全部 zone 的启用记录,再按 zone_id 分桶,避免逐 zone 查询导致的 N+1。