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-run
helm 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.com

TXT 的实际名称还取决于记录类型/前缀,以上查不到时以 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 参数。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