波神

导航

基于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 后面紧跟:
  1. 没有参数,如果服务器证书由系统安装的CA签名,并且不需要客户端证书
  2. 一个参数是CA PEM文件,如果服务器证书没有被系统CA签名,并且不需要客户端证书
  3. 两个参数 - 认证PEM文件的路径,私钥PEM文件的路径 - 如果服务器证书由系统安装的CA签名并需要客户端证书
  4. 三个参数 - 认证PEM文件的路径,客户端私钥PEM文件的路径,CA PEM文件的路径 - 如果服务器证书未被系统安装的CA签名,并且需要客户端证书

 

举例:有一个tomcat的访问地址:http://172.16.80.175:8080/

现在我们为该地址动态增加域名:coredns.dynamic.com.test

 

假如etcd插件定义为:
    etcd {
        stubzones
        path /skydns
        endpoint http://172.16.71.200:2379
        upstream /etc/resolv.conf
    }

 

那么我们只需要向etcd中添加一条如下的记录:
curl -XPUT http://172.16.71.200:2379/v2/keys/skydns/test/com/dynamic/coredns -d value='{"host":"172.16.80.175","port":8080}'
 
注意:test/com/dynamic/coredns的顺序和coredns.dynamic.com.test是相反的。
添加了这样一条记录之后,我们就可以用coredns.dynamic.com.test:8080来访问刚才的tomcat了
 
 
假如etcd插件定义为:
    etcd com.test{
        stubzones
        path /skydns
        endpoint http://172.16.71.200:2379
        upstream /etc/resolv.conf
    }

 

那么必须是/test/com/*/*的域名才能访问。
curl -XPUT http://172.16.71.200:2379/v2/keys/skydns/test/com/dynamic/coredns -d value='{"host":"172.16.80.175","port":8080}'

反向域名解析:

支持反向区域。 您需要使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.

 

 

posted on 2017-09-18 10:39  波神  阅读(10502)  评论(1编辑  收藏  举报