Cloud DNS:路由策略与故障切换
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
用于独立入口的 DNS 路由;单个 LB 内的后端健康选择通常交给 LB。
推荐做法#
- WRR 分配 DNS 应答,业务流量还受缓存和长连接影响。
- 健康检查必须使用实际可访问 endpoint,并确认策略支持的 target 类型。
- 切换验证覆盖权威应答、递归缓存、客户端行为和所有目标均失败的情形。
常用操作#
替换为实际资源;本段不依赖 lab.env。
DOMAIN='REPLACE_FQDN'
AUTH_NS='REPLACE_AUTHORITATIVE_NS'
dig @"$AUTH_NS" "$DOMAIN" A +noall +answer
dig @8.8.8.8 "$DOMAIN" A +noall +answer容易踩的坑#
降低 TTL 不会缩短已经缓存的旧 TTL,DNS 切换也不会终止已有连接。 提前降低 TTL、等待原 TTL 后再切记录,并验证客户端实际流量。
- DNS 不复制数据,Route 53 的 routing policy 不能按名称一对一照搬。
配置说明与完整示例(按需展开)
前置:公共 DNS,保留 DNS_ZONE、DNS_ZONE_NAME、AUTH_NS。此处使用文档保留 IP,验证 DNS 答案,不验证真实服务健康。
权重路由实验#
gcloud dns record-sets create "weighted.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A --ttl=30 --routing-policy-type=WRR --routing-policy-item='weight=80,rrdatas=192.0.2.10' --routing-policy-item='weight=20,rrdatas=192.0.2.20'
for n in $(seq 1 30); do
dig @"$AUTH_NS" "weighted.$DNS_ZONE_NAME" A +short
done验收:多次查询能看到两个目标;小样本不要求精确 80:20。权重分配的是 DNS 应答,不是应用请求;递归缓存、长连接会使业务流量比例不同。
gcloud dns record-sets update "weighted.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A --ttl=30 --routing-policy-type=WRR --routing-policy-item='weight=0,rrdatas=192.0.2.10' --routing-policy-item='weight=100,rrdatas=192.0.2.20'
dig @"$AUTH_NS" "weighted.$DNS_ZONE_NAME" A +short地理路由实验#
gcloud dns record-sets create "geo.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A --ttl=30 --routing-policy-type=GEO --routing-policy-item='location=asia-east1,rrdatas=192.0.2.10' --routing-policy-item='location=us-central1,rrdatas=192.0.2.20'
dig @"$AUTH_NS" "geo.$DNS_ZONE_NAME" A +short再从位于美国的测试主机执行相同查询,对比返回值。它不是“按浏览器国家字段匹配”;公共解析会受查询来源 IP、EDNS Client Subnet 等影响。只有一个来源时只能验证策略存在,不能宣称跨地域验收完成。路由策略
健康检查与故障切换练习#
有两个实际可访问、相互独立的测试 HTTP endpoint 后,在 Console → Cloud DNS 为新的 A 记录配置 WRR + 外部 endpoint 健康检查:
- 为两个真实公网 IPv4 地址配置相同测试路径,例如
/healthz;确认两边都返回成功。 - 创建支持 DNS 外部 endpoint 的健康检查,间隔设为 30 秒,将两个地址添加为健康检查目标;不要把普通静态 rrdata 当成已健康检查的目标。
- 为两个目标分配非零权重,记录正常时权威应答。
- 让其中一个测试 endpoint 持续返回失败,等健康阈值达到后,确认权威答案只含健康目标;再检查递归缓存何时切换。
- 恢复 endpoint,验证重新加入。记录“探测延迟 + 阈值 + DNS 缓存”的实际恢复时间。
没有两个真实 endpoint 时跳过这段,不对 192.0.2.* 做健康检查。专门的 FAILOVER 用于 VPC 内部资源的 active/backup,例如内部 LB VIP;不要把两个任意公网 IP 直接套进该主备模型。公网独立入口按 WRR/GEO + external endpoint health check 配置;普通静态 rrdata 不会自动被探测。所有目标不健康时的应答行为也必须单独测试。配置与限制
DNS 切换不会复制数据库,也不会断开客户端已有连接。单个全球负载均衡器后面的健康后端选择通常应交给 LB,DNS 切换适用于独立入口层。
清理#
gcloud dns record-sets delete "weighted.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A
gcloud dns record-sets delete "geo.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A若做了健康检查段,再删除那条记录、专用健康检查和额外测试 endpoint。