news 2026/5/26 3:47:23

ExternalDNS自动化DNS管理实践:实现Kubernetes服务自动注册

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ExternalDNS自动化DNS管理实践:实现Kubernetes服务自动注册

ExternalDNS自动化DNS管理实践:实现Kubernetes服务自动注册

一、ExternalDNS概述

ExternalDNS是一个Kubernetes控制器,能够自动同步Kubernetes资源(如Service和Ingress)到外部DNS服务商。它消除了手动管理DNS记录的繁琐工作,实现了DNS记录的自动化管理。

ExternalDNS支持的DNS服务商:

  • AWS Route 53
  • Google Cloud DNS
  • Azure DNS
  • Cloudflare
  • DigitalOcean
  • CoreDNS
  • Infoblox
  • NS1

二、ExternalDNS安装与配置

2.1 使用Helm安装

# 添加ExternalDNS Helm仓库 helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/ # 创建命名空间 kubectl create namespace external-dns # 安装ExternalDNS(以AWS为例) helm install external-dns external-dns/external-dns \ --namespace external-dns \ --version 1.13.0 \ --set provider=aws \ --set aws.region=us-west-2 \ --set domainFilters="{example.com}"

2.2 配置RBAC权限

apiVersion: v1 kind: ServiceAccount metadata: name: external-dns namespace: external-dns --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: external-dns rules: - apiGroups: [""] resources: ["services", "endpoints", "pods"] verbs: ["get", "watch", "list"] - apiGroups: ["extensions", "networking.k8s.io"] resources: ["ingresses"] verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["nodes"] verbs: ["list", "watch"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: external-dns-viewer roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: external-dns subjects: - kind: ServiceAccount name: external-dns namespace: external-dns

2.3 验证安装

# 检查ExternalDNS Pod状态 kubectl get pods -n external-dns # 查看日志 kubectl logs -n external-dns deployment/external-dns

三、配置DNS Provider

3.1 AWS Route 53配置

apiVersion: v1 kind: Secret metadata: name: aws-credentials namespace: external-dns data: credentials: | [default] aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY
helm install external-dns external-dns/external-dns \ --namespace external-dns \ --set provider=aws \ --set aws.region=us-west-2 \ --set aws.secretName=aws-credentials \ --set domainFilters="{example.com}"

3.2 Cloudflare配置

apiVersion: v1 kind: Secret metadata: name: cloudflare-api-token namespace: external-dns data: api-token: YOUR_CLOUDFLARE_API_TOKEN
helm install external-dns external-dns/external-dns \ --namespace external-dns \ --set provider=cloudflare \ --set cloudflare.secretName=cloudflare-api-token \ --set domainFilters="{example.com}"

3.3 Google Cloud DNS配置

# 创建服务账号密钥文件 gcloud iam service-accounts create external-dns gcloud projects add-iam-policy-binding my-project \ --member "serviceAccount:external-dns@my-project.iam.gserviceaccount.com" \ --role "roles/dns.admin" gcloud iam service-accounts keys create key.json \ --iam-account external-dns@my-project.iam.gserviceaccount.com # 创建Secret kubectl create secret generic gcp-key \ --namespace external-dns \ --from-file=key.json=./key.json # 安装ExternalDNS helm install external-dns external-dns/external-dns \ --namespace external-dns \ --set provider=google \ --set google.project=my-project \ --set google.secretName=gcp-key \ --set domainFilters="{example.com}"

四、使用ExternalDNS

4.1 Service配置

apiVersion: v1 kind: Service metadata: name: my-service annotations: external-dns.alpha.kubernetes.io/hostname: my-service.example.com. external-dns.alpha.kubernetes.io/ttl: "60" spec: type: LoadBalancer selector: app: my-app ports: - port: 80 targetPort: 8080

4.2 Ingress配置

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress annotations: external-dns.alpha.kubernetes.io/hostname: app.example.com. external-dns.alpha.kubernetes.io/target: "my-loadbalancer-123456.us-west-2.elb.amazonaws.com" spec: rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80

4.3 多域名配置

apiVersion: v1 kind: Service metadata: name: multi-domain-service annotations: external-dns.alpha.kubernetes.io/hostname: | service1.example.com. service2.example.com. service3.example.com. spec: type: LoadBalancer selector: app: my-app ports: - port: 80

五、高级配置

5.1 同步策略

helm install external-dns external-dns/external-dns \ --namespace external-dns \ --set provider=aws \ --set policy=upsert-only \ --set registry=txt \ --set txtOwnerId=my-cluster-id

支持的策略:

  • sync:完全同步(删除不存在的记录)
  • upsert-only:只添加/更新记录,不删除
  • create-only:只创建新记录

5.2 过滤配置

helm install external-dns external-dns/external-dns \ --namespace external-dns \ --set provider=aws \ --set domainFilters="{example.com,api.example.com}" \ --set excludeDomains="{internal.example.com}" \ --set annotationFilter="external-dns\.alpha\.kubernetes\.io/enabled=true"

5.3 自定义TTL

apiVersion: v1 kind: Service metadata: name: my-service annotations: external-dns.alpha.kubernetes.io/hostname: my-service.example.com. external-dns.alpha.kubernetes.io/ttl: "300" spec: type: LoadBalancer selector: app: my-app

六、监控与日志

6.1 Prometheus指标

apiVersion: v1 kind: Service metadata: name: external-dns-metrics namespace: external-dns spec: selector: app.kubernetes.io/name: external-dns ports: - name: metrics port: 7979 targetPort: metrics

6.2 配置ServiceMonitor

apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: external-dns-monitor namespace: monitoring spec: selector: matchLabels: app.kubernetes.io/name: external-dns endpoints: - port: metrics interval: 30s

七、最佳实践

7.1 权限最小化

apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: external-dns-limited namespace: external-dns rules: - apiGroups: [""] resources: ["services", "endpoints"] verbs: ["get", "watch", "list"] - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] verbs: ["get", "watch", "list"]

