CoreDNS简介
CoreDNS是一个通常用于支持在容器运行环境,特别是Kubernetes管理的容器环境中,提供服务发现功能。最早是由Miek Gieben于2016年开发的最初版本,最初称为 SkyDNS。当时使用了一个名为Go DNS的非常流程的在 Go 中提供DNS功能的库。接着,SkyDNS被CoreDNS所取代成为更流行的服务发现。由于开发者Miek非常欣赏一个Go基础web服务器Caddy,所以他fork出Caddy来创建CoreDNS。这样CoreDNS就继承了Caddy的主要有点: 简单的配置语法,强大的插件架构,以及基于Go开发。
CoreDNS使用了 BIND 配置语法的配置文件,命名为 Corefile
。这是一个非常简单的配置。
CoreDNS通过插件功能提供DNS功能:
缓存(cache)插件
转发(forward)插件
读取zone数据的插件
配置第二个DNS的插件
这种插件结构的好处时,如果你不需要某个插件功能,你可以不用配置该插件,这样CoreDNS也不会执行这个插件,这就使得CoreDNS运行更快也更安全。CoreDNS插件的开发也较为简便。
在容器化的Kubernetes环境,CoreDNS是核心组件,提供了服务发现能力,确保容器间通讯正常。
CoreDNS的限制
CoreDNS目前还不是完整功能的DNS服务器:
CoreDNS不支持完全递归,也就是不能从DNS名字空间的根开始查询: 常规的DNS服务器,例如 BIND 支持递归查询,也就是从根DNS开始一级一级,直到找到权威DNS服务器获得查询结果
实际上,CoreDNS依赖其他DNS服务器,也就是所谓的转发
forwarder
功能 |
CoreDNS |
Bind |
---|---|---|
完全递归 |
No |
Yes |
动态更新 |
No |
Yes |
和Kubernetes集成 |
Yes |
No |
和Amazon Route 53集成 |
Yes |
No |
支持域名系统安全扩展(Domain Name System Security Extensions,DNSSEC) |
Limited |
Full |
支持传输层安全的DNS(DNS over Transport Layer Security,DoT) |
Yes |
No |
CoreDNS, Kubernetes 和 CNCF
Kubernetes是2015年由Google开发并捐赠给Google和Linux基金会共同组建的开元组织云原生计算基金会(Cloud Native Computing Foundation, CNCF)。
2017年CoreDNS被提交给CNCF并且在2019年1月孵化毕业。
从Kubernetes 1.13(2018年12月发布),CoreDNS就成为了Kubernetes的默认DNS。也就是说,现在CoreDNS已经默认安装在几乎所有Kubernetes集群。
备注
参考
OReilly Learning CoreDNS