Skip to content

共享 DNS

L1 配置事实源(分层模型见分层与存储角色):声明式配置,丢了不可重建,必须进备份

以记录为中心的三级模型(app/db/models/dns.py):组 → zone → 记录。节点经 Node.dns_group_id 订阅,materializer 将三级组装为 DnsSpec。多个节点订阅同一组即获得同一份配置,即构成 anycast。DNS 不按节点保存,这是本册与其余 L1 表最大的结构差异。

操作步骤见 DNS 与任播,接口见 管理面 API,组装逻辑在 materialize 流程的第 6 步(写入路径)。


dns_groups

一份可被多节点订阅的 DNS 配置。

类型约束 / 默认说明
idIntegerPK,autoincrement主键
nameString(255)NOT NULL,unique组名
bind_addressesJSONNOT NULL,默认 []提供 DNS 服务的 IP(任播监听地址)。任播地址的唯一真相源:normalize 阶段据此派生 dns-anycast dummy 接口地址与进 BGP 的任播前缀
cache_ttl_secondsIntegerNOT NULL,默认 300缓存 TTL
forwardsJSONNOT NULL,默认 []转发(递归 resolver)配置;纯权威部署留空
enabledBooleanNOT NULL,默认 True禁用则订阅节点不部署 DNS
created_at / updated_atDateTime(tz)server_default now,updated_at 带 onupdate时间戳

关系:zones cascade="all, delete-orphan"


dns_group_zones

组声明的权威 zone 与可选 SOA 覆盖。

类型约束 / 默认说明
idIntegerPK,autoincrement主键
dns_group_idIntegerFK→dns_groups.id(CASCADE),NOT NULL,index所属组
zoneString(255)NOT NULL权威 zone(正向 example.dn42,反向 20.172.in-addr.arpa
primary_nsString(255)可空SOA 主 NS;留空自动取 ns.<zone>
admin_emailString(255)可空SOA 管理邮箱;留空自动取 hostmaster.<zone>
soa_refresh / soa_retry / soa_expire / soa_minimumInteger可空SOA 参数;留空用默认
default_ttlInteger可空默认 TTL
enabledBooleanNOT NULL,默认 True禁用的 zone 不输出
created_at / updated_atDateTime(tz)server_default now,updated_at 带 onupdate时间戳

唯一约束 UNIQUE(dns_group_id, zone)。关系:records cascade="all, delete-orphan"


dns_records

扁平 DNS 资源记录。

类型约束 / 默认说明
idIntegerPK,autoincrement主键
dns_group_zone_idIntegerFK→dns_group_zones.id(CASCADE),NOT NULL,index所属 zone
nameString(255)NOT NULLzone 内主机名(相对名、@ 或 FQDN)
typeString(16)NOT NULL记录类型;rDNS 即反向 zone 下的 PTR
contentTextNOT NULL记录值
ttlInteger可空记录 TTL
commentText可空仅供界面展示,不进 zone 文件
enabledBooleanNOT NULL,默认 Truedisabled 记录不输出
sort_orderIntegerNOT NULL,默认 0排序键
created_at / updated_atDateTime(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。