5.6.1 CoreDNS及其插件工作机制

CoreDNS是一个CNCF下的孵化级项目,它的前身是SkyDNS,主要目的是构建一个快速灵活的DNS服务器,让用户可以通过不同方式访问和使用DNS内的数据。CoreDNS基于Caddy服务器框架,实现了一个插件链的架构,将大量逻辑抽象成插件的形式暴露给使用者,每个插件都执行DNS功能,例如Kubernetes的DNS服务发现、Prometheus监控等。

除了插件化之外,CoreDNS还有以下特性:

·配置简单化:引入表达力更强的DSL,即Coref ile形式的配置文件(也是基于Caddy框架开发)。

·一体化的解决方案:与kube-dns不同,CoreDNS编译出来就是一个单独的二进制可执行文件,内置了cache、backend storage、health check等功能,无需第三方组件来辅助实现其他功能,从而使部署更方便,内存管理更为安全。

Coref ile是CoreDNS的配置文件(源于Caddy框架的配置文件Caddyf ile),定义了如下信息:

·服务器以什么协议监听在哪个端口(可以同时定义多个server监听不同端口)。

·服务器负责哪个zone的authoritative DNS解析。

·服务器将加载哪些插件。

典型的Coref ile格式如下所示:


ZONE:[PORT] {
  [PLUGIN] ...
}

其中:

·ZONE:用于定义服务器负责的zone。

·PORT:监听端口,可选项,默认为53。

·PLUGIN:定义服务器所要加载的插件,每个插件可以有多个参数。

了解了CoreDNS上述介绍之后,接下来让我们一起了解一下它的插件工作机制。

当CoreDNS启动后,插件将根据配置文件启动不同的server,每台server都拥有自己的插件链。当有DNS请求时,插件将依次执行如下步骤:

1)如果当前请求的server有多个zone,将采用贪心原则选择最配的zone。

2)一旦找到匹配的server,按照plugin.cfg定义的顺序执行插件链上的插件。

3)每个插件将判断当前请求是否应该处理,有以下几种可能:

·请求被当前插件处理:插件将生成对应的响应并回给客户端,此时请求结束,下一个插件将不会被调用,如whoami插件。

·请求不被当前插件处理:直接调用下一个插件。如果最后一个插件执行错误,服务器返回SERVFAIL响应。

·请求被当前插件以Fallthrough形式处理:如果请求在该插件处理过程中有可能将跳转至下一个插件,该过程称为fallthrough,并以关键字fallthrough来决定是否允许此项操作,例如host插件,当查询域名未位于/etc/hosts,则调用下一个插件。

·请求在处理过程中携带信息:请求被插件处理,并在其响应中添加了某些信息(hint)后继续交由下一个插件处理。这些额外的信息将组成对客户端的最终响应,如metric插件。