概述
CoreDNS是什么?
CoreDNS 是一种灵活、高效的DNS服务器,用于服务发现和名称解析。它可以通过插件扩展功能,支持负载均衡、缓存、监控等。常用于Kubernetes集群中进行DNS管理。
特点
- 插件:通过插件链来实现功能,每个插件执行一个DNS功能。
- 快速且灵活:由于插件的支持,它也非常灵活。你可以只编译你所需要的插件来构建 CoreDNS。
- 简单性:保持尽可能简单的设计,并提供合理的默认配置。
常用插件
- Rewrite 插件:允许修改 DNS 查询请求或响应,适用于特定场景的请求重写需求。
- Etcd 插件:通过与 etcd 集成,提供基于键值存储的名称解析功能,适用于动态服务发现。
- Reload插件:用于在 CoreDNS 的配置文件 Corefile 发生变化时,自动重新加载配置。
- Loadbalance插件:用于在多条 DNS 记录之间实现负载均衡。
- Forward 插件:将查询请求转发到上游的 DNS 服务器,用于递归查询。
- Hosts 插件:从 hosts 文件中读取域名信息,提供静态域名解析。
- File 插件:支持从区域文件(zone file)中读取 DNS 记录,提供传统的 DNS 服务。
插件基本语法
Rewrite插件
rewrite [continue|stop] FIELD [TYPE] [(FROM TO)|TTL] [OPTIONS]
- FIELD:指定请求/响应中要被重写的部分。
- name - 请求中的查询名称将被重写;默认情况下,这是名称的完全匹配,例如 rewrite name example.net example.org。
- FROM 是要匹配的名称(精确匹配、后缀、前缀、子字符串或正则表达式)或类型。
- TO 是要重写为的目标名称或类型。
- OPTIONS对于 name 字段,可以使用进一步的选项来控制响应重写。所有名称匹配类型都支持以下选项:
- answer auto - 响应中的名称将在最大努力的情况下被重写。
Etcd插件
etcd [ZONES...] {
fallthrough [ZONES...]
path PATH
endpoint ENDPOINT...
credentials USERNAME PASSWORD
tls CERT KEY CACERT
}
- fallthrough 是用于处理某些特殊情况
- path 是 etcd 内的路径,默认值为 “/skydns”。
- endpoint 是 etcd 的端点,默认值为 “http://localhost:2379”
- credentials 用于设置访问 etcd 集群的用户名和密码。
- tls 是证书相关设置
Reload插件
reload [INTERVAL] [JITTER]
-
插件将每隔一定的时间间隔(INTERVAL)检查一次变化,并受到±抖动时间(JITTER)影响。
-
INTERVAL 和 JITTER 是 Golang 的时间持续时间格式。默认的 INTERVAL 是 30 秒,默认的 JITTER 是 15 秒。INTERVAL 的最小值为 2 秒,JITTER 的最小值为 1 秒。如果 JITTER 超过了 INTERVAL 的一半,它将被设置为 INTERVAL 的一半。
Loadbalance插件
loadbalance [round_robin | weighted WEIGHTFILE] {
reload DURATION
}
-
round_robin 策略对 A、AAAA 和 MX 记录的顺序进行随机化,应用均匀概率分布。这是默认的负载均衡策略。
-
weighted 策略为 IP 分配权重值,以控制特定 IP 被返回为响应中的第一个(最顶端的)A/AAAA 记录的相对可能性。
-
WEIGHTFILE 是包含为各种域名的 IP 分配权重值的文件。
-
DURATION 是重新加载 WEIGHTFILE 并更新权重分配的时间间隔,如果文件有变化。默认值为 30 秒。
Forward插件
forward FROM TO...
- FROM 是用于匹配请求的基本域名,满足条件的请求将被转发。使用 CIDR 表示法的域名可能会扩展为多个反向区域,但这种情况并未完全支持;只使用第一个扩展的区域。
- TO... 是要转发到的目标端点。TO 语法允许你指定协议,例如 tls://9.9.9.9 或 dns://(或不指定协议,以表示普通的 DNS)。上游服务器的数量限制为 15 个。
简单应用
Corefile配置如下
domain.cluster-7194.hangzhou.domaintest.com domain.hangzhou.domaintest.com domain.domaintest.com {
rewrite name regex (.+).domain.cluster-7194.hangzhou.domaintest.com domain.cluster-7194.hangzhou.domaintest.com answer auto
rewrite name regex (.+).domain.hangzhou.domaintest.com domain.cluster-7194.hangzhou.domaintest.com answer auto
rewrite name regex domain.hangzhou.domaintest.com domain.cluster-7194.hangzhou.domaintest.com answer auto
rewrite name domain.domaintest.com domain.cluster-7194.hangzhou.domaintest.com
etcd {
path /coredns
endpoint 127.0.0.1:2379
}
reload
loadbalance weighted /etc/coredns/weight {
reload 10s
}
}
. {
forward . 8.8.8.8 114.114.114.114
}
那么它的查询处理流程如下图:
通过dig工具的查询结果如下:
; <<>> DiG 9.16.23 <<>> @127.0.0.1 -p 53 bkt9.domain.cluster2371.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40594
;; flags: qr aa rd; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 798ccc2e5526c71c (echoed)
;; QUESTION SECTION:
;bkt9.domain.cluster2371.com. IN A
;; ANSWER SECTION:
bkt9.domain.cluster2371.com. 30 IN CNAME domain.hangzhou.cluster2371.com.
domain.hangzhou.cluster2371.com. 30 IN A 172.161.20.20
domain.hangzhou.cluster2371.com. 30 IN A 172.161.20.21
domain.hangzhou.cluster2371.com. 30 IN A 172.161.20.22
;; Query time: 4 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Sep 02 10:31:53 CST 2024
;; MSG SIZE rcvd: 269
参考文献
CoreDNS: DNS and Service Discovery
Plugins
How Queries Are Processed in CoreDNS