7.2 多集群场景

helm install external-dns external-dns/external-dns \ --namespace external-dns \ --set provider=aws \ --set txtOwnerId=cluster-a \ --set domainFilters="{cluster-a.example.com}"

7.3 测试模式

helm install external-dns external-dns/external-dns \ --namespace external-dns \ --set provider=aws \ --set dryRun=true

八、故障排除

8.1 常见问题

# 查看详细日志 kubectl logs -n external-dns deployment/external-dns -f # 检查配置错误 kubectl describe deployment external-dns -n external-dns # 验证DNS记录 dig my-service.example.com

8.2 调试技巧

# 启用详细日志 helm upgrade external-dns external-dns/external-dns \ --namespace external-dns \ --set logLevel=debug # 手动触发同步 kubectl delete pod -n external-dns -l app.kubernetes.io/name=external-dns

九、总结

ExternalDNS为Kubernetes提供了强大的DNS自动化管理能力,消除了手动管理DNS记录的繁琐工作。通过本文的实践指南,您可以快速部署和配置ExternalDNS,实现服务的自动DNS注册。建议根据实际需求选择合适的DNS服务商和配置策略。


参考资料

  • ExternalDNS官方文档
  • ExternalDNS GitHub
  • Kubernetes Service文档
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 13:22:37

这次终于选对了!2026年亲测好用的专业一键生成论文工具

2026年AI论文写作工具已从“内容生成”进化为融合文献分析、逻辑构建与合规审查的全流程学术助手,核心评价维度包括文献真实性、格式合规性、长文本逻辑、查重降重、AIGC合规及多语言支持。本次测评覆盖6款主流工具,涵盖中文与英文场景,适用于…

作者头像 李华
网站建设 2026/5/22 13:22:32

2026 西安本土 GEO 测评:灵怡云凭差异化站稳第一梯队

** 2026 西安本土 GEO 测评:灵怡云凭差异化站稳第一梯队 ** 伴随生成式AI搜索全面商业化落地,西安企业数字化营销正式告别传统SEO流量依赖时代。在AI大模型智能推荐、自然问答、智能科普的流量新生态下,GEO生成式引擎优化成为西安制造、跨境电…

作者头像 李华
网站建设 2026/5/26 3:47:23

暗黑的故事

起因 网友问:mqttjson ,数据包比较大如何优化 。本地用json也记录一下。 俺的回答是:mqtt 其实可以选择 ProtoBuf。本地存储可以走 sqlite、文本、bin、dat 等。 网友又问了ProtoBuf的一些事情,俺就讲了 ProtoBuf 和 暗黑破坏…

作者头像 李华
网站建设 2026/5/22 13:22:21

从事弱电运维多年,聊聊我对UPS电源的真实理解

做弱电、机房运维、设备维护这么多年,我发现一个很有意思的现象:很多设备故障、数据丢失、设备提前老化,其实都不是设备本身坏了,而是供电不稳定导致的。尤其是很多小型机房、办公设备、精密仪器、监控系统,大家平时不…

作者头像 李华
网站建设 2026/5/22 13:17:02

独立开发者如何借助Taotoken模型广场快速选型与对比测试

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助Taotoken模型广场快速选型与对比测试 对于独立开发者或小型创业团队而言,项目初期选择合适的大模型…

作者头像 李华