CoreDNS 手册(四)__配置

配置

在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插件,我们可以在语法内定义 VERSIONAUTHORS

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 手册(四)__配置_第1张图片
CoreDNS-Corefile.png

扩展插件

扩展插件就是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中定义它。

你可能感兴趣的:(CoreDNS 手册(四)__配置)