首先获取 CoreDNS,需要
-
下载最新版本,从 GitHub 下载并解压缩。您现在应该拥有一个名为“coredns”的可执行文件。
-
从 Git 编译,从 GitHub 获取源代码。将目录更改为
coredns
,然后- 输入
go get
- 获取一些依赖项,其他依赖项已作为供应商提供 输入 go build
您现在应该拥有一个名为“coredns”的可执行文件。
- 输入
-
获取 Docker 镜像,从 docker hub 获取。
如果您想在 Kubernetes 中使用 CoreDNS,请查看 关于 SD 及kuberneters 插件的这篇文章。
本快速入门指南的其余部分将介绍并重点关注两种不同的用例
- 使用 CoreDNS 处理区域文件。可以选择对区域进行签名。
- 将 CoreDNS 用作转发代理。
CoreDNS 通过通常称为 Corefile 的配置文件进行配置。
从文件处理
当从区域文件处理时,您将使用file 插件。我们以区域 example.org.
和我们要从中处理的区域文件为例
创建名为 example.org
的文件,其中包含以下内容
$ORIGIN example.org.
@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. (
2017042745 ; serial
7200 ; refresh (2 hours)
3600 ; retry (1 hour)
1209600 ; expire (2 weeks)
3600 ; minimum (1 hour)
)
3600 IN NS a.iana-servers.net.
3600 IN NS b.iana-servers.net.
www IN A 127.0.0.1
IN AAAA ::1
使用以下内容创建一个 Corefile,即 Corefile
example.org {
file example.org
prometheus # enable metrics
errors # show errors
log # enable query logs
}
在非标准端口上启动 CoreDNS 以检查是否一切都正确: coredns -conf Corefile -dns.port 1053
,并使用 dig 向其发送查询
% dig -p 1053 @localhost AAAA www.example.org +noall +answer
www.example.org. 3600 IN AAAA ::1
由于我们已使用 log 插件 启用了查询日志记录,因此查询也应该显示在标准输出上
::1 - [24/Jul/2017:10:10:44 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 121 133.449µs
在此,您可以启用 CoreDNS 在端口 53 上运行,并让其从 systemd(在 Linux 操作系统上)启动,有关示例脚本,请参阅 部署存储库。阅读有关 file、metrics 和 errors 插件的更多信息。
CoreDNS 作为代理
另一个插件是 proxy 插件。例如,我们可以通过 HTTPS 向 Google 发送 DNS 请求。使用以下内容创建一个 Corefile
. {
proxy . 8.8.8.8:53 {
protocol https_google
}
prometheus
errors
log
}
就像上面一样,启动 CoreDNS 并向其发送一些查询。在这种情况下,CoreDNS 应该记录这些查询
::1 - [24/Jul/2017:10:44:15 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 83.396955ms
::1 - [24/Jul/2017:10:44:17 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 14.030914ms
::1 - [24/Jul/2017:10:44:19 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 13.286384ms
如果你查看了每次查询花费的时间(“毫秒”),它很慢,大约 83 毫秒,13 毫秒。因此,让我们添加一些缓存并启用缓存插件。只需将单词“cache”添加到 Corefile 并从容重新加载 CoreDNS:kill -SIGUSR1 <pid_of_coredns>
。然后再次查询
::1 - [24/Jul/2017:11:33:54 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 43.469743ms
::1 - [24/Jul/2017:11:33:55 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 73 133.073µs
第一个仍然“慢”,但后续查询只需 133 微秒。
可能的错误
健康的文档说明“此插件只需启用一次”,这可能会让你认为这是有效的 Corefile
health
. {
whoami
}
但这不起作用,并导致一些令人费解的错误
"Corefile:3 - Error during parsing: Unknown directive '.'".
这里发生了什么?health
被视为区域,现在解析器期望看到指令(cache
、etcd
等),但下一个标记是.
,这不是一个指令。Corefile 应构建如下
. {
whoami
health
}
健康文档中的那行意味着一旦指定健康后,它会对整个 CoreDNS 进程都是全局的,即使你只为一个服务器指定了它。
另请参阅
还有许多其他可以与 CoreDNS 一起使用的插件。并且你可以编写你自己的插件。
查询的处理方式深入介绍了 CoreDNS 如何处理 DNS 查询。