探索CoreDNS:插件机制与实用配置

521 阅读4分钟

概述

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 
}

那么它的查询处理流程如下图:

查询流程.jpg

通过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

coredns.io/

Plugins

coredns.io/plugins/

How Queries Are Processed in CoreDNS

coredns.io/2017/06/08/…