CoreDNS 简单介绍

参考文献:
https://mp.weixin.qq.com/s/vU6jMvNo3loXLltXF6cWVw

1、CoreDNS 简介

CoreDNS作为CNCF中托管的一个域名发现的项目,原生集成Kubernetes,它的目标是成为云原生的DNS服务器和服务发现的参考解决方案。所以,CoreDNS走的也是Traefik的路子,降维打击SkyDNS。

从Kubernetes 1.12开始,CoreDNS就成了Kubernetes的默认DNS服务器,但 kubeadm默认安装CoreDNS的时间要更早。在Kuberentes 1.9版本中,使用 kubeadm方式安装的集群可以通过以下命令直接安装CoreDNS。

# kubeadm init --feature-gates=CoreDNS=true

下面,我们将详细解释CoreDNS的架构设计和基本用法。

从功能角度看,CoreDNS更像是一个通用的DNS方案,通过插件模式极大地扩展自身功能,从而适用于不同的场景
正如CoreDNS官方博客描述的那样:

CoreDNS is powered by plugins.

CoreDNS有以下3个特点。

  • 插件化(Plugins)。基于Caddy服务器框架,CoreDNS实现了一个插件链的架构,将大量应用端的逻辑抽象成插件的形式(例如,Kubernetes的DNS服务发现、Prometheus监控等)暴露给使用者。CoreDNS以预配置的方式将不同的插件串成一条链,按序执行插件链上的逻辑。在编译层面,用户选择需要的插件编译到最终的可执行文件中,使得运行效率更高。CoreDNS采用Go语音编写,所以从代码层面来看,每个插件其实都只实现了CoreDNS定义的接口的组件而已。第三方开发者只要按照CoreDNS Plugin API编写自定义插件,就可以很方便地集成到CoreDNS中。
  • 配置简单化。引入表达力更强的DSL,即Corefile形式的配置文件(也是基于Caddy框架开发的)。
  • 一体化的解决方案。区别于Kube-dns“三合一”的架构,CoreDNS编译出来就是一个单独的可执行文件,内置了缓存、后端存储管理和健康检查等功能,无须第三方组件辅助实现其他功能,从而使部署更方便,内存管理更安全。

2、Corefile 知多少

Corefile是CoreDNS的配置文件(源于Caddy框架的配置文件Caddyfile),它定义了:

  • DNS server以什么协议监听在哪个端口(可以同时定义多个server监听不同端口);
  • DNS负责哪个zone的权威(authoritative)DNS解析;
  • DNS server将加载哪些插件。

通常,一个典型的Corefile格式如下:

ZONE:[PORT] {
[PLUGIN] ...
}
• ZONE:定义DNS server负责的zone,PORT是可选项,默认为53;
• PLUGIN:定义DNS server要加载的插件,每个插件可以有多个参数。

例如:

{
chaos CoreDNS-001
}

上述配置文件表达的是:DNS server负责根域 . 的解析,其中插件是chaos且没有参数。

image

image

image

3、插件工作模式

当CoreDNS启动后,它将根据配置文件启动不同的DNS server,每个DNS server都拥有自己的插件链。当新来一个DNS请求时,它将依次经历以下3步逻辑:

image

CoreDNS 请求处理工作流

下面将以一个实际的 Corefile为例,详解CoreDNS处理DNS请求的工作流。
Corefile如下所示:


coredns.io:5300 {
file /etc/coredns/zones/coredns.io.db
}
example.io:53 {
errors
log
file /etc/coredns/zones/example.io.db
}
example.net:53 {
file /etc/coredns/zones/example.net.db
}
.:53 {
errors
log
health
rewrite name foo.example.com foo.default.svc.cluster.local
}

通过配置文件不难看出,我们定义了两个DNS server(尽管有4个配置块),分别监听5300和53端口。将以上Corefile翻译成处理逻辑图:

image

image

4、总结

无论是Kube-dns还是CoreDNS,基本原理都是利用watch Kubernetes的Service和Pod,生成DNS记录,然后通过重新配置Kubelet的DNS选项让新启动的Pod使用Kube-dns或CoreDNS提供的Kubernetes集群内域名解析服务

5. CoreDNS 提供的插件

如,k8s插件地址:https://github.com/coredns/coredns/tree/master/plugin/kubernetes

下面的文献里,有使用指南
http://ju.outofmemory.cn/entry/363914