| 隐藏 |
|---|
toc | 导航 |
|
外部DNS
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 的入口和服务以及各种云提供商的节点保持同步。
- 谷歌云DNS
- AWS Route 53
- AWS云地图
- AzureDNS
- 蓝猫
- 云飞扬
- RcodeZero
- 数字海洋
- DNSimple
- 讯飞
- 淘宝网
- OpenStack Designate
- PowerDNS
- CoreDNS
- 兴发xf187在线娱乐 Exoscale
- 甲骨文云基础设施DNS
- Linode DNS
- RFC2136
- NS1
- 淘宝网
- Vultr
- Vultr
- OVH
- 规模效应
- Akamai边缘DNS
- GoDaddy
- 甘迪
- UKFast SafeDNS
- IBM云DNS
从这个版本开始,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的方法有两种。
- 部署到集群中
- 在本地运行
部署到集群中
提供以下教程。
- Akamai边缘DNS
- 阿里巴巴云
- 呼叫中心
- Azure DNS
- Azure私有DNS
- 云飞扬
- 蓝猫
- 淘宝网
- 淘宝网
- 淘宝网
- 淘宝网
- 淘宝网
- 外部名称服务
- 谷歌Kubernetes引擎
- 无头服务
- 呼叫中心
- Istio网关来源
- Kubernetes安全背景
- Linode
- Nginx 入站控制器
- NS1
- 用CRD创建NS记录来源
- OpenStack指定
- 甲骨文云基础设施(OCI)DNS
- PowerDNS
- RcodeZero
- RancherDNS (RDNS)
- RFC2136
- 呼叫中心(TransIP)
- VinylDNS
- OVH
- Scaleway
- Vultr
- UltraDNS
- GoDaddy
- Gandi
- SafeDNS
- IBM云
- 节点为源
本地运行
关于从源代码编译的细节,请参见贡献者指南。
设置步骤
接下来,运行一个应用程序,并通过一个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记录。
- Kops的DNS控制器
- Zalando的Mate
- Molecule软件公司的route53-kubernetes
用户演示如何做博客和例子
- 关于GKE Kubernetes的完整演示。请看如何使用DNS管理的Kubernetes(ssl-manager的前置条件)
- 在GKE上用工作负载身份运行external-dns。参见Kubernetes, ingress-nginx, cert-manager & external-dns