Kubernetes 中的 Ingress、Service 或 Gateway 经常变化,手工维护 DNS 容易遗漏。ExternalDNS 根据资源注解自动创建、更新和清理 DNS 记录。
kubectl create namespace external-dns
kubectl -n external-dns create secret generic cloudflare-api-token \
--from-literal=cloudflare_api_token="$CF_API_TOKEN"
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
kubectl annotate ingress demo external-dns.alpha.kubernetes.io/hostname=demo.example.com
kubectl annotate service demo \
external-dns.alpha.kubernetes.io/hostname=api.internal.example.com \
external-dns.alpha.kubernetes.io/ttl=60
kubectl -n external-dns logs deploy/external-dns -f
dig +short demo.example.com
policy=sync 会删除对应记录。policy 改为 upsert-only,停止删除记录。domainFilters 没配,ExternalDNS 可能扫描并修改所有 zone。policy=sync 权限过大,删除资源时误删手工维护的记录。txtOwnerId,记录互相覆盖。list 权限导致启动失败。external-dns — 控制器kubectl — 注解 Ingress/Service 和查看日志dig / nslookup — 验证解析aws / aliyun / tccli — 检查云 DNS 记录