ExternalDNS 企业域名托管与防误删
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
本文缩写(英文全称与中文含义)
| 缩写 | 英文全称/名称 | 中文含义 |
|---|---|---|
| API | Application Programming Interface | 应用程序编程接口 |
| AWS | Amazon Web Services | 亚马逊云服务 |
| DNS | Domain Name System | 域名系统 |
| GKE | Google Kubernetes Engine | Google 托管 Kubernetes 服务 |
| IAM | Identity and Access Management | 身份与访问管理 |
| ID | Identifier | 标识符 |
| IRSA | IAM Roles for Service Accounts | 通过 Kubernetes 服务账号关联 AWS IAM 角色 |
| LB | Load Balancer | 负载均衡器 |
| RBAC | Role-Based Access Control | 基于角色的访问控制 |
| SA | Service Account | 服务账号,供程序或工作负载使用的身份 |
| TLS | Transport Layer Security | 传输层安全协议 |
| TTL | Time To Live | 存活时间;具体指缓存有效期或记录过期时间 |
| TXT | Text record | DNS 文本记录;这是记录类型名 |
场景:将 orders HTTPRoute 发布到 Route 53 预生产专属 zone。前置:Gateway API、IRSA。DNS zone 已委派且 Gateway 已取得可用地址;DNS 自动化不负责建立 LB 或证书。
重要边界#
domainFilter/zone filter 是控制器筛选,IAM 才是权限边界。使用独立 zone、独立 SA、稳定唯一 TXT owner;其他集群不能共享 owner ID。先 upsert-only 防止删除,不能一上来用 sync 接管全部记录。
IAM permissions.json 示意(替换 zone ID):
{
"Version": "2012-10-17",
"Statement": [
{"Effect":"Allow","Action":["route53:ChangeResourceRecordSets","route53:ListResourceRecordSets","route53:ListTagsForResources"],"Resource":"arn:aws:route53:::hostedzone/REPLACE_ZONE_ID"},
{"Effect":"Allow","Action":["route53:ListHostedZones"],"Resource":"*"}
]
}按身份篇绑定 external-dns/external-dns。多 zone 环境把写权限按 zone 拆分;公网/私网同名 zone 额外指定类型。AWS 权限与安装
Hands-on:先预览,再托管#
helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/
helm repo update
helm search repo external-dns/external-dns --versions
export DNS_CHART_VERSION='REPLACE_CHART_VERSION'
helm show values external-dns/external-dns --version "$DNS_CHART_VERSION" > external-dns-defaults.yaml保存 external-dns-values.yaml,先保留 dry-run:
provider:
name: aws
sources: [gateway-httproute]
domainFilters: [staging.example.com]
policy: upsert-only
registry: txt
txtOwnerId: commerce-staging-eks
txtPrefix: _external-dns.
interval: 1m
serviceAccount:
create: true
name: external-dns
annotations:
eks.amazonaws.com/role-arn: REPLACE_EXTERNAL_DNS_ROLE_ARN
extraArgs:
- --zone-id-filter=REPLACE_ZONE_ID
- --aws-zone-type=public
- --namespace=orders
- --dry-runhelm upgrade --install external-dns external-dns/external-dns -n external-dns --create-namespace --version "$DNS_CHART_VERSION" -f external-dns-values.yaml --wait --timeout 10m
kubectl -n external-dns logs deployment/external-dns --since=5m审查计划中仅含订单域名及其 TXT ownership,无非预期 delete/zone。移除 --dry-run 后重新执行相同 Helm 命令。固定 Chart 并确认它给 gateway source 所需 RBAC;不要把 Service source 的行为假设套到 HTTPRoute。Gateway source
export ZONE_ID='REPLACE_ZONE_ID'
aws route53 list-resource-record-sets --hosted-zone-id "$ZONE_ID"
dig orders.staging.example.com
dig TXT _external-dns.orders.staging.example.comTXT 的实际名称还取决于记录类型/前缀,以上查不到时以 zone 记录为准。验证权威 DNS 与企业递归 DNS 一致,再跑 TLS 和订单链路。失败时查 Gateway 地址、Route status、zone 委派、IAM、TXT owner 冲突,不手动删他人的 ownership TXT。
多集群、故障与恢复#
| 操作 | 规则 |
|---|---|
| 多集群同时提供同域名 | 显式设计加权/failover DNS 和所有者策略,不能仅让两个控制器争写同一记录 |
| 控制器停止 | 已有 DNS 记录仍存在,新增/地址变更不再同步;监控协调时间和错误 |
| 下线域名 | upsert-only 会留下记录;人工审阅并删除确属本控制器的业务记录/TXT,或受控迁移到 sync |
| 集群替换 | 先迁移流量并核查 DNS TTL,再转移 owner;不要直接改 owner ID 期待自动接管 |
备份 zone 配置、流量策略和 ownership。演练非法 zone 写入被拒绝、Gateway 地址切换后的传播时间;恢复旧入口时同步源对象,避免控制器马上覆盖人工 DNS 修复。GKE 采用 google provider 和专属 Cloud DNS IAM/Workload Identity,不能使用 AWS 参数。