kubernetes-sigs / external-dns

587 阅读9分钟
隐藏
toc
导航

|

ExternalDNS

外部DNS

Build StatusCoverage StatusGitHub releasego-docGo Report CardExternalDNS docs

ExternalDNS将暴露的Kubernetes服务和Ingresses与DNS提供商同步。

它的作用

受KubernetesDNS(Kubernetes的集群内部DNS服务器)的启发,ExternalDNS使Kubernetes资源可以通过公共DNS服务器发现。与KubeDNS一样,它从Kubernetes API中检索资源列表(服务、Ingresses等)以确定所需的DNS记录列表。然而,与KubeDNS不同的是,它本身不是一个DNS服务器,而只是相应地配置其他DNS提供商--例如AWS Route 53谷歌云DNS

在更广泛的意义上,ExternalDNS允许你通过Kubernetes资源以DNS供应商无关的方式动态地控制DNS记录。

常见问题包含了额外的信息,并解决了关于ExternalDNS关键概念的几个问题。

要看 ExternalDNS 的运行情况,请看这个视频或阅读这个博文

最新版本

ExternalDNS 允许您将选定的区域(通过--domain-filter )与type=LoadBalancer 的入口和服务以及各种云提供商的节点保持同步。

从这个版本开始,ExternalDNS 可以知道它所管理的记录(通过--registry=txt 启用),因此 ExternalDNS 可以安全地管理非空的托管区域。我们强烈建议你使用v0.5 (或更大),启用--registry=txt ,并将--txt-owner-id 设置为一个唯一的值,在集群的生命周期内不会改变。您可能还想在干运行模式下运行ExternalDNS (--dry-run 标志),看看要提交给您的DNS提供商API的变化。

注意,所有的标志都可以用环境变量代替;例如,--dry-run 可以用EXTERNAL_DNS_DRY_RUN=1 来代替,--registry txt 可以用EXTERNAL_DNS_REGISTRY=txt 来代替。

提供商的状态

ExternalDNS支持多个DNS提供者,这些提供者已经由ExternalDNS的贡献者实现。在一个中央存储库中维护所有这些是一个挑战,而且我们有有限的资源来测试变化。这意味着我们很难测试所有提供者可能出现的退步,正如在贡献部分所写的那样,我们鼓励贡献者作为单个提供者的维护者介入,并通过测试集成来帮助。

ExternalDNS的端到端测试目前是在独立的kubernetes-on-aws仓库中进行

我们为提供商定义了以下的稳定性级别。

  • 稳定的。用于发布前的烟雾测试,在生产中使用,维护者是活跃的。
  • 测试版。社区支持,测试良好,但维护者无法获得资源在真实平台上执行集成测试和/或不在生产中使用。
  • 阿尔法版。社区提供,维护者除了审查PR之外没有任何支持。

下表阐明了根据上述稳定性级别的供应商的当前状态。

提供者状态维护者
谷歌云DNS稳定的
AWS Route 53稳定的
AWS云地图测试版
Akamai边缘DNS测试版
AzureDNS测试版
蓝猫阿尔法@seanmalloy @vinny-sabatini
云飞扬测试版
RcodeZero阿尔法
数字海洋阿尔法
DNSimple淘宝网
讯飞公司淘宝网@saileshgiri
语音呼叫中心
指定的OpenStack阿尔法
PowerDNS阿尔法
CoreDNS架构
规模化阿尔法
Oracle云基础设施DNS阿尔法
Linode DNS阿尔法
RFC2136阿尔法
NS1编码
遗传因子阿尔法
VinylDNS编码
RancherDNS呼叫中心
OVH阿尔法
迅捷DNS阿尔法@Sh4d1
Vultr呼叫中心
UltraDNS阿尔法
GoDaddy阿尔法
赣迪阿尔法@packi
SafeDNSǞǞǞ@assureddt
IBMCloud阿尔法@hughhuangzh

Kubernetes版本兼容性

在external-dns v0.10.0中加入了一个突破性的变化

ExternalDNS<= 0.9.x>= 0.10.0
Kubernetes <= 1.18
Kubernetes >= 1.19 and <= 1.21
Kubernetes >= 1.22

运行ExternalDNS。

运行ExternalDNS的方法有两种。

  • 部署到集群中
  • 在本地运行

部署到集群中

提供以下教程。

本地运行

关于从源代码编译的细节,请参见贡献者指南

设置步骤

接下来,运行一个应用程序,并通过一个Kubernetes服务将其暴露出来。

kubectl run nginx --image=nginx --port=80

用你想要的外部DNS名称来注解该服务。确保将example.org 改为你的域名。

kubectl annotate service nginx "external-dns.alpha.kubernetes.io/hostname=nginx.example.org."

另外,你可以通过使用external-dns.alpha.kubernetes.io/ttl 注释来定制所产生的DNS记录的TTL值。

kubectl annotate service nginx "external-dns.alpha.kubernetes.io/ttl=10"

关于配置TTL的更多细节,请看这里

使用 internal-hostname 注解来创建以 ClusterIP 为目标的 DNS 记录。

