用 ExternalDNS 自动维护 DNS 记录

适用场景

Kubernetes 中的 Ingress、Service 或 Gateway 经常变化,手工维护 DNS 容易遗漏。ExternalDNS 根据资源注解自动创建、更新和清理 DNS 记录。

前置条件

步骤

  1. 创建凭据 Secret(以 Cloudflare 为例):
kubectl create namespace external-dns
kubectl -n external-dns create secret generic cloudflare-api-token \
  --from-literal=cloudflare_api_token="$CF_API_TOKEN"
  1. 使用 Helm 安装:
helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/
helm install external-dns external-dns/external-dns \
  --namespace external-dns \
  --set provider.name=cloudflare \
  --set env[0].name=CF_API_TOKEN \
  --set env[0].valueFrom.secretKeyRef.name=cloudflare-api-token \
  --set env[0].valueFrom.secretKeyRef.key=cloudflare_api_token \
  --set domainFilters[0]=example.com \
  --set policy=sync \
  --set registry=txt \
  --set txtOwnerId=prod-cluster
  1. 给 Ingress 或 Service 加注解:
kubectl annotate ingress demo external-dns.alpha.kubernetes.io/hostname=demo.example.com
  1. 如果使用内部负载均衡,设置目标:
kubectl annotate service demo \
  external-dns.alpha.kubernetes.io/hostname=api.internal.example.com \
  external-dns.alpha.kubernetes.io/ttl=60
  1. 观察日志和 DNS 记录:
kubectl -n external-dns logs deploy/external-dns -f
dig +short demo.example.com

验证

回滚

常见坑

相关命令