用途:External-DNS 将 Kubernetes 中暴露的 Service 和 Ingress 同步到外部 DNS 提供商,实现 DNS 记录自动管理,避免手工维护。本技能覆盖配置、最佳实践与排障,重点为 Azure 与 Cloudflare。
主要能力:支持 Azure DNS(Workload Identity 或 Service Principal,稳定)、Cloudflare(API Token,Beta)、AWS Route53(IRSA 或 Access Keys,稳定)、Google Cloud DNS(Workload Identity,稳定)。通过 Helm chart(kubernetes-sigs/external-dns,v1.18.0+)部署,可配置 sources、domainFilters、policy(sync 或 upsert-only)、interval、txtOwnerId、日志、资源与安全上下文、Prometheus 指标。
使用方式:在 Service/Ingress 上添加注解,如 external-dns.alpha.kubernetes.io/hostname、ttl,以及提供商专属注解(cloudflare-proxied、alias)。生产建议 policy: upsert-only、interval 10m、replicaCount 2 并配置反亲和与 PDB;开发可用 sync 与 1m。常用命令包括 kubectl get pods/logs、dig 验证记录、az network dns record-set list、kubectl rollout restart,以及 extraArgs 中的 dry-run。
适用场景:多集群 Kubernetes 的 DNS 自动化、Azure/Cloudflare 为主的混合云环境、ArgoCD ApplicationSet 多集群部署。
限制与注意事项:txtOwnerId 必须每集群唯一,否则记录互相覆盖;policy: sync 会删除匹配模式但非其创建的手工记录,生产须用 upsert-only;K8s RBAC 与 DNS 提供商凭据缺一不可,只读凭据会静默失败;Workload Identity 需 ServiceAccount 注解、Pod 标签与联合凭据三者齐备;domainFilters 为前缀匹配而非精确匹配,多租户集群需用 --exclude-domains;Azure 私有 DNS 区域需 Private DNS Zone Contributor 角色。官方文档见 https://kubernetes-sigs.github.io/external-dns/。