基于etcd插件的CoreDNS动态域名添加
前提条件:已经有一个可用的etcd环境。
一、CoreDNS简介
CoreDNS是一个DNS服务器,和Caddy Server具有相同的模型:它链接插件。CoreDNS是云本土计算基金会启动阶段项目。
CoreDNS是SkyDNS的继任者。 SkyDNS是一个薄层,暴露了DNS中的etcd中的服务。 CoreDNS建立在这个想法上,是一个通用的DNS服务器,可以与多个后端(etcd,kubernetes等)进行通信。
CoreDNS旨在成为一个快速灵活的DNS服务器。 这里的关键灵活指的是:使用CoreDNS,您可以使用DNS数据进行所需的操作。 还可以自已写插件来实现DNS的功能。
CoreDNS可以通过UDP / TCP(旧式的DNS),TLS(RFC 7858)和gRPC(不是标准)监听DNS请求。
CoreDNS目前支持的行为,括号里面的英文表示插件:
- 从文件提供区域数据; 支持DNSSEC(仅限NSEC)和DNS(file)。
- 从主机检索区域数据,即充当辅助服务器(仅限AXFR)(secondary)。
- 快速签署区域数据(dnssec)
- 响应负载均衡(loadbalance)
- 允许区域传输,即充当主服务器(file)
- 从磁盘自动加载区域文件(auto)
- 缓存(cache)
- 对endpoint的健康检查(health)
- 使用ETCD作为后端,即SkyDNS(ETCD)的101.5%替换(etcd)
- 使用k8s(kubernetes)作为后端(kubernetes)
- 作为一个代理转发查询到一些其他(递归)域名服务器(proxy)
- 提供指标(使用Prometheus)(metrics)
- 提供查询(log)和错误(errors)日志记录
- 支持CH类:version.bind和friends(chaos)
- 分析支持(pprof)
- 重写查询(qtype,qclass和qname)(rewrite)
- 回传所使用的IP地址,传输和端口号(whoami)
二、CoreDNS的安装
1、下载CoreDNS二进制安装文件
从CoreDNS官网上下载最新发布版本(https://github.com/coredns/coredns/releases/)
这里下载 coredns_011_linux_x86_64.tgz
下载后解压到/etc/coredns目录下,同时在本目录下添加一个Corefile文件,Corefile是CoreDNS工作的核心,Corefile里面引用了一系列的插件来支持CoreDNS的工作。具体Corefile的原理可参照(https://coredns.io/2017/07/23/corefile-explained/)
以下是一个引用了etcd插件的Corefile
.:53 { etcd { stubzones path /skydns endpoint http://172.16.71.200:2379 upstream /etc/resolv.conf } log stdout errors stdout proxy . /etc/resolv.conf }
说明coredns工作于53端口,使用了etcd,log,errors,proxy插件
我们将编写好的Corefile也放在/etc/coredns目录底下。
新建管理脚本:/etc/init.d/coredns-manage
#!/bin/bash now=$(date +%Y%m%d) cmd='/etc/coredns/coredns -conf /etc/coredns/Corefile' start(){ exec $cmd & } stop(){ ps -ef | grep "/etc/coredns/coredns" | grep -v "grep" |awk '{print $2}'| while read pid do C_PID=$(ps --no-heading $pid | wc -l) echo "当前PID=$pid" if [[ $C_PID == "1" ]]; then echo "PID=$pid 准备结束" kill -9 $pid echo "PID=$pid 已经结束" else echo "PID=$pid 不存在" fi done } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) printf 'Usage: %s {start|stop|restart}\n'"$prog" exit 1 ;; esac
启动coredns:
/etc/init.d/coredns-manage start
2017/09/21 15:58:07 [INFO] CoreDNS-011 2017/09/21 15:58:07 [INFO] linux/amd64, go1.9, 1b60688d CoreDNS-011 linux/amd64, go1.9, 1b60688d
停止coredns:
/etc/init.d/coredns-manage stop
三、基于etcd插件的动态域名增加案例
etcd中的数据必须被编码为像SkyDNS这样的消息。 它也应该像SkyDNS一样工作。etcd插件广泛使用proxy插件来转发和查询网络中的其他服务器。
插件格式声明如下:
etcd [ZONES...] {
stubzones
fallthrough
path PATH
endpoint ENDPOINT...
upstream ADDRESS...
tls CERT KEY CACERT
}
- ZONES :经过授权的区域,可以为空
- stubzones:启用存根区域功能。 stubzone仅在位于指定的第一个区域下方的etcd树中完成。
- fallthrough:如果区域匹配但不能生成记录,则将请求传递给下一个插件
- path:etcd里面的路径 默认为“/ skydns”,以后所有的dns记录就是存储在该存根路径底下
- endpoint:etcd访问地址,默认http://localhost:2397
- upstream:要使用的上游解析程序解决指向外部域名的在etcd(认为CNAME)中找到的外部域名。 如果您希望CoreDNS作为客户端的代理,您需要添加代理插件。 ADDRESS可以是一个IP地址,IP:端口或一个字符串,指向一个被构造为/etc/resolv.conf的文件。
- tls 后面紧跟:
- 没有参数,如果服务器证书由系统安装的CA签名,并且不需要客户端证书
- 一个参数是CA PEM文件,如果服务器证书没有被系统CA签名,并且不需要客户端证书
- 两个参数 - 认证PEM文件的路径,私钥PEM文件的路径 - 如果服务器证书由系统安装的CA签名并需要客户端证书
- 三个参数 - 认证PEM文件的路径,客户端私钥PEM文件的路径,CA PEM文件的路径 - 如果服务器证书未被系统安装的CA签名,并且需要客户端证书
etcd { stubzones path /skydns endpoint http://172.16.71.200:2379 upstream /etc/resolv.conf }
etcd com.test{ stubzones path /skydns endpoint http://172.16.71.200:2379 upstream /etc/resolv.conf }
反向域名解析:
支持反向区域。 您需要使CoreDNS了解您的权威性相反的事实。 例如,如果要添加172.0.0.0/24的反向,则需要将zone 0.0.172.in-addr.arpa添加到区域列表中。如果需要添加172.16.80.0/8的反向,则需要将zone 172.in-addr.arpai添加到区域列表中;
下面我们需要将172.16.80.175指向hzb.test.com,Corefile应该进行如下配置:
.:53 { etcd test.com 172.in-addr.arpa { stubzones path /skydns endpoint http://172.16.71.200:2379 upstream /etc/resolv.conf } log stdout errors stdout proxy . /etc/resolv.conf }
还需要向etcd中增加一条如下的记录:
curl -XPUT http://172.16.71.200:2379/v2/keys/skydns/arpa/in-addr/172/16/80/175 -d value='{"host":"hzb.test.com"}'
用dig命令进行查询测试:
root@ceph01:~/mir2_data/dev/2017/9# dig @localhost -x 172.16.80.175 +short hzb.test.com.