本文是CoreDNS 开发系列第4章
- CoreDNS 开发系列-1:CoreDNS核心概念和安装配置说明
- CoreDNS 开发系列-2:CoreDNS插件详解
- CoreDNS 开发系列-3:开发自定义插件
- CoreDNS 开发系列-4:高并发域名平台架构设计
在本章节中将创建一个项目,旨在构建一个基于 CoreDNS 的域名系统,该项目目的是可以构建一个完整的 DNS 平台而不是管理平台,可以作为独立的 DNS Provider 运行业务域名解析;也可以作为企业内部 DNS的使用。
分层架构设计
系统采用四层架构设计:
- 视图层:也称为 API 层,负责提供 DNS 的管理后台, API 接口。
- 业务层:主要作为 CoreDNS Plugins 实现,用于集成 DNS Server。
- 数据层:视图层与业务层的联动,多数据库支持(SQLite/MySQL/PostgreSQL)、Redis 缓存、数据同步。
- 基础设施层:提供 command line 工具,并为 DNS Server 提供四层防火墙、监控告警数据。并提供整个公司生态的服务注册、服务发现等功能。
系统功能需求
功能模块 | 详细描述 | 优先级 |
---|---|---|
View | 支持多视图配置,智能解析 | 高 |
Zone 管理 | DNS 区域管理与配置 | 高 |
域名管理 | 管理域中的域名解析 | 高 |
Transfer | 与云 DNS 供应商数据同步 | 高 |
白名单 | 域名解析黑白名单控制,包含全局和单域名 | 高 |
证书管理 | Let’s Encrypt 证书自动申请与续期 | 高 |
解析切换 | 提供多解析功能,实现故障切换 | 高 |
域名检测 | 域名可用性检测,可以配合切换功能完成故障自动切换 | 高 |
CDN 集成 | CDN 切换与管理功能 | 中 |
运维工具 | 提供命令行工具 | 中 |
GeoIP | 基于地理位置的智能 DNS 解析 | 低 |
外部系统注册 | 服务自动注册与发现 | 低 |
性能需求
性能指标 | 目标值 | 备注 |
---|---|---|
QPS | 100,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 |
View | View 的管理和配置 | 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
每个拓扑点包含企业内的私有云和公有云。只要想为这个机房做区域解析,那么这个拓扑点就需要部署下面的组件。
组件 | 实例数量 | 部署方式 |
---|---|---|
CoreDNS | 1+ | 1+/拓扑点 |
Redis | 1 | 1+/拓扑点 |
MySQL/PostgreSQL/SQLite | 1 | 只读节点/拓扑点 |
运维工具设计
这里也提供 CLI 工具为用户提供服务注册,或者自动化脚本,以及证书获取和更新使用。初期暂定兼容 caddy。
info
这里的更新证书指的是:使用证书的第三方客户端通过这个获取证书,或者检查证书是否更新等能力。
免费 SSL 证书签发管理设计
这里提供 “Let’s Encrypt” 证书自动申请与续期方案,项目采用成熟的 ACME 客户端工具,不自行实现 Let’s Encrypt 协议,确保系统兼容性。
组件 | 工具/SDK | GitHub 地址 |
---|---|---|
ACME 客户端 | lego | https://github.com/go-acme/lego |
证书申请流程
步骤 | 操作 | 验证方式 | 备注 |
---|---|---|---|
1. 域名验证 | DNS-01 Challenge | TXT 记录验证 | 支持通配符证书 |
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 | 手动创建域名使用 | 高 |