• 基于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}
    '"$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.
  • 相关阅读:
    Redis学习之有序集合类型
    Redis学习之set类型总结
    Redis学习之List类型总结
    Redis学习之哈希类型总结
    Redis学习之字符串
    3、mysql学习之数据库定义语句
    2、mysql学习之创建用户与授权方法
    1、mysql学习之密码丢失恢复
    6、MongoDB学习之主从复制
    5、MongoDB学习之安全与认证
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/7541901.html
Copyright © 2020-2023  润新知