Edgeweir
使用指南

DNS 调度与告警

DNS 调度记录(按集群绑定第三方 DNS 服务商),以及告警渠道、订阅与规则。

概念

术语定义
服务商账号DNS 调度使用的一组服务商凭据及其区域。
DNS 绑定一个集群的 DNS 调度设置:模式、服务商账号、集群域名、TTL 与线路。
集群域名一个集群的调度记录所用的父域,必须位于服务商账号的区域内。
线路DNS 调度中与一个节点组对应的一组 A/AAAA 记录;映射到一条解析线路,可有备用节点组。
解析线路服务商按运营商或地区区分解析结果的线路:默认、电信、联通、移动、教育网、境外。
备用节点组线路的节点组健康地址不足时按顺序代为应答的节点组。
DNS 版本一个集群的 DNS 绑定及其记录的快照,独立于节点配置版本(revision)。
告警渠道通知目标:邮件、Webhook、钉钉、企业微信或 Telegram。
告警订阅把一组网站(或全部网站)的若干告警种类发送到一个渠道;每个渠道一条。

配置 DNS 调度

DNS 调度为每个集群写入调度记录,网站与 L4 应用 的 CNAME 目标指向所在集群的健康节点。Edgeweir 不运行权威 DNS,只通过服务商的 API 管理记录。

添加服务商账号

  1. 打开 DNS 调度,点击「添加服务商账号」。
  2. 填写「名称」,选择「DNS 服务商」,按表单填写凭据(字段与所需权限见服务商与凭据)。
  3. 能列出区域的服务商:点击「列出区域」,在「区域」中选择;其他服务商直接填写「区域」。
  4. 点击「测试连接」。验证:显示「连接正常:区域内有 N 条记录」。
  5. 点击「创建」。保存前先执行与「测试连接」相同的测试;失败时对话框显示错误,按钮变为「仍然保存」。

一个账号对应一组凭据和一个区域;同一组凭据管理多个区域时,分别添加账号。账号列表中的「测试连接」用已保存的凭据读取区域。「编辑」可以改名;打开「重新填写凭据」后重新填写全部字段以轮换密钥,保存前同样先测试。只改名时不测试。测试失败后修改任一字段,下次保存重新测试。服务商和区域创建后不可修改。凭据使用主密钥信封加密后保存,只写不读。

绑定集群

  1. 打开 集群与节点,选择集群,切换到「DNS」页签(集群有节点后显示)。

  2. 选择「模式」:「不管理」「手动」或「自动」。

  3. 选择「服务商账号」,「区域」显示该账号的区域;填写「集群域名」和「TTL(秒)」。

  4. 按需点击「添加线路」,填写「线路名称」并选择本集群的「节点组」;按需选择「解析线路」,填写「最少健康 IP 数」,在「备用节点组」中「添加备用节点组」并排列顺序。节点位于 NAT 或内网之后时,在该节点的「节点名:目标地址」字段中填写对外地址,或为节点配置调度地址;留空则使用节点的调度地址。不添加线路时,all.<集群域名> 返回本集群全部健康节点的地址。

  5. 点击「保存」。控制台提示「已生成 DNS 版本 N」。

  6. 验证:「当前记录」卡片状态为「已发布」,网站「域名」页签显示「CNAME 目标」。

    dig +short CNAME <网站 UUID>.<集群域名>
    dig +short A all.<集群域名>

    第一条输出 all.<集群域名>.,第二条输出该集群健康节点的地址。

  7. 在各网站域名的 DNS 中,把域名 CNAME 到「CNAME 目标」。卡片下方列出每个域名的解析状态(「指向正确」「指向其他地址」「未解析」「未能检查」),网站「概览」页签的「上线检查」汇总为「DNS 已指向 N/M」。

不同集群可以使用不同的服务商账号和集群域名。DNS 调度 页面的「集群绑定」表列出每个集群的模式、集群域名和发布状态,「打开」进入该集群的「DNS」页签。

绑定字段

