在本章节中将创建一个项目,旨在构建一个基于 CoreDNS 的域名系统,该项目目的是可以构建一个完整的 DNS 平台而不是管理平台,可以作为独立的 DNS Provider 运行业务域名解析;也可以作为企业内部 DNS的使用。

分层架构设计

系统采用四层架构设计:

  1. 视图层:也称为 API 层,负责提供 DNS 的管理后台, API 接口。
  2. 业务层:主要作为 CoreDNS Plugins 实现,用于集成 DNS Server。
  3. 数据层:视图层与业务层的联动,多数据库支持(SQLite/MySQL/PostgreSQL)、Redis 缓存、数据同步。
  4. 基础设施层:提供 command line 工具,并为 DNS Server 提供四层防火墙、监控告警数据。并提供整个公司生态的服务注册、服务发现等功能。

系统功能需求

功能模块详细描述优先级
View支持多视图配置,智能解析
Zone 管理DNS 区域管理与配置
域名管理管理域中的域名解析
Transfer与云 DNS 供应商数据同步
白名单域名解析黑白名单控制,包含全局和单域名
证书管理Let’s Encrypt 证书自动申请与续期
解析切换提供多解析功能,实现故障切换
域名检测域名可用性检测,可以配合切换功能完成故障自动切换
CDN 集成CDN 切换与管理功能
运维工具提供命令行工具
GeoIP基于地理位置的智能 DNS 解析
外部系统注册服务自动注册与发现

性能需求

性能指标目标值备注
QPS100,000一个 view 内的集群至少达到的值

项目分模块设计

视图层

模块名称功能描述
域、域名管理完成基础 Zone, Domain的管理功能
证书管理Let’s Encrypt 证书自动申请与续期
View管理管理域与业务层插件进行联动
白名单管理域名解析黑白名单控制
Geo 管理基于地理位置的智能 DNS 解析
CDN 集成集成CDN联动功能
服务注册插件提供全企业内的服务注册功能(View+业务)

业务层

模块名称功能描述实现方式
DNS 服务DNS 查询处理、插件加载管理原生 coredns
数据库Zone, Domain 信息入库,通过库Custom Plugin
Redis 缓存插件Zone, Domain 的热点缓存功能Custom Plugin
GeoIP 插件基于地理位置的智能解析Custom Plugin
ViewView 的管理和配置Custom Plugin
白名单域名访问控制Custom Plugin
Transfer区域传送与同步Custom Plugin

基础设施层

模块名称功能描述实现技术
服务发现服务注册与发现Nacos

DNS查询流程设计

多级缓存策略

缓存级别介质
L1 缓存 (Cache 插件)CoreDNS
L2 缓存 (Redis)Redis
L3 缓存 (数据库集群)MySQL/PostgreSQL/SQLite

客户端查询 → CoreDNS → L1缓存检查 → L2缓存检查 → 数据库 → 缓存回填 → 返回结果

部署架构

在这里,一个企业内的 DNS 系统称之为 DNS “拓扑” (Topology),每一个机房称之为 “拓扑点” (Point in a Topology),一个拓扑点表示在一个机房内需要部署的软件或者程序的单位。一个拓扑有多个拓扑点组成。

tip
每个拓扑点包含企业内的私有云和公有云。只要想为这个机房做区域解析,那么这个拓扑点就需要部署下面的组件。
组件实例数量部署方式
CoreDNS1+1+/拓扑点
Redis11+/拓扑点
MySQL/PostgreSQL/SQLite1只读节点/拓扑点

运维工具设计

这里也提供 CLI 工具为用户提供服务注册,或者自动化脚本,以及证书获取和更新使用。初期暂定兼容 caddy。

info
这里的更新证书指的是:使用证书的第三方客户端通过这个获取证书,或者检查证书是否更新等能力。

免费 SSL 证书签发管理设计

这里提供 “Let’s Encrypt” 证书自动申请与续期方案,项目采用成熟的 ACME 客户端工具,不自行实现 Let’s Encrypt 协议,确保系统兼容性。

组件工具/SDKGitHub 地址
ACME 客户端legohttps://github.com/go-acme/lego

证书申请流程

步骤操作验证方式备注
1. 域名验证DNS-01 ChallengeTXT 记录验证支持通配符证书
2. 证书申请ACME v2 协议Let’s Encrypt API使用 lego 库
3. 证书存储数据库
4. 证书部署自动分发 + 运维工具运维工具

自动续期策略

续期条件检查频率提前时间失败处理
证书过期前30天不检查或周期性检查30天告警通知 + 重试
手动触发续期按需立即实时状态反馈
自动续期任务每天自定义,默认3天告警通知 + 重试
批量续期任务每周配置化失败日志记录

外部系统服务注册设计

域名系统也是为企业名字服务做一个基石,提供外部服务的自动注册与生命周期管理。

注册方式支持

注册方式技术实现适用场景需求
Agent 注册 / API 注册SDK / RESTful API类似 k8s 集群中服务注册按需
K8S 集群集成client-go多集群统一 dns 系统按需
手动添加基于 cli/admin手动创建域名使用