配置
在CoreDNS有及部分可以配置。
首先,确定哪些插件被编译进CoreDNS。我们提供的编译后的二进制可执行包 (binaries)已经包含了所有的插件,列在plugin.cfg
。增加和删除都很 easy,但是需要对CoreDNS重新编译。
大多数用户使用文件 Corefile 来配置 CoreDNS。当 CoreDNS 启动的时候,如果 -conf
flag 没有被配置,就会在当前目录查找 Corefile
文件。
文件包含了一个或者多个服务器块 (Server Blocks)。每个服务器块列出了一个或多个插件。那些插件也可以在后面使用指令配置。
在Corefile 文件中,插件的顺序不决定插件链的顺序。 插件执行的顺序,配置在文件plugin.cfg
中。
Corefile 文件的备注以 #
开头。行的其他部分会被识别为备注。
环境变量
CoreDNS 在配置中支持环境变量。
环境变量可以被使用在任何地方。语法是 {$ENV_VAR}
( Windows-类型的语法{%ENV_VAR%}
也是支持的)。CoreDNS 会在解析Corefile的时候替换这些变量内容。
导入其他文件
参考 import plugin。
这个插件有些特殊,可以被用在Corefile的任何地方。
可复用的 Snippets
一个很特殊的可导入文件是 snippet。一个 snippet 通过命名一个块(block)的特殊语法来定义。名字需要被放到圆括号内: (name)
。然后,它就可以随着导入插件放置到配置文件的任何地方了。
# define a snippet
(snip) {
prometheus
log
errors
}
. {
whoami
import snip
}
服务器块 Server Blocks
每个服务器块(Server Block)以server应该伺候的zones开头。在zone名字或者zone列表名(以空格分隔)之后,一个服务器块以大括号作为开头和结束。
如下的服务器块定义了一个 server,负责root zone: .
下所有的zones; 基本上,这个 server 应该处理所有的查询:
. {
# Plugins defined here.
}
服务器块(Server blocks)还可以指定监听端口。默认端口是 53 (DNS 服务标准端口)。指定端口,以冒号作为分隔符在zone后列出端口号。
如下的 Corefile 指示 CoreDNS 创建一个 Server , 监控端口 1053:
.:1053 {
# Plugins defined here.
}
注意: 如果你明确的定义了监听端口,你就不可以使用
-dns.port
参数覆盖了。
给服务器块定义一个zone,但是这个zone已经被配置到一台服务器上,并且已经运行了,运行在同一个端口。Corefile 会在启动的时候报错:
.:1054 {
}
.:1054 {
}
变更第二个端口为 1055 可以让这两个服务器块变成两个不同的服务器。
规定协议
当前 CoreDNS 接受4种协议: DNS, DNS over TLS (DoT), DNS over HTTP/2 (DoH)
and DNS over gRPC。可以通过在服务器配置文件,在zone 前加个前缀来指定服务器接收哪种协议。
-
dns://
for plain DNS (the default if no scheme is specified). -
tls://
for DNS over TLS, see RFC 7858. -
https://
for DNS over HTTPS, see RFC 8484. -
grpc://
for DNS over gRPC.
插件
每个服务器块都定义了一系列插件。最简单的方式,就是在服务器块内添加插件的名字:
. {
chaos
}
插件 chaos 让 CoreDNS 以 CH class 应答查询 - 在确认服务器的时候很有用。通过如上配置,CoreDNS 会在收到请求后,应答它的版本:
$ dig @localhost -p 1053 CH version.bind TXT
...
;; ANSWER SECTION:
version.bind. 0 CH TXT "CoreDNS-1.0.5"
...
大多数插件允许以指令提供更多配置。比如 chaos插件,我们可以在语法内定义 VERSION
和AUTHORS
:
Syntax
chaos [VERSION] [AUTHORS...]
- VERSION 返回版本。 默认
CoreDNS-
,如果没设置的话。- AUTHORS 返回作者。默认定义在 OWNER 文件内。
这样,这就给 chaos 插件增加了指令,让 CoreDNS 以CoreDNS-001
的格式答复版本:
. {
chaos CoreDNS-001 [email protected]
}
其他插件有更多配置,使用插件块(Plugin Block),跟服务器块一样,以大括号作为开头和结束:
. {
plugin {
# Plugin Block
}
}
我们将其全部融合起来,就生成下面的 Corefile,设置 4 zones 运行与2个不同的端口:
coredns.io:5300 {
file db.coredns.io
}
example.io:53 {
log
errors
file db.example.io
}
example.net:53 {
file db.example.net
}
.:53 {
kubernetes
forward . 8.8.8.8
log
errors
cache
}
当CoreDNS解析配置文件的时候,就会是如下的 Setups:
扩展插件
扩展插件就是CoreDNS默认没有包含的插件。你可以开启扩展插件,但是你得自己编译CoreDNS。
可能的报错
插件 health 的文档声明 "This plugin only needs to be enabled once",这可能导致你认为如下是一个符合规定的Corefile:
health
. {
whoami
}
但是,这不能工作,并且导致一些 简短的报错:
"Corefile:3 - Error during parsing: Unknown directive '.'".
为什么呢? health
被看作一个 zone (and the start of a Server Block)。解析希望看到插件名字 (cache
, etcd
, etc.),但是下一个标识是 .
,这不是插件。
正确的 Corefile 如下:
. {
whoami
health
}
插件 health 文档里面的那段话,意思是一旦 health 被定义,它对整个CoreDNS 进程来说就是全局的,哪怕你是在一个server中定义它。