原文参见:https://coredns.io/2017/07/24/quick-start/
通过如下方式获取 CoreDNS
*从 github 下载最新版本,解压。然后得到 "coredns" 可执行文件。
-
*从 github 下载源码编译。
变更目录到coredns
,然后:-
go get
- 解决依赖关系 go build
现在得到 "coredns" 可执行文件了。
-
*从 docker hub 获取Docker镜像。
如果要在 Kubernetes 中使用 CoreDNS ,请查看 this post about SD with the kuberneters plugin.
文档的其余部分集中于CoreDNS的两个使用范例:
- CoreDNS 提供zone解析。Optionally signing the zones as well.
- CoreDNS 作为转发代理。
CoreDNS 的配置文件默认 Corefile.
Serving from Files
要以zone file的方式提供服务,需要使用 file 插件。我们以 zone example.org.
作为范例,zonefile 如下。
创建文件 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 plugin插件打开query loggin ,查询会在标准输出显示如下:
::1 - [24/Jul/2017:10:10:44 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 121 133.449µs
然后你可以将 CoreDNS 启动于 port 53 了,将其配置到Linux服务管理中。
查阅 the deployment repo 获取更多范例脚本。
查阅更多关于 file, metrics and errors 插件。
CoreDNS as proxy
另有一个插件是 proxy 插件。我们可以根据情况通过HTTPS将 DNS request 发送到Google。创建 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
你看到每次查询的时间("ms"),比较慢 ~83ms, 13ms。所以我们增加一些缓存,开启 caching 插件。在 Corefile 添加 "cache" ,然后重新加载 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 µs。
Possible Errors
health 插件的文档描述 "This plugin only needs to be enabled once",这可能会让你认为如下的配置是正确的:
health
. {
whoami
}
但是这个配置没用,并且会导致一些简短的报错:
"Corefile:3 - Error during parsing: Unknown directive '.'".
咋回事呢? health
被视为一个 zone ,解析器期望看到指令类似(cache
, etcd
, etc.),而不期望下个符号是 .
,这不是一个指令。Corefile 应该按照如下结构组织:
. {
whoami
health
}
那么health文档描述的那一行的意思其实是,一旦 health被配置了,它就是全局的,哪怕配置在一个server内。
Also See
CoreDNS还有好多插件 numerous other 。你也可以写自己的插件。
queries are processed 对CoreDNS如何处理DNS查询作了更深入的探讨。