基於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.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM