CoreDNS -- DNS服务与服务发现
DNS服务器
1. 架构 -- 微内核
- 几乎所有coreDNS功能都是由插件进行提供,每个服务对应一组插件链
2. 安装方式
- 二进制文件
- Docker
- 源码编译:添加自定义插件]
3. query
- step1/3 :如果某个query端口存在多个Servers则优先使用最长后缀匹配Servers,然后将请求路由到匹配成功的Server
- step2/3:依次执行server中定义的
plugin-chains
, 执行顺序依照plugin.cfg
- step3/3:每个插件都会审查query并决定是否处理这个query
4. Plugin 行为
- Query is Processed
- 插件链上某个插件正在处理查询,并生成一个响应返回给客户端,之后的插件不会被执行
- Query is Not Processed
- 当前插件决定不处理请求,则由插件链之后的插件处理,如果到最后都没有插件处理请求,则coreDNS返回
SERVFAIL
给客户端
- 当前插件决定不处理请求,则由插件链之后的插件处理,如果到最后都没有插件处理请求,则coreDNS返回
- Query is Processed With Fallthrough
- 当前插件正在处理请求,如果能够生成响应则直接返回响应,如果不能则希望后面的插件处理
fallthough
- 当前插件正在处理请求,如果能够生成响应则直接返回响应,如果不能则希望后面的插件处理
- Query is Processed With Hint
- 该插件总是调用下一个插件,但允许该插件查看写入的返回客户端的响应
5. 配置
-
Corefile
- 通过 -cnf 参数指定或默认当前工作目录下找该文件
- 文件中包含一个或多个servers块,一个server中包含一个或多个插件
- Servers中的插件顺序决定不了插件链的执行顺序,其执行顺序由 plugin.cfg决定
- 注释以 # 开头,到行尾都是注释部分
-
Environment Variables
-
{$ENV_VAR}
-- 通过花括号 + $
方式在配置文件中引用环境变量
-
-
Importing Other Files
-
import
可以在 Corefile文件中任意部分使用,主要配合重用片段(reused snippets)使用 --don't repeat yourself
原则的实现
-
(snip) {
errors
log
prometheus
}
# 通过 (name) 方式定义重用片段
.:53 {
whoami
import snip
}
- Server blocks
. {
# plugin list
}
# . 表示匹配所有zone
- Zone name or a list of zone names
- 通过 在 zone name 后面添加
<zone>:<port>
指定sever监听的端口,默认为53,可以通过bind指定绑定的网口
.:1054 {
bind lo
whoami
}
.:1054 {
bind eth0
whoami
}
# 因为绑定的网口不一样,所以相同端口相同不会有冲突
-
specifily a protocol
-
dns://
for plain DNS (the default if no scheme is specified) -
tls://
for DNS over TLS -
https://
for DNS over HTTPS -
grpc://
for DNS over gRPC
-
-
Example
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
}