前提條件:已經有一個可用的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.