字段取值默认值作用
模式不管理 / 手动 / 自动不管理自动:控制台写入服务商;手动:列出需要创建的记录,控制台不写 DNS;不管理:网站没有 CNAME 目标,已写入的记录被清理
服务商账号已添加的账号无自动模式必填;手动模式可以选「不使用账号」,此时区域按集群域名计算
区域所选账号的区域—只读
集群域名区域内的域名,最长 180 字符无本集群全部记录的父域;网站的 CNAME 目标为 <网站 UUID>.<集群域名>,L4 应用为 <应用 UUID>.<集群域名>
TTL(秒)30–3600600全部记录的 TTL;部分服务商或套餐要求更高的最低值,见服务商表
保留站点线路别名开 / 关关为每个网站与启用的 L4 应用保留 <线路>.<UUID>.<集群域名>,见从全局 DNS 配置升级
线路名称小写字母、数字、-,1–32 字符,不能为 allline-N线路主机名的第一段
节点组本集群的节点组,每个节点组最多一条线路第一个未使用的节点组线路包含的节点
解析线路默认 / 电信 / 联通 / 移动 / 教育网 / 境外,只列出账号的服务商支持的线路默认all.<集群域名> 在这条解析线路上返回本线路的地址,见按解析线路写入
最少健康 IP 数1–641线路节点组的健康地址少于该值时改用备用节点组
备用节点组本集群的其他节点组,最多 4 个,有序无见备用节点组
目标地址每个节点最多 8 个 IP,逗号分隔空(使用节点的调度地址)在这条线路上替代节点的调度地址,不按级别切换;可为私网地址,不能为回环、链路本地、组播等特殊用途地址

每个绑定最多 128 条线路、10000 条系统管理记录。同一区域内集群域名相同的两个绑定,线路名称与汇总记录名不能重复(DNS_BINDING_CONFLICT)。

服务商只有默认线路时,「解析线路」不可选,提示「该服务商只有默认线路」;改选不支持某条解析线路的服务商账号时,表单把这些线路改回默认。保存服务商不支持的解析线路返回 DNS_LINE_UNSUPPORTED(「该 DNS 服务商不支持 {line} 解析线路」)。手动模式不选服务商账号时可以选择全部解析线路。

生成的记录

名称类型内容
all.<集群域名>A / AAAA本集群线路的健康节点地址,按解析线路分别写入,见按解析线路写入;没有线路时为本集群全部健康节点的地址
<线路名称>.<集群域名>A / AAAA该线路节点组内的健康节点地址(切换时为备用节点组的地址);只在默认线路
<网站 UUID>.<集群域名>CNAMEall.<集群域名>;每个至少有一个域名的网站一条,停用的网站同样保留;只在默认线路
<应用 UUID>.<集群域名>CNAMEall.<集群域名>;每个启用的 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 文档构造的请求与响应),没有在真实账户上验收;接入前先用「测试连接」确认。

