插件
当 CoreDNS 启动并且加载配置文件了,DNS服务器就启动了。
每个服务器由服务的zone和运行port来定义。
每个服务器都有它自己的插件链。
当一个查询提交到 CoreDNS,会执行如下的步骤:
如果有多个服务器运行在同一个监听端口,它会检查哪个zone最匹配该次查询(最长后缀匹配)
比如:如果存在两个服务器,一个伺候example.org
,一个伺候a.example.org
,查询请
求是www.a.example.org
,CoreDNS会将查询请求路由向后者。当服务器被发现后,查询通过该服务器预先定义的插件链,路由向该服务器。这些总是按照同样的顺序处理的。顺序定义在
plugin.cfg
.-
每个插件都会检查查询,并且判断是否被处理 (有些查询允许基于query name 或其他属性过滤).
会产生如下操作:- query 被插件处理.
- query 不被插件处理
- query 被插件处理, 但是话说虽然决定处理了,还是需要调用链中的下个插件。我们称为 fallthrough。
- query 被插件处理, "hint" 被添加,下个插件被调用。 这个
hint 提供了一个办法来 "see" the (eventual) response and act upon that.
处理一个 query 意思是 插件会向client返回消息。
注意,插件也可以不按照如上方式处理。虽然现在所有的在CoreDNS工作的插件都包含在如上4个组里了。 blog post 提供了query routing 的相关内容。
Query 被处理
插件处理这个query。它找到 looks up (or 生成, or 插件拥有者决定插件做的任何事情) 一个反馈,然后发送回 client 。然后查询的处理就在这结束了,不会调用下个插件了。 以如此方式工作的一个 (简单) 插件,比如 whoami.
Query 不被处理
如果插件决定不处理这个query,它就直接调用链中的下一个插件。如果链中的最后一个插件也觉得不处理这个查询,CoreDNS 就会返回 SERVFAIL 给 client。
Query 以 Fallthrough 的方式处理
在某种情况下,一个插件完整的处理这个查询,但是答复来自后台 (i.e. maybe it got NXDOMAIN),它希望链中的其他插件查询。 如果fallthrough被配置了,下一个插件将会被调用。
以这种方式工作的插件,比如 hosts 插件。
首先,先从主机列表文件 (/etc/hosts
) 进行查询,如果查到了,就将起返回;如果没有查询到,它会 fallthrough 到下一个,以希望其他插件可以返回结果给 client 。
fallthrough : 下坠。CoreDNS里面的意思,应该是自己不处理,让下个插件接替这个任务。
Query 以 Hint 的方式处理
这类插件处理查询,总是 always 调用下一个插件。但是,它提供了一个 hint ,允许查看到被写回 client 的响应内容。
比如插件 prometheus。它计量某个周期的时间It times the duration (among other things),但是不做跟DNS 请求有关的任何事情。它只是透传和检查返回路径的源数据。
Hint : 暗示,示意。我的理解,啥都不干,偷偷看着。
未注册插件
还有一个特殊的插件不处理任何DNS的数据,但是以其他方式影响着 CoreDNS 的工作。比如, bind 插件用于控制 CoreDNS 会绑定到哪个接口上。
如下的插件都是这个类型的:
- bind - 绑定接口。
- root - set the root directory where CoreDNS plugins should look for files.
- health - 开启 HTTP health 检查接口。
- ready - support readiness reporting for a plugin.
插件结构解析
插件由 Setup, Registration, and Handler 部分构成。
Setup 解析配置文件和插件的指令 (参见插件的 README 文档)。
Handler 是用于查询处理和逻辑实现的代码。
Registration 将插件注册到 CoreDNS - 当 CoreDNS 编译后。
所有已注册的插件都可以被服务器使用。在运行的时候,会决定哪个服务器用哪个插件,由CoreDNS 的配置文件 Corefile 来完成。
插件文档
每个插件都有自己的 README 文档,告诉你如何配置。这些 README 包含了范例和用户应该留意的注意点。 READMEs 参见 https://coredns.io/plugins,并且我们也已经将其编译到了 manual pages.