kubectl annotate service nginx "external-dns.alpha.kubernetes.io/internal-hostname=nginx.internal.example.org."

如果服务不属于Loadbalancer类型,你需要使用-publish-internal-services标志。

在本地运行 ExternalDNS 的单一同步循环。

external-dns --registry txt --txt-owner-id my-cluster-id --provider google --google-project example-project --source service --once --dry-run

这应该会输出它要修改的DNS记录,以使管理区与你想要的DNS记录相匹配。它还假定你是在default 名称空间中运行。有关命名空间的更多信息,请参见常见问题

注意:TXT记录将嵌入my-cluster-id 值。这些是用来确保ExternalDNS知道它所管理的记录。

一旦你对结果感到满意,你就可以像在集群中运行 ExternalDNS 那样运行它:作为一个控制循环,而不是在干运行模式下。

external-dns --registry txt --txt-owner-id my-cluster-id --provider google --google-project example-project --source service

检查 ExternalDNS 是否为你的服务创建了所需的 DNS 记录,并且它指向其负载平衡器的 IP。然后尝试解析它。

dig +short nginx.example.org.

现在你可以进行实验,观察 ExternalDNS 如何确保你的 DNS 记录被配置成所需的样子。下面是你可以尝试的几件事。

  • 通过修改服务的注释来改变所需的主机名。
  • 重新创建服务,看到DNS记录将被更新以指向新的负载均衡器IP。
  • 添加另一个服务来创建更多的 DNS 记录。
  • 删除服务以清理你的管理区。

教程部分包含实例,包括Ingress资源,并告诉你如何在不同的环境中设置ExternalDNS,如其他云提供商和替代Ingress控制器。

注意事项

如果使用 txt 注册表并试图使用 CNAME,必须设置--txt-prefix 以避免冲突。改变--txt-prefix ,将导致对以前创建的记录失去所有权。

如果externalIPs 列表是为LoadBalancer 服务定义的,这个列表将被用来代替分配的负载平衡器 IP 来创建 DNS 记录。当你在NAT后面运行裸机Kubernetes集群时,或者在类似的设置中,负载均衡器IP与公共IP不同时(例如,使用MetalLB),这很有用。

路线图

ExternalDNS是以可扩展性为前提而构建的。添加和试验新的 DNS 提供商和所需的 DNS 记录来源应该是尽可能容易的。也应该可以修改ExternalDNS的行为方式--例如,是否应该添加记录但不删除它们。

下面是一个关于未来的粗略概要(可能会有变化)。

v0.1

  • 对Google CloudDNS的支持
  • 支持Kubernetes服务

v0.2

  • 支持AWS Route 53
  • 支持Kubernetes Ingresses

v0.3

  • 通过ALIAS支持AWS Route 53
  • 支持多个区域
  • 所有权系统

v0.4

  • 支持AzureDNS
  • 支持CloudFlare
  • 支持DigitalOcean
  • 每个服务有多个DNS名称

v0.5

  • 支持创建DNS记录到多个目标(针对谷歌和AWS)。
  • 支持OpenStack Designate
  • 支持PowerDNS
  • 支持Linode
  • 支持RcodeZero
  • 支持NS1
  • 支持TransIP
  • 支持Azure私有DNS

v0.6

  • 能够取代kOps的DNS控制器(这也可以直接成为v1.0
  • 支持OVH

v1.0

  • 替换kOps的DNS控制器的能力
    • 增加对pod源的支持
    • 为pod和服务源添加对DNS控制器注释的支持
    • 增加对kOps闲话提供商的支持
  • 能够替换Zalando的Mate
  • 能够取代Molecule软件公司的route53-kubernetes

尚待定义

  • 对CoreDNS的支持
  • 支持记录权重
  • 支持不同的行为策略
  • 支持具有以下特点的服务type=NodePort
  • 支持CRD
  • 支持更高级的DNS记录配置

请看一下里程碑,了解我们目前的情况。

贡献

你有兴趣为external-dns做贡献吗?我们,维护者和社区,都希望得到你的建议、贡献和帮助另外,我们可以在任何时候联系维护者,以了解更多关于如何参与。

我们也鼓励所有活跃的社区参与者把自己当成维护者,即使你没有 "正式 "的写入权限。这是一项社区工作,我们在这里为Kubernetes社区服务。如果你有一个积极的兴趣,你想参与进来,你就有真正的力量不要以为只有 "维护者 "才能完成这里的工作。我们也很想增加更多的 "官方 "维护者,所以请向我们展示你的能力吧

external-dns项目目前正需要特定DNS提供商的维护者。理想情况下,每个供应商至少有两个维护者。如果维护者能在生产中运行该提供商,那就更好了,但这并不是严格的要求。这里列出的提供商如果没有列出维护者,则需要援助。

请阅读贡献指南并查看贡献文档,以了解项目的构建、项目结构和每个软件包的目的。

关于如何编写新的Sources和Providers的概述,请看Sources和Providers

遗产

ExternalDNS是为了统一以下类似的项目,以便为Kubernetes社区带来一种简单和可预测的方式来管理基于Kubernetes资源的跨云供应商的DNS记录。

用户演示如何做博客和例子