服务商凭据字段最小权限列出区域根域说明
CloudflareAPI 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 KeyIAM 子用户:智能云解析「运维权限」自定义策略,限定到该区域(或预置的 DNSOperatePolicy);账号需实名认证支持—免费版 TTL 最低 300
西部数码用户名、API 密码API 密码作用于整个账号支持—API 面向西部数码代理商开放;需在西部数码允许控制台的出口 IP(错误「ip 授权失败」)
DNS.LAAPI ID、API 密钥在「我的账户 → API」开通的 API 密钥,作用于整个账号支持—TTL 最低值取决于套餐
Amazon Route 53Access 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 包含全部支持ALIASALIAS 只用于公共区域,且不能与 DNSSEC 同用
Azure DNS租户 ID、客户端 ID、客户端密钥、订阅 ID、资源组在该区域上分配「DNS Zone Contributor」;列出区域还需要资源组上的 Microsoft.Network/dnszones/read支持—只支持 Azure 公有云
DigitalOceanAPI Token自定义范围 domain:read、domain:update,作用于整个账号或团队支持—TTL 最低 30
VultrAPI Key具有 dns 权限的用户的 API Key支持—需在 Vultr 的 API 访问控制中允许控制台的出口 IP(IPv4 与 IPv6)
Akamai(Linode)API Token个人访问令牌的 Domains Read/Write;限定单个域名时用只授予该域名 read_write 的受限用户创建令牌支持—TTL 取 Linode 允许的值,最低 300
HetznerAPI TokenHetzner Cloud 项目中具有 Read & Write 权限的 API 令牌支持—使用 Hetzner Cloud API;旧 DNS Console 的令牌不能使用;TTL 最低 60
OVHcloud接入点(ovh-eu / ovh-ca / ovh-us)、Application Key、Application Secret、Consumer KeyConsumer Key 的访问规则:GET /domain/zone(列出区域)、GET /domain/zone/<区域>/record、GET、PUT、DELETE /domain/zone/<区域>/record/*、POST /domain/zone/<区域>/record、POST /domain/zone/<区域>/refresh支持—读取记录时每条记录一个请求,大区域较慢
Gandi LiveDNS个人访问令牌限定到该域名、具有「管理域名技术配置」权限的个人访问令牌支持ALIASTTL 300–2592000
GoDaddyAPI Token(key:secret 或个人访问令牌)个人访问令牌的 domains.domain:read、domains.dns:update支持—账号需持有域名或具有域名管理权限的套餐,否则返回 403;TTL 最低 600
PorkbunAPI Key、Secret API KeyAPI 密钥,且该域名已开启 API 访问支持ALIASTTL 最低 600
NameSiloAPI Token账号的 API Key(子账号不能使用,可以限制 IP)支持—TTL 最低 3600;同一 Key 同时只能有一个请求
GcoreAPI Key(<ID>$<密钥> 形式的永久令牌)永久 API 令牌支持CNAME 展平设置记录集时替换其上的 GeoDNS 选择器
Bunny DNSAPI 访问密钥账号 API Key(完全访问)支持CNAME 展平—
deSECToken不带令牌管理、创建或删除域名权限的令牌;可用范围策略只允许写该域名支持—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 提供)不使用,记录只写在默认线路。

未接入的服务商:

服务商原因
NamecheapAPI 只能用 setHosts 整体覆盖主机记录,未包含在请求中的记录会被删除,可能误删控制台之外写入的记录
Hurricane Electric(dns.he.net)没有记录管理 API,只能动态更新已经存在的记录
DNSPod 国际站(dnspod.com 的 Token API)协议与中国站不同,官方不再保证旧版 API 的服务;国际站账号使用腾讯云 DNSPod(API 3.0)的国际站

解析线路

解析线路让同一名称按运营商或地区返回不同的记录。服务商适配器使用下列线路名,并换成各服务商自己的线路:

线路含义DNSPod(Token)与腾讯云 DNSPod阿里云华为云
default默认(未匹配其他线路的解析)0defaultdefault_view
telecom电信10=0telecomDianxin
unicom联通10=1unicomLiantong
mobile移动10=3mobileYidong
edu教育网10=2eduJiaoyuwang
overseas境外3=0overseaAbroad
  • 只有上表四家(腾讯云 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 操作没有此字段
recordslist 与 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 告警
告警规则触发告警的阈值

配置告警渠道

  1. 打开 告警,在「告警渠道」卡片中点击「添加渠道」。
  2. 填写「名称」,选择「渠道类型」,填写该类型的字段(见下表)。
  3. 选择「通知语言」。
  4. 按需打开「接收所有告警」。
  5. 点击「创建」。
  6. 验证:点击「发送测试」,目标收到测试通知;渠道行不显示「通知发送失败」。

邮件渠道使用「SMTP」卡片中的服务器,见 SMTP。

渠道字段

渠道类型字段约束
WebhookWebhook 地址、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 端口4651–65535
直接 TLS(关闭时使用 STARTTLS)开启关闭时要求 STARTTLS;证书校验始终开启
发件地址无邮箱地址
SMTP 用户名无必填
SMTP 密码无主密钥信封加密后入库;留空保留现有密码
CA 证书(PEM)空仅含 PEM 证书;填写后替代系统信任库校验该服务器
约束说明
更换目标修改主机、端口、TLS 方式、用户名或 CA 证书时必须重新填写密码
出站策略发信时解析并固定地址,内网地址须由 EDGEWEIR_OUTBOUND_ALLOW_CIDRS 放行

设置告警规则

  1. 打开 告警,在「告警规则」卡片中修改阈值。
  2. 点击「保存」。
字段取值默认值告警种类触发条件
离线阈值(秒)45–360090节点离线已启用节点超过阈值未上报,或上报数据面不健康;每个节点一条告警,不按它服务的网站分别发送
证书到期预警(小时)1–72072证书即将到期网站当前证书在阈值内到期
最低请求数1–1000000100服务端错误率过高统计窗口内请求数达到该值
统计窗口(分钟)1–605服务端错误率过高计算 5xx 比例的时间窗口
5xx 阈值(%)1–10020服务端错误率过高窗口内 5xx 比例达到该值

「源站不可用」没有单独阈值:某个节点在离线阈值内上报网站的每个源站都不可用时触发。一个源站在该节点上不可用,指它的被动检查或主动检查结果(任一来源)为不健康;见被动健康检查与主动健康检查。

「CC 防护升级」(cc_mitigation)没有单独阈值:节点上报网站从正常升级时触发,同一网站 15 分钟内最多一次(期间被压下的升级,若 15 分钟后网站仍高于正常级别,则在下一次每分钟检查时触发);没有在线节点再报告该网站高于正常级别后恢复。见挑战与 CC 防护。

网站告警只针对已启用且至少有一个域名的网站。

集群与 DNS 告警

以下告警属于集群而不是网站,只投递到开启「接收所有告警」的渠道,不能订阅;「近期告警」同样列出它们。

告警触发恢复
配置金丝雀发布已回滚金丝雀自动回滚或被手动中止该集群下一次推进
没有在线的金丝雀节点,配置已直接发布到全部节点开启金丝雀的集群发布时没有在线的金丝雀节点该集群下一次发布有在线的金丝雀节点
已存规则不再通过校验,沿用上次编译结果发布时某条已存规则不再通过当前校验(见 规则),名称为规则名规则改写或删除后的下一次发布
DNS 大面积摘除已阻止大面积摘除保护 阻止了某个集群的一次发布该集群下一次发布通过或强制发布
智能调度规则已作用于节点调度规则的动作对一个节点生效,名称为「规则 · 节点」该动作恢复;规则被停用、删除或改变线路、条件、动作时立即恢复

订阅告警

  1. 打开 告警,在「告警订阅」卡片中点击「订阅告警」。
  2. 选择「通知渠道」。
  3. 打开「全部网站」,或在「网站」列表中勾选网站(可用「搜索网站」查找,切换搜索时已勾选的网站保留)。
  4. 打开要发送的告警种类,点击「保存」。
  5. 验证:订阅行显示渠道、网站(或「全部网站」)与告警种类;「近期告警」显示这些网站的事件。
项目行为
渠道每个渠道一条订阅;「订阅告警」只列出已启用且还没有订阅的渠道,没有时不可点击
网站「全部网站」包括以后新建的网站;否则至少勾选一个网站
告警种类节点离线、证书即将到期、源站不可用、服务端错误率过高、CC 防护升级
修改点击订阅行的「编辑」修改网站、告警种类或「启用」;关闭「启用」的订阅不发送通知,订阅行显示「关闭」
删除网站网站从订阅中移除;订阅只剩这个网站时一并删除
取消点击订阅行的「取消订阅」并确认
APIPOST /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 证书
「订阅告警」不可点击没有已启用的渠道,或每个已启用的渠道都已有订阅添加或启用渠道;修改已有订阅点击「编辑」
在 GitHub 上编辑

本页目录