DNS 调度与告警
DNS 调度记录(按集群绑定第三方 DNS 服务商),以及告警渠道、订阅与规则。
概念
| 术语 | 定义 |
|---|---|
| 服务商账号 | DNS 调度使用的一组服务商凭据及其区域。 |
| DNS 绑定 | 一个集群的 DNS 调度设置:模式、服务商账号、集群域名、TTL 与线路。 |
| 集群域名 | 一个集群的调度记录所用的父域,必须位于服务商账号的区域内。 |
| 线路 | DNS 调度中与一个节点组对应的一组 A/AAAA 记录;映射到一条解析线路,可有备用节点组。 |
| 解析线路 | 服务商按运营商或地区区分解析结果的线路:默认、电信、联通、移动、教育网、境外。 |
| 备用节点组 | 线路的节点组健康地址不足时按顺序代为应答的节点组。 |
| DNS 版本 | 一个集群的 DNS 绑定及其记录的快照,独立于节点配置版本(revision)。 |
| 告警渠道 | 通知目标:邮件、Webhook、钉钉、企业微信或 Telegram。 |
| 告警订阅 | 把一组网站(或全部网站)的若干告警种类发送到一个渠道;每个渠道一条。 |
配置 DNS 调度
DNS 调度为每个集群写入调度记录,网站与 L4 应用 的 CNAME 目标指向所在集群的健康节点。Edgeweir 不运行权威 DNS,只通过服务商的 API 管理记录。
添加服务商账号
- 打开 DNS 调度,点击「添加服务商账号」。
- 填写「名称」,选择「DNS 服务商」,按表单填写凭据(字段与所需权限见服务商与凭据)。
- 能列出区域的服务商:点击「列出区域」,在「区域」中选择;其他服务商直接填写「区域」。
- 点击「测试连接」。验证:显示「连接正常:区域内有 N 条记录」。
- 点击「创建」。保存前先执行与「测试连接」相同的测试;失败时对话框显示错误,按钮变为「仍然保存」。
一个账号对应一组凭据和一个区域;同一组凭据管理多个区域时,分别添加账号。账号列表中的「测试连接」用已保存的凭据读取区域。「编辑」可以改名;打开「重新填写凭据」后重新填写全部字段以轮换密钥,保存前同样先测试。只改名时不测试。测试失败后修改任一字段,下次保存重新测试。服务商和区域创建后不可修改。凭据使用主密钥信封加密后保存,只写不读。
绑定集群
-
打开 集群与节点,选择集群,切换到「DNS」页签(集群有节点后显示)。
-
选择「模式」:「不管理」「手动」或「自动」。
-
选择「服务商账号」,「区域」显示该账号的区域;填写「集群域名」和「TTL(秒)」。
-
按需点击「添加线路」,填写「线路名称」并选择本集群的「节点组」;按需选择「解析线路」,填写「最少健康 IP 数」,在「备用节点组」中「添加备用节点组」并排列顺序。节点位于 NAT 或内网之后时,在该节点的「节点名:目标地址」字段中填写对外地址,或为节点配置调度地址;留空则使用节点的调度地址。不添加线路时,
all.<集群域名>返回本集群全部健康节点的地址。 -
点击「保存」。控制台提示「已生成 DNS 版本 N」。
-
验证:「当前记录」卡片状态为「已发布」,网站「域名」页签显示「CNAME 目标」。
dig +short CNAME <网站 UUID>.<集群域名> dig +short A all.<集群域名>第一条输出
all.<集群域名>.,第二条输出该集群健康节点的地址。 -
在各网站域名的 DNS 中,把域名 CNAME 到「CNAME 目标」。卡片下方列出每个域名的解析状态(「指向正确」「指向其他地址」「未解析」「未能检查」),网站「概览」页签的「上线检查」汇总为「DNS 已指向 N/M」。
不同集群可以使用不同的服务商账号和集群域名。DNS 调度 页面的「集群绑定」表列出每个集群的模式、集群域名和发布状态,「打开」进入该集群的「DNS」页签。
绑定字段
| 字段 | 取值 | 默认值 | 作用 |
|---|---|---|---|
| 模式 | 不管理 / 手动 / 自动 | 不管理 | 自动:控制台写入服务商;手动:列出需要创建的记录,控制台不写 DNS;不管理:网站没有 CNAME 目标,已写入的记录被清理 |
| 服务商账号 | 已添加的账号 | 无 | 自动模式必填;手动模式可以选「不使用账号」,此时区域按集群域名计算 |
| 区域 | 所选账号的区域 | — | 只读 |
| 集群域名 | 区域内的域名,最长 180 字符 | 无 | 本集群全部记录的父域;网站的 CNAME 目标为 <网站 UUID>.<集群域名>,L4 应用为 <应用 UUID>.<集群域名> |
| TTL(秒) | 30–3600 | 600 | 全部记录的 TTL;部分服务商或套餐要求更高的最低值,见服务商表 |
| 保留站点线路别名 | 开 / 关 | 关 | 为每个网站与启用的 L4 应用保留 <线路>.<UUID>.<集群域名>,见从全局 DNS 配置升级 |
| 线路名称 | 小写字母、数字、-,1–32 字符,不能为 all | line-N | 线路主机名的第一段 |
| 节点组 | 本集群的节点组,每个节点组最多一条线路 | 第一个未使用的节点组 | 线路包含的节点 |
| 解析线路 | 默认 / 电信 / 联通 / 移动 / 教育网 / 境外,只列出账号的服务商支持的线路 | 默认 | all.<集群域名> 在这条解析线路上返回本线路的地址,见按解析线路写入 |
| 最少健康 IP 数 | 1–64 | 1 | 线路节点组的健康地址少于该值时改用备用节点组 |
| 备用节点组 | 本集群的其他节点组,最多 4 个,有序 | 无 | 见备用节点组 |
| 目标地址 | 每个节点最多 8 个 IP,逗号分隔 | 空(使用节点的调度地址) | 在这条线路上替代节点的调度地址,不按级别切换;可为私网地址,不能为回环、链路本地、组播等特殊用途地址 |
每个绑定最多 128 条线路、10000 条系统管理记录。同一区域内集群域名相同的两个绑定,线路名称与汇总记录名不能重复(DNS_BINDING_CONFLICT)。
服务商只有默认线路时,「解析线路」不可选,提示「该服务商只有默认线路」;改选不支持某条解析线路的服务商账号时,表单把这些线路改回默认。保存服务商不支持的解析线路返回 DNS_LINE_UNSUPPORTED(「该 DNS 服务商不支持 {line} 解析线路」)。手动模式不选服务商账号时可以选择全部解析线路。
生成的记录
| 名称 | 类型 | 内容 |
|---|---|---|
all.<集群域名> | A / AAAA | 本集群线路的健康节点地址,按解析线路分别写入,见按解析线路写入;没有线路时为本集群全部健康节点的地址 |
<线路名称>.<集群域名> | A / AAAA | 该线路节点组内的健康节点地址(切换时为备用节点组的地址);只在默认线路 |
<网站 UUID>.<集群域名> | CNAME | all.<集群域名>;每个至少有一个域名的网站一条,停用的网站同样保留;只在默认线路 |
<应用 UUID>.<集群域名> | CNAME | all.<集群域名>;每个启用的 L4 应用 一条,停用的应用没有;只在默认线路 |
<线路名称>.<UUID>.<集群域名> | CNAME | <线路名称>.<集群域名>;网站与启用的 L4 应用各一组,只在打开「保留站点线路别名」时;只在默认线路 |
地址记录每个集群只写一份(all.<集群域名> 在每条用到的解析线路上各一组),记录数为「网站数 + 启用的 L4 应用数 + 集群地址数」;打开「保留站点线路别名」时再加「(网站数 + 启用的 L4 应用数)× 线路数」。网站「域名」页签与 L4 应用页列出的线路目标在关闭线路别名时为 <线路名称>.<集群域名>。
「当前记录」与「手动创建的记录」表的「解析线路」列显示每条记录所在的解析线路。
按解析线路写入
all.<集群域名> 在每条用到的解析线路上各有一组记录;其余记录只在默认线路。
| 解析线路 | all.<集群域名> 的地址 |
|---|---|
| 电信、联通、移动、教育网、境外 | 映射到该解析线路的全部绑定线路的地址之并;没有绑定线路映射到它时不写 |
| 默认 | 映射到「默认」的绑定线路的地址之并;没有这样的线路或它们都没有地址时,为全部线路的地址之并;绑定没有线路时,为本集群全部健康节点的地址 |
- 递归服务器不匹配任何其他解析线路时得到默认线路的记录;DNSPod 要求名称在默认线路上有记录。
- 写入一个名称与类型时替换它在全部解析线路上的记录;不再用到的解析线路上的副本被删除。只使用默认线路的绑定写入的记录与此前相同。
- 服务商账号不再支持某条解析线路时,该线路上的记录不写入。
例:
| 线路名称 | 节点组 | 解析线路 |
|---|---|---|
ct | 电信节点 | 电信 |
cu | 联通节点 | 联通 |
intl | 海外节点 | 默认 |
all.<集群域名> 对电信用户返回「电信节点」的地址,对联通用户返回「联通节点」的地址,其他用户得到「海外节点」的地址。去掉 intl 后,默认线路返回 ct 与 cu 的全部地址。
备用节点组
| 项目 | 行为 |
|---|---|
| 切换条件 | 线路节点组的健康地址数少于「最少健康 IP 数」,或调度规则「切换到备用节点组」作用于该线路 |
| 选择 | 按顺序检查备用节点组,使用第一个健康地址数达到「最少健康 IP 数」的组的地址 |
| 都不满足 | 使用线路节点组与全部备用节点组中仍健康的地址;仍为空时由大面积摘除保护保留上一版记录 |
| 作用范围 | 该线路的 <线路名称>.<集群域名>,以及它映射的解析线路上的 all.<集群域名> |
| 健康 | 备用节点组的节点按同样条件判断:健康摘除、调度地址的可达性与调度规则 |
| 恢复 | 线路节点组的健康地址数回到最小值后切回 |
| 发布 | 切换与恢复在下一次对账发布(原因「节点健康变化」),不另写审计 |
| 模式 | 只在「自动」模式;「手动」模式不切换 |
一个节点组可以作为多条线路的备用节点组,不能作为自己线路的备用节点组。
手动模式
控制台不写入 DNS。集群「DNS」页签列出需要手动创建的记录(绝对名称)与 BIND zone 文件,「下载」保存为 <区域>.zone。
| 项目 | 行为 |
|---|---|
| 地址 | 全部启用节点的主地址(调度地址的最低级别),不按健康状态与探针可达性筛选:手动记录不会随节点健康变化;不使用备用节点组,不应用调度规则 |
| 解析线路 | 记录列出所在的解析线路;BIND zone 文件只含默认线路的记录,其他解析线路的记录以注释列出(; line telecom),在服务商处按线路创建 |
| 网站 | 每个网站一条 CNAME;也可以用一条 *.<集群域名> CNAME all.<集群域名> 代替逐个网站的记录 |
| L4 应用 | 每个启用的应用一条 CNAME;停用后从列表中消失,手动删除对应记录 |
| CNAME 目标 | 网站「域名」页签照常显示,状态为「手动」 |
| 切换模式 | 自动切换到手动时,已写入的记录保留,控制台不再修改;切换到「不管理」时才清理 |
从全局 DNS 配置升级
此前版本的 DNS 调度是一份全局配置。升级后它转换为每个集群一条绑定,网站域名上的 CNAME 不需要修改:
- 每个集群的集群域名为原来的 CNAME 域,网站的 CNAME 目标名称不变,解析结果与升级前相同。
- 原来启用时,模式为「自动」并打开「保留站点线路别名」,原来网站「域名」页签列出的线路目标
<线路>.<网站 UUID>.<CNAME 域>继续解析;原来关闭时,模式为「不管理」,账号、域名与线路保留在表单中。 - 多个集群共用原来的 CNAME 域时,汇总记录依次命名为
all、all-2……(有网站的集群在前),网站 CNAME 指向所在集群的汇总记录。 - 原来按网站写入的地址记录
all.<网站 UUID>.<CNAME 域>由下一次对账删除,只删除控制台登记过的名称。 - 升级后的第一次发布如果只剩 CNAME、没有任何地址记录(例如节点都还没有重新连上),该集群保留原来的记录,版本状态为「已阻止」,按大面积摘除保护处理;节点恢复后自动继续,也可以「强制发布」。
- 此前的 DNS 版本保留在数据库中,不再显示。
/api/v1的/dns/config、/dns/revisions、/dns/force-publish改为按集群的/clusters/{clusterId}/dns、/clusters/{clusterId}/dns/revisions、/clusters/{clusterId}/dns/force-publish;/dns/bindings列出全部集群的绑定。
健康摘除与修复
| 项目 | 行为 |
|---|---|
| 进入地址集合 | 节点已启用、45 秒内有心跳、数据面健康,并已应用所在集群的当前配置版本 |
| 节点地址 | 节点按调度地址中可达的最低级别提供地址;全部级别不可达时不提供 |
| 智能调度 | 生效中的调度规则摘除节点、切换备用 IP 或切换到备用节点组;地址可达性与规则每 10 秒求值,变化时立即发布 |
| 发布宽限 | 新版本发布后 2 分钟内,原来已跟上的节点在应用新版本期间保留,日常发布不会让节点短暂离开 DNS |
| 检查周期 | 后台任务每分钟重新计算全部自动绑定,最多 4 个集群并发;离线、停用、应用失败或落后超过 2 分钟的节点被摘除,恢复后加回 |
| 故障隔离 | 每个绑定独立发布与对账;一个服务商不可用只让使用它的集群的 DNS 版本失败,其他集群照常发布 |
| 生效时间 | 受 TTL 和递归缓存影响,不是即时切流 |
| 漂移修复 | 系统管理的名称被外部删除或修改后,下一次检查恢复;「修复记录」立即对该集群执行一次 |
| 接管范围 | 只增删本集群已登记为系统管理的名称;新名称上已有非系统记录时拒绝接管(DNS_RECORD_CONFLICT),名称已由其他集群管理时同样拒绝(DNS_BINDING_CONFLICT);错误与失败的 DNS 版本写明冲突的名称(data.name) |
| 写入顺序 | 先登记管理名称;按记录集整体替换变化的地址记录,再替换 CNAME,每批最多 100 条;然后删除不再需要的记录,最后读回确认。新记录先于被替换的记录写入(例如地址从 A 换成 AAAA),名称不会在两步之间解析为空;只有名称改为或改自 CNAME 时先删除旧类型。失败时保留登记并在下一周期重试 |
| TTL | 服务商把 TTL 提高到自己的最低值时不算漂移;修改绑定的 TTL 后,下一次对账按新 TTL 重写记录 |
| 并发 | 同一集群同一时间只有一个控制台进程在对账(租约 15 分钟,进程退出后到期释放);「修复记录」遇到正在进行的对账时等它结束,再执行一次,等待 30 秒仍未结束时返回 DNS_RECONCILE_BUSY |
| 配置金丝雀 | 节点按自己的目标版本判断:金丝雀窗口期间,非金丝雀节点运行稳定版本,不被摘除,见 配置金丝雀 |
DNS 版本的失败原因显示为:服务商认证失败、服务商找不到区域、服务商不可用、服务商限流、名称上已有不受管理的记录、名称已被其他集群管理、服务器地址被出站策略拒绝等。
大面积摘除保护
一次发布会把某个集群原来非空的 all. 或线路记录集(每条解析线路分别计)清空,或摘除的地址记录超过阈值时,保留该集群的上一版记录,不写入服务商。控制台与节点通道断开、所有节点都被判定离线时,同样按此处理。
| 项目 | 行为 |
|---|---|
| 阈值 | 单次摘除的地址记录占该集群上一版地址记录的比例,默认 50%,DNS 调度 → 大面积摘除保护 可调(5%–100%),对全部集群生效 |
| 不计入 | 不再管理的名称(网站删除、L4 应用停用或删除、线路移除);不再用到的解析线路;服务商账号、集群域名或汇总记录名变化;模式不是「自动」;备用节点组切换造成的地址变化不计入比例,清空记录集仍计入 |
| 智能调度 | 调度规则的摘除照常计入 |
| 阻止时 | 集群「DNS」页签顶部显示被阻止的变更(将删除的地址记录数),DNS 版本列表中状态为「已阻止」,「集群绑定」表中该集群为「已阻止」;发出该集群的告警「DNS 大面积摘除已阻止」 |
| 恢复 | 之后的发布不再触发保护时自动结束阻止,告警恢复 |
| 强制发布 | 在集群「DNS」页签点击「强制发布」并确认,按当前状态发布;写审计 dns.force_publish |
DNS 版本与回滚
每个集群有自己的 DNS 版本,不增加节点配置 revision。「回滚 DNS」恢复所选版本的绑定设置(模式、账号、集群域名、TTL、线路及其解析线路、备用节点组与最少健康 IP 数),地址仍按当前的网站与节点健康状态计算,不恢复已离线的节点。手动模式的版本在保存时即为「已发布」。每个集群保留最近 200 个 DNS 版本,当前版本、已发布版本与「已阻止」的版本不清理。
「DNS 版本」表的「原因」列:
| 原因 | 触发 |
|---|---|
| 保存绑定 | 保存 DNS 绑定;修改节点的调度地址 |
| 节点健康变化 | 对账发现地址集合变化;探针判定的地址级别变化;备用节点组切换或恢复 |
| 回滚 | 「回滚 DNS」 |
| 强制发布 | 「强制发布」 |
| 智能调度:{规则}({节点}) | 调度规则生效或恢复;后附动作与「生效」或「恢复」 |
删除服务商账号前,先把使用它的集群绑定改选其他账号或切换到「不管理」,并等待清理完成(账号不再持有系统管理的记录),否则返回 DNS_PROVIDER_IN_USE。删除集群前同样先把该集群的 DNS 切换到「不管理」并等待清理完成(DNS_BINDING_IN_USE)。
服务商与凭据
DNS 调度的服务商账号与证书 DNS-01 使用的 DNS 凭据(见 HTTPS 与证书)使用同一份服务商目录与表单。给凭据授予目标区域所需的最小权限。
各服务商的适配器只通过录制的 API 交换测试(按官方 API 文档构造的请求与响应),没有在真实账户上验收;接入前先用「测试连接」确认。
| 服务商 | 凭据字段 | 最小权限 | 列出区域 | 根域 | 说明 |
|---|---|---|---|---|---|
| Cloudflare | API Token;Zone Token(可选) | API Token:目标区域的 Zone → DNS → Edit,以及 Zone → Zone → Read(也可以把区域读取放在 Zone Token 中) | 支持 | CNAME 展平 | TTL 最低 60 秒;新记录不经 Cloudflare 代理 |
| 阿里云 | AccessKey ID、AccessKey Secret、区域(可选)、STS Token(可选) | RAM:alidns:AddDomainRecord、alidns:UpdateDomainRecord、alidns:DeleteDomainRecord 限定 acs:alidns:*:<账号 ID>:domain/<域名>;alidns:DescribeDomainRecords 与列出区域用的 alidns:DescribeDomains 授予 * | 支持 | — | 中国站与国际站使用同一接入点;免费版 TTL 最低 600(被拒时按 600 重试一次) |
| 华为云 | AccessKey ID、Secret Access Key、区域(默认 cn-north-4) | IAM:dns:zone:list、dns:recordset:list、dns:recordset:create、dns:recordset:update、dns:recordset:delete | 支持 | — | 公网区域全局可见;国际站可填 ap-southeast-3 |
| DNSPod(Token) | API Token(ID,Token) | 主账号的 DNSPod Token,作用于整个账号,子账号不能使用 | 支持 | — | DNSPod 已将 Token API 标为旧版,新接入建议用腾讯云 DNSPod(API 3.0);免费版 TTL 最低 600 |
| 腾讯云 DNSPod(API 3.0) | SecretId、SecretKey、站点(中国站 / 国际站) | CAM:dnspod:DescribeRecordList、dnspod:CreateRecord、dnspod:ModifyRecord、dnspod:DeleteRecord 限定 qcs::dnspod::uin/<主账号 UIN>:domain/<域名 ID>;列出区域需要 dnspod:DescribeDomainList | 支持 | — | 国际站使用国际站接入点;免费版 TTL 最低 600 |
| 火山引擎 | AccessKey ID、Secret Access Key | 自定义策略允许 ListZones、ListRecords、CreateRecord、UpdateRecord、DeleteRecord(预置的 DNSFullAccess 权限更宽) | 支持 | — | 免费版 TTL 最低 600 |
| 百度智能云 | AccessKey ID、Secret Access Key | IAM 子用户:智能云解析「运维权限」自定义策略,限定到该区域(或预置的 DNSOperatePolicy);账号需实名认证 | 支持 | — | 免费版 TTL 最低 300 |
| 西部数码 | 用户名、API 密码 | API 密码作用于整个账号 | 支持 | — | API 面向西部数码代理商开放;需在西部数码允许控制台的出口 IP(错误「ip 授权失败」) |
| DNS.LA | API ID、API 密钥 | 在「我的账户 → API」开通的 API 密钥,作用于整个账号 | 支持 | — | TTL 最低值取决于套餐 |
| Amazon Route 53 | Access Key ID、Secret Access Key、Session Token(可选)、托管区域 ID(可选)、分区(aws / aws-cn / aws-us-gov) | route53:GetHostedZone、route53:ListResourceRecordSets、route53:ChangeResourceRecordSets 限定 arn:aws:route53:::hostedzone/<ID>;不填托管区域 ID 时加 route53:ListHostedZonesByName,列出区域加 route53:ListHostedZones(这两项的资源为 *) | 支持 | — | 只写简单记录;别名记录只能指向 AWS 资源 |
| Google Cloud DNS | 服务账号密钥(JSON)、项目 ID(可选)、托管区域名称(可选) | dns.changes.create、dns.resourceRecordSets.create、.update、.delete、.list,以及 dns.managedZones.get(填了托管区域名称)或 dns.managedZones.list;roles/dns.admin 包含全部 | 支持 | ALIAS | ALIAS 只用于公共区域,且不能与 DNSSEC 同用 |
| Azure DNS | 租户 ID、客户端 ID、客户端密钥、订阅 ID、资源组 | 在该区域上分配「DNS Zone Contributor」;列出区域还需要资源组上的 Microsoft.Network/dnszones/read | 支持 | — | 只支持 Azure 公有云 |
| DigitalOcean | API Token | 自定义范围 domain:read、domain:update,作用于整个账号或团队 | 支持 | — | TTL 最低 30 |
| Vultr | API Key | 具有 dns 权限的用户的 API Key | 支持 | — | 需在 Vultr 的 API 访问控制中允许控制台的出口 IP(IPv4 与 IPv6) |
| Akamai(Linode) | API Token | 个人访问令牌的 Domains Read/Write;限定单个域名时用只授予该域名 read_write 的受限用户创建令牌 | 支持 | — | TTL 取 Linode 允许的值,最低 300 |
| Hetzner | API Token | Hetzner Cloud 项目中具有 Read & Write 权限的 API 令牌 | 支持 | — | 使用 Hetzner Cloud API;旧 DNS Console 的令牌不能使用;TTL 最低 60 |
| OVHcloud | 接入点(ovh-eu / ovh-ca / ovh-us)、Application Key、Application Secret、Consumer Key | Consumer Key 的访问规则:GET /domain/zone(列出区域)、GET /domain/zone/<区域>/record、GET、PUT、DELETE /domain/zone/<区域>/record/*、POST /domain/zone/<区域>/record、POST /domain/zone/<区域>/refresh | 支持 | — | 读取记录时每条记录一个请求,大区域较慢 |
| Gandi LiveDNS | 个人访问令牌 | 限定到该域名、具有「管理域名技术配置」权限的个人访问令牌 | 支持 | ALIAS | TTL 300–2592000 |
| GoDaddy | API Token(key:secret 或个人访问令牌) | 个人访问令牌的 domains.domain:read、domains.dns:update | 支持 | — | 账号需持有域名或具有域名管理权限的套餐,否则返回 403;TTL 最低 600 |
| Porkbun | API Key、Secret API Key | API 密钥,且该域名已开启 API 访问 | 支持 | ALIAS | TTL 最低 600 |
| NameSilo | API Token | 账号的 API Key(子账号不能使用,可以限制 IP) | 支持 | — | TTL 最低 3600;同一 Key 同时只能有一个请求 |
| Gcore | API Key(<ID>$<密钥> 形式的永久令牌) | 永久 API 令牌 | 支持 | CNAME 展平 | 设置记录集时替换其上的 GeoDNS 选择器 |
| Bunny DNS | API 访问密钥 | 账号 API Key(完全访问) | 支持 | CNAME 展平 | — |
| deSEC | Token | 不带令牌管理、创建或删除域名权限的令牌;可用范围策略只允许写该域名 | 支持 | — | TTL 不低于域名的最低值(默认 3600);写入有频率限制 |
| PowerDNS | 服务器地址、API Key、服务器 ID(默认 localhost) | 服务器配置 api=yes、api-key,webserver-allow-from 包含控制台出口地址;API Key 作用于整个服务器 | 支持 | — | 自建端点,见下文;内置 Web 服务只有 HTTP,公网地址需经 TLS 反向代理 |
| RFC 2136(TSIG) | 服务器(主机或 主机:端口)、TSIG 密钥名、TSIG 算法、TSIG 密钥(Base64) | 例如 BIND:update-policy { grant <密钥名> zonesub A AAAA CNAME TXT; }; 与 allow-transfer { key <密钥名>; }; | 不支持 | — | 自建端点;只使用 TCP;读取记录用 AXFR |
| 自定义 HTTP | 地址、签名密钥(至少 16 字符) | 由接收方实现 | 由接收方决定 | — | 自建端点;协议见自定义 HTTP 协议 |
「根域」:CNAME 展平或 ALIAS 记录能让区域根(@)指向主机名(例如网站的 CNAME 目标);其余服务商的区域根只能用 A / AAAA 记录。解析线路见解析线路;其他服务商的运营商或地区线路(火山引擎、百度智能云、西部数码、DNS.LA、Route 53、Google Cloud DNS、Gcore、Bunny DNS 提供)不使用,记录只写在默认线路。
未接入的服务商:
| 服务商 | 原因 |
|---|---|
| Namecheap | API 只能用 setHosts 整体覆盖主机记录,未包含在请求中的记录会被删除,可能误删控制台之外写入的记录 |
| Hurricane Electric(dns.he.net) | 没有记录管理 API,只能动态更新已经存在的记录 |
| DNSPod 国际站(dnspod.com 的 Token API) | 协议与中国站不同,官方不再保证旧版 API 的服务;国际站账号使用腾讯云 DNSPod(API 3.0)的国际站 |
解析线路
解析线路让同一名称按运营商或地区返回不同的记录。服务商适配器使用下列线路名,并换成各服务商自己的线路:
| 线路 | 含义 | DNSPod(Token)与腾讯云 DNSPod | 阿里云 | 华为云 |
|---|---|---|---|---|
default | 默认(未匹配其他线路的解析) | 0 | default | default_view |
telecom | 电信 | 10=0 | telecom | Dianxin |
unicom | 联通 | 10=1 | unicom | Liantong |
mobile | 移动 | 10=3 | mobile | Yidong |
edu | 教育网 | 10=2 | edu | Jiaoyuwang |
overseas | 境外 | 3=0 | oversea | Abroad |
- 只有上表四家(腾讯云 DNSPod 含中国站与国际站)支持全部线路,其他服务商只有
default,其他线路的记录被拒绝。GET /dns/catalog的capabilities.lines列出每个服务商支持的线路。 - 写入一个名称与类型时,替换它在全部线路上的记录:写入中没有的线路上的副本被删除。
- 读取时,不在上表中的服务商线路(例如省份线路)显示为
other:<服务商线路>,这类记录只能删除。阿里云按上表的线路逐一读取,其他线路上的记录可能读不到。
自建端点与出站策略
PowerDNS、RFC 2136 与自定义 HTTP 的地址由运营者填写,每个连接都经过出站地址策略:
| 项目 | 行为 |
|---|---|
| 地址检查 | 在连接建立时检查实际连接的地址(防 DNS 重绑定);回环、链路本地、私网等特殊用途地址只有在 EDGEWEIR_OUTBOUND_ALLOW_CIDRS 放行时才允许 |
| 加密 | 公网地址必须使用 HTTPS;明文 HTTP 只允许连接放行的内网地址 |
| 重定向 | 不跟随 |
| 可用范围 | DNS 调度的服务商账号与证书的 DNS 凭据都可以使用 |
自定义 HTTP 协议
每个操作是一个请求:
POST <地址>
Content-Type: application/json
User-Agent: edgeweir-certd/1
X-Edgeweir-Timestamp: <Unix 秒>
X-Edgeweir-Signature: v1=<hex><hex> 为以签名密钥计算的 HMAC-SHA256(小写十六进制),输入为时间戳、. 与原始请求体。接收方用原始请求体重新计算并以常量时间比较,签名不符或时间戳与本地时钟相差超过 300 秒时返回 401。示例:密钥 example-secret-0123456789、时间戳 1700000000、请求体 {"action":"zones"} 的签名为 v1=3af007dacbb4d9b54c57bc499f275d13e48a5513e8ecf036d83c1b5a6c0f20f8。
请求体:
{"action":"set","zone":"example.com","records":[{"name":"www","type":"A","data":"192.0.2.1","ttl":600}]}| 字段 | 说明 |
|---|---|
zone | 区域名,不带末尾的点;zones 操作没有此字段 |
records | list 与 zones 没有此字段;name 相对于区域(根为 @),type 大写,data 为地址、主机名(可带末尾的点)或不带引号的 TXT 文本,ttl 为秒 |
| 操作 | 行为 |
|---|---|
list | 返回区域的全部记录 |
append | 添加记录,已有记录保留 |
set | 请求中每个(名称、类型)在区域中只保留请求给出的记录,其余记录集不变 |
delete | 删除名称、类型与值都匹配的记录;值为空时删除整个(名称、类型)记录集 |
zones | 返回接收方管理的区域 |
成功返回 2xx 与 JSON(最大 16 MiB):list、append、set、delete 返回 {"records":[...]},zones 返回 {"zones":["example.com"]}。401 或 403 表示认证失败,404 表示区域不存在,zones 返回 501 表示不能列出区域;429 视为限流,5xx 视为不可用。错误响应可以带 {"error":"简短说明"}。签名只含时间戳,300 秒内的请求可能被重放:set 与 delete 是幂等的,append 需要接收方去重。
告警页面
告警在 告警 页面配置,页面有五张卡片:
| 卡片 | 内容 |
|---|---|
| 告警渠道 | 通知目标,可添加、编辑、发送测试、启用或停用、删除 |
| SMTP | 邮件渠道的发信服务器,见 SMTP |
| 告警订阅 | 每个渠道接收的网站与告警种类 |
| 近期告警 | 最近 100 条告警事件,含集群与 DNS 告警 |
| 告警规则 | 触发告警的阈值 |
配置告警渠道
- 打开 告警,在「告警渠道」卡片中点击「添加渠道」。
- 填写「名称」,选择「渠道类型」,填写该类型的字段(见下表)。
- 选择「通知语言」。
- 按需打开「接收所有告警」。
- 点击「创建」。
- 验证:点击「发送测试」,目标收到测试通知;渠道行不显示「通知发送失败」。
邮件渠道使用「SMTP」卡片中的服务器,见 SMTP。
渠道字段
| 渠道类型 | 字段 | 约束 |
|---|---|---|
| Webhook | Webhook 地址、Bearer 令牌(可选) | HTTP POST JSON;公网目标必须 HTTPS |
| 邮件 | 收件地址 | 1–20 个地址,逗号或空格分隔 |
| 钉钉 | Webhook 地址、签名密钥(可选) | 主机必须为 oapi.dingtalk.com;填写签名密钥时附加 timestamp 与 HMAC-SHA256 签名 |
| 企业微信 | Webhook 地址 | 主机必须为 qyapi.weixin.qq.com |
| Telegram | 机器人令牌、会话 ID | 调用 Bot API sendMessage,关闭链接预览 |
| 开关 | 默认值 | 作用 |
|---|---|---|
| 接收所有告警 | 关 | 渠道接收全部告警,无需订阅:所有网站的告警,以及集群与 DNS 告警 |
未打开该开关的渠道只接收订阅到它的网站告警,见订阅告警。
最多 32 个渠道。编辑渠道时,打开「更新渠道凭据」重新填写类型与字段;不打开则保留原凭据。停用的渠道不发送通知,也不能被新的订阅选择。
Webhook 载荷
请求体为 JSON,包含 id(事件 ID)、siteId、siteName、kind、status(firing / resolved)、occurredAt、resourceId(告警对象,例如节点或证书的 ID)、text 和 url(控制台链接)。集群与 DNS 告警的 siteId 为 null,siteName 为集群名称;「节点离线」的 siteId 为 null,siteName 为节点名称,resourceId 为节点 ID;url 指向 集群与节点 或 DNS 调度;scheduling_action 的 siteName 为「规则 · 节点」,resourceId 为 <规则 ID>:<节点 ID>。配置了 Bearer 令牌时附带 Authorization: Bearer <令牌>。接收方返回 2xx 视为成功。
SMTP
邮件渠道的发信服务器,在 告警 页的「SMTP」卡片中设置并点击「保存」。未设置时,邮件渠道「发送测试」提示「尚未配置 SMTP」,投递失败的渠道行显示同样的提示。
| 字段 | 默认值 | 说明 |
|---|---|---|
| SMTP 主机 | 无 | 最多 253 字符 |
| SMTP 端口 | 465 | 1–65535 |
| 直接 TLS(关闭时使用 STARTTLS) | 开启 | 关闭时要求 STARTTLS;证书校验始终开启 |
| 发件地址 | 无 | 邮箱地址 |
| SMTP 用户名 | 无 | 必填 |
| SMTP 密码 | 无 | 主密钥信封加密后入库;留空保留现有密码 |
| CA 证书(PEM) | 空 | 仅含 PEM 证书;填写后替代系统信任库校验该服务器 |
| 约束 | 说明 |
|---|---|
| 更换目标 | 修改主机、端口、TLS 方式、用户名或 CA 证书时必须重新填写密码 |
| 出站策略 | 发信时解析并固定地址,内网地址须由 EDGEWEIR_OUTBOUND_ALLOW_CIDRS 放行 |
设置告警规则
- 打开 告警,在「告警规则」卡片中修改阈值。
- 点击「保存」。
| 字段 | 取值 | 默认值 | 告警种类 | 触发条件 |
|---|---|---|---|---|
| 离线阈值(秒) | 45–3600 | 90 | 节点离线 | 已启用节点超过阈值未上报,或上报数据面不健康;每个节点一条告警,不按它服务的网站分别发送 |
| 证书到期预警(小时) | 1–720 | 72 | 证书即将到期 | 网站当前证书在阈值内到期 |
| 最低请求数 | 1–1000000 | 100 | 服务端错误率过高 | 统计窗口内请求数达到该值 |
| 统计窗口(分钟) | 1–60 | 5 | 服务端错误率过高 | 计算 5xx 比例的时间窗口 |
| 5xx 阈值(%) | 1–100 | 20 | 服务端错误率过高 | 窗口内 5xx 比例达到该值 |
「源站不可用」没有单独阈值:某个节点在离线阈值内上报网站的每个源站都不可用时触发。一个源站在该节点上不可用,指它的被动检查或主动检查结果(任一来源)为不健康;见被动健康检查与主动健康检查。
「CC 防护升级」(cc_mitigation)没有单独阈值:节点上报网站从正常升级时触发,同一网站 15 分钟内最多一次(期间被压下的升级,若 15 分钟后网站仍高于正常级别,则在下一次每分钟检查时触发);没有在线节点再报告该网站高于正常级别后恢复。见挑战与 CC 防护。
网站告警只针对已启用且至少有一个域名的网站。
集群与 DNS 告警
以下告警属于集群而不是网站,只投递到开启「接收所有告警」的渠道,不能订阅;「近期告警」同样列出它们。
| 告警 | 触发 | 恢复 |
|---|---|---|
| 配置金丝雀发布已回滚 | 金丝雀自动回滚或被手动中止 | 该集群下一次推进 |
| 没有在线的金丝雀节点,配置已直接发布到全部节点 | 开启金丝雀的集群发布时没有在线的金丝雀节点 | 该集群下一次发布有在线的金丝雀节点 |
| 已存规则不再通过校验,沿用上次编译结果 | 发布时某条已存规则不再通过当前校验(见 规则),名称为规则名 | 规则改写或删除后的下一次发布 |
| DNS 大面积摘除已阻止 | 大面积摘除保护 阻止了某个集群的一次发布 | 该集群下一次发布通过或强制发布 |
| 智能调度规则已作用于节点 | 调度规则的动作对一个节点生效,名称为「规则 · 节点」 | 该动作恢复;规则被停用、删除或改变线路、条件、动作时立即恢复 |
订阅告警
- 打开 告警,在「告警订阅」卡片中点击「订阅告警」。
- 选择「通知渠道」。
- 打开「全部网站」,或在「网站」列表中勾选网站(可用「搜索网站」查找,切换搜索时已勾选的网站保留)。
- 打开要发送的告警种类,点击「保存」。
- 验证:订阅行显示渠道、网站(或「全部网站」)与告警种类;「近期告警」显示这些网站的事件。
| 项目 | 行为 |
|---|---|
| 渠道 | 每个渠道一条订阅;「订阅告警」只列出已启用且还没有订阅的渠道,没有时不可点击 |
| 网站 | 「全部网站」包括以后新建的网站;否则至少勾选一个网站 |
| 告警种类 | 节点离线、证书即将到期、源站不可用、服务端错误率过高、CC 防护升级 |
| 修改 | 点击订阅行的「编辑」修改网站、告警种类或「启用」;关闭「启用」的订阅不发送通知,订阅行显示「关闭」 |
| 删除网站 | 网站从订阅中移除;订阅只剩这个网站时一并删除 |
| 取消 | 点击订阅行的「取消订阅」并确认 |
| API | POST /api/v1/alerts/subscriptions(channelId、kinds、allSites 或 siteIds)创建该渠道的订阅,渠道已有订阅时替换它;PUT /api/v1/alerts/subscriptions/{id} 修改;返回 allSites 与 sites(id、name)。此前的 siteId 字段已移除 |
| 升级 | 此前每条订阅只有一个网站;升级后同一渠道的订阅合并为一条。其中有启用的订阅时,合并结果启用,包含启用订阅的网站与告警种类;全部停用时保持停用,包含它们全部网站与告警种类 |
投递行为
| 项目 | 行为 |
|---|---|
| 事件 | 同一条件只在进入告警和恢复时各产生一个事件,事件 ID 固定 |
| 接收渠道 | 开启「接收所有告警」的渠道接收全部告警;其他渠道只接收订阅所含网站的告警,「节点离线」在订阅含该节点所在集群的任一网站(或「全部网站」)且含这一种类时发送 |
| 重试 | 失败后按 2、4、8、16 分钟退避重试,每个渠道共尝试 5 次 |
| 批量 | 每分钟检查一次,每次最多发送 200 条,40 秒后开始的投递留到下一分钟 |
| 重复 | 网络回执丢失时接收方可能收到重复通知;Webhook 接收方按事件 ID 去重 |
| 投递前检查 | 每次投递重新检查:渠道已启用、事件仍是该条件的当前状态且发生在 24 小时内、订阅已启用且仍包含该网站与告警种类(开启「接收所有告警」的渠道除外) |
| 出站策略 | 解析并固定目标 IP;拒绝特殊用途地址;Webhook 类目标不跟随重定向;内部 Webhook 或 SMTP 需在 EDGEWEIR_OUTBOUND_ALLOW_CIDRS 中放行对应网段 |
| 超时与大小 | 单次投递 10 秒;请求体最大 32 KiB,响应体最大 64 KiB |
| 保留 | 告警事件保留 90 天 |
| 敏感字段 | 渠道接口和失败记录不返回密码、机器人令牌、Webhook 密钥或服务商原始错误 |
限制
| 项目 | 说明 |
|---|---|
| 后台任务 | DNS 调度同步、告警检查与投递由后台任务每分钟执行,地址可达性与调度规则每 10 秒求值,需要至少一个 ROLE=worker 或 ROLE=all 的控制台进程,见部署概览 |
| 解析线路 | 只使用默认、电信、联通、移动、教育网、境外六条解析线路,且只在 DNSPod、腾讯云 DNSPod、阿里云、华为云上可用;省份等其他线路与其他服务商的地理解析不使用 |
| 权威 DNS | 不运行权威 DNS,只通过服务商 API 管理记录 |
| 单次操作 | 每次服务商调用最长 2 分钟 |
| 主动探测 | 节点的可达性由区域探针探测;源站由节点的被动与主动健康检查判断 |
| 本地模拟服务 | 「本地模拟服务」只在设置 EDGEWEIR_DNS_TEST_ENDPOINT 时出现,仅用于测试 |
故障排查
| 现象 | 原因 | 处理 |
|---|---|---|
| 「CNAME 域不属于该 DNS 区域」 | 集群域名不在账号的区域内 | 改用区域本身或其子域名 |
| 「该 DNS 名称已有非系统管理的记录」 | 目标名称上已有手工记录 | 删除手工记录后「修复记录」 |
| 「该名称已被其他集群的 DNS 绑定使用」 | 两个集群在同一区域使用相同的集群域名与线路名称 | 改用不同的集群域名或线路名称 |
| 「DNS 服务商仍在使用中」 | 账号仍被集群绑定选中或仍持有记录 | 改选其他账号或切换到「不管理」,等待清理完成后删除 |
| 「先关闭该集群的 DNS,等待记录清理完成」 | 删除集群时它的 DNS 仍为「自动」或仍持有记录 | 切换到「不管理」,等待清理完成 |
| 「DNS 服务商认证失败,请检查凭据与权限」 | 凭据错误、过期或权限不足;部分服务商还要求允许控制台的出口 IP | 按服务商与凭据检查权限后「测试连接」 |
| 「服务器地址是内网或特殊用途地址,或公网地址未使用 HTTPS」 | 自建端点的地址被出站策略拒绝 | 使用 HTTPS,或在 EDGEWEIR_OUTBOUND_ALLOW_CIDRS 放行内网地址段 |
| 「CNAME 目标」显示「无健康节点」 | 线路内没有满足条件的节点 | 检查节点心跳、数据面状态和已应用版本 |
| 「该 DNS 服务商不支持 {line} 解析线路」 | 绑定线路选择了账号的服务商不支持的解析线路 | 改为「默认」,或改用支持该线路的服务商账号 |
| 「该集群的 DNS 同步仍在进行,请稍后重试」 | 「修复记录」等待 30 秒后,另一次对账仍在进行,常见于服务商响应慢 | 稍后重试,查看 DNS 版本的状态 |
| 运营商用户解析到默认线路的地址 | 递归服务器不属于该运营商,或该解析线路没有绑定线路 | 用该运营商的递归服务器验证;为它添加绑定线路 |
| 渠道显示「通知发送失败」 | 目标拒绝、超时,或地址被出站策略拒绝 | 「发送测试」复现;内网目标加入 EDGEWEIR_OUTBOUND_ALLOW_CIDRS |
| 「通知渠道数量已达上限」 | 已有 32 个渠道 | 删除不用的渠道 |
| 「尚未配置 SMTP」 | 邮件渠道发送测试或投递时还没有保存 SMTP 设置 | 在「SMTP」卡片中填写并保存,再「发送测试」 |
| 「更换 SMTP 服务器或账户时需填写新密码」 | 修改了 SMTP 目标但未填写密码 | 填写密码后保存 |
| 「CA 证书须为 PEM 格式」 | CA 证书字段含非证书内容 | 只粘贴 PEM 证书 |
| 「订阅告警」不可点击 | 没有已启用的渠道,或每个已启用的渠道都已有订阅 | 添加或启用渠道;修改已有订阅点击「编辑」 |