CoreDNS,一个新的DNS服务器,旨在与Linux和Docker容器等一起工作,特别是在流行的容器编排系统Kubernetes管理的环境中。主要介绍了CoreDNS存在的理由以及它与其他DNS服务器的区别,包括它的局限性。本章还介绍了CoreDNS的一些历史,例如它与云原生计算基金会的关系。什么是CoreDNS?CoreDNS是DNS服务器软件,通常用于支持容器化环境中的服务发现功能,尤其是那些由Kubernetes管理的环境。MiekGieben在2016年编写了CoreDNS的原始版本。他之前用Go语言编写了一个名为SkyDNS的DNS服务器和一个名为GoDNS的流行的Go函数式DNS库。与其继任者CoreDNS一样,SkyDNS的主要目的是支持服务发现。但Miek非常欣赏名为Caddy的基于Go的Web服务器的架构,因此他分叉Caddy创建了CoreDNS。因此,CoreDNS继承了Caddy的主要优点:简单的配置语法、强大的基于插件的架构和Go基础。相比于BIND的配置文件的语法,CoreDNS的Corefile(简称)非常简单。基于CoreDNS的基本DNS服务器的Corefile通常只有几行,而且相对容易阅读。CoreDNS使用插件来提供DNS功能。所以有一个用于缓存的插件和一个用于转发的插件,一个用于配置从文件中读取区域数据的主DNS服务器的插件,以及一个用于配置辅助DNS服务器的插件。不仅每个插件都可以直接配置(见上一段),而且,如果不需要插件,则不需要配置,其代码也不会执行。这使得CoreDNS更快、更安全。插件也很容易开发。这很重要,原因有二。首先,如果你想扩展CoreDNS的功能,你可以自己写插件;我们将在第9章介绍它。其次,由于编写新插件不是火箭科学,许多插件已经被开发出来,并且一直在编写更多插件。您可能会发现其中之一提供了您需要的功能。Go是一种“内存安全”语言,这意味着它可以防止“内存访问错误”,例如缓冲区溢出和悬空指针。这对于像CoreDNS这样的DNS服务器尤其重要,可以想象互联网上的任何人都可以访问。恶意行为者可以利用缓冲区溢出来使DNS服务器崩溃,甚至获得对底层操作系统(OS)的控制权。事实上,在其长达数十年的历史中,BIND中的漏洞一直是由内存访问错误引起的。使用CoreDNS,您无需担心这些。不过,也许CoreDNS提供的最重要的优势是它能够与容器基础设施和编排系统(如etcd和Kubernetes)进行通信。我们将在本书后面更详细地讨论这一点,但让我们快速浏览一下这里的功能。CoreDNS、容器和微服务如果您是本书吸引的少数人之一,您可能听说过容器。如果您还没有,请将容器视为轻量级、高效的虚拟机(VM)。VM可以共享单一硬件平台(由管理程序提供),而容器提供可以在相同操作系统内核下运行的操作环境,但提供与VM类似的隔离级别。容器比VM小得多,可以更快地启动和停止。容器通常用于基于微服务架构的软件中。使用微服务,一个应用程序(通常是一个复杂的应用程序)被分解成许多微服务。每个微服务负责提供一个小但有用且定义明确的功能。例如,一个微服务可能处理用户身份验证,而另一个微服务管理这些用户的授权。总的来说,一个应用程序可能包含数十个或数百个微服务,它们通过网络相互通信。实际上,每个微服务可能由一个或多个容器提供。例如,身份验证服务可以作为容器来实现。启动和停止容器的过程是如此快速和简单,以至于应用程序或更高级别的容器编排器可以随着身份验证需求的增加动态地启动和停止其他身份验证容器。但是,在这样的环境中,可能很难跟踪特定服务的运行位置。假设支持数据库服务的容器需要与授权服务通信以确定是否应允许给定用户执行特定搜索。如果实现身份验证服务的容器正在动态启动和停止以适应负载,我们如何获得所有正在运行的身份验证容器的列表?答案通常是DNS,即域名系统。由于容器之间的通信几乎总是基于IP(Internet协议),并且由于开发人员实际上已经使用DNS查找资源的IP地址数十年,因此使用DNS来识别提供给定服务的容器是很自然的。CoreDNS确实做到了这一点。CoreDNS不仅是一个灵活安全的DNS服务器,还可以直接与包括Kubernetes在内的众多容器编排系统集成。这意味着容器化应用程序的管理员可以轻松设置DNS服务器来调解和促进容器之间的通信。CoreDNS的局限性尽管CoreDNS目前确实有一些重要的局限性,但它并不适用于所有可能的DNS服务器。其中最主要的是CoreDNS(至少是撰写本文时的最新版本)不支持完全递归。换句话说,CoreDNS无法通过从DNS名称空间的根开始、查询根DNS服务器并跟踪引用来处理查询,直到从其中一个权威DNS服务器获得答案为止。相反,它依赖于其他DNS服务器(通常称为转发器)。在第2章中,我们将更多地讨论递归和转发器。如果您仍然怀疑CoreDNS是否是满足您特定需求的正确选择,请参阅表1-1。可能有帮助;它总结了CoreDNS功能和BIND功能之间的主要区别。如果您不确定其中一些术语的含义,请不要担心,我们将在本书后面介绍它们。不过,在我们开始之前,让我们简要描述一下CoreDNS、Kubernetes和云原生计算基金会之间的官方关系。CoreDNSKubernetesCNCFKubernetes是一个与CoreDNS很好集成的容器编排系统,最初由Google编写,然后在2015年转换为开源项目。为了管理新的开源Kubernetes,Google与LinuxFoundation合作创建了CloudNative计算基金会(简称CNCF)。CNCF已经成为许多对构建基于云的应用程序很重要的技术的发源地,包括支持指标和警报收集的Prometheus,以及服务代理Envoy。对于早期项目,CNCF管理的项目经历了各种“成熟度”(来自“沙箱”);到“孵化”,让项目获得认可;成熟的项目。CoreDNS于2017年提交给CNCF,并于2019年1月更改为“已毕业”状态。证明CoreDNS对Kubernetes环境的重要性,CoreDNS成为Kubernetes的默认DNS服务器,Kubernetes1.13版本于2018年12月发布。现在几乎所有新的Kubernetes实现都安装了CoreDNS,Kubernetes是容器之王世界(和容器本身似乎正在风靡世界),我们预计CoreDNS的安装基数会爆炸式增长。对CoreDNS赞不绝口。我们已经讨论了CoreDNS的优缺点,以及它对Kubernetes的命运。
