首先取得 CoreDNS,可以透過以下方式:
-
從 GitHub 下載最新的 版本,並解壓縮。您現在應該會有一個 “coredns” 可執行檔。
-
從 git 編譯,從 GitHub 取得原始碼。將目錄變更為
coredns
並執行:go get
- 取得一些相依性,其他的已加入 vendor 中go build
您現在應該會有一個 “coredns” 可執行檔。
-
從 Docker Hub 取得 Docker 映像檔。
如果您想在 Kubernetes 中使用 CoreDNS,請查看 這篇關於使用 kuberneters 外掛程式進行 SD 的文章。
此快速入門的其餘部分將重點放在兩個不同的使用案例:
- 使用 CoreDNS 提供區域檔案。也可以選擇簽署區域。
- 使用 CoreDNS 作為轉發代理。
CoreDNS 是透過一個通常稱為 Corefile 的設定檔進行設定的。
從檔案提供
從區域檔案提供時,您會使用 file 外掛程式。我們先從區域 example.org.
以及我們想要從中提供的區域檔案開始。
建立一個名為 example.org
的檔案,內容如下:
$ORIGIN example.org.
@ 3600 IN SOA sns.dns.icann.org. noc.dns.icann.org. (
2017042745 ; serial
7200 ; refresh (2 hours)
3600 ; retry (1 hour)
1209600 ; expire (2 weeks)
3600 ; minimum (1 hour)
)
3600 IN NS a.iana-servers.net.
3600 IN NS b.iana-servers.net.
www IN A 127.0.0.1
IN AAAA ::1
建立一個 Corefile,名為 Corefile
,內容如下:
example.org {
file example.org
prometheus # enable metrics
errors # show errors
log # enable query logs
}
在非標準埠啟動 CoreDNS 以檢查是否一切正常:coredns -conf Corefile -dns.port 1053
,並使用 dig 發送查詢。
% dig -p 1053 @localhost AAAA www.example.org +noall +answer
www.example.org. 3600 IN AAAA ::1
由於我們使用 log 外掛程式 啟用了查詢記錄,因此查詢也應該會顯示在標準輸出中。
::1 - [24/Jul/2017:10:10:44 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 121 133.449µs
從這裡您可以啟用 CoreDNS 在 53 埠上執行,並讓它從 systemd (在 Linux 上) 啟動,請參閱 部署儲存庫 中的範例腳本。閱讀更多關於 file、metrics 和 errors 外掛程式的資訊。
CoreDNS 作為代理
另一個外掛程式是 proxy 外掛程式。例如,我們可以透過 HTTPS 將 DNS 請求發送到 Google。建立一個 Corefile,內容如下:
. {
proxy . 8.8.8.8:53 {
protocol https_google
}
prometheus
errors
log
}
啟動 CoreDNS,就像上面一樣,並向它發送一些查詢。CoreDNS 應該會記錄這些查詢,在此例中:
::1 - [24/Jul/2017:10:44:15 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 83.396955ms
::1 - [24/Jul/2017:10:44:17 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 14.030914ms
::1 - [24/Jul/2017:10:44:19 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 13.286384ms
如果您查看每個查詢所花費的時間 (以 “ms” 為單位),會發現速度相當慢,約為 ~83ms 和 13ms。因此,讓我們新增一些快取,並啟用 caching 外掛程式。只需將 “cache” 這個詞加入 Corefile 並優雅地重新載入 CoreDNS:kill -SIGUSR1 <pid_of_coredns>
。再次查詢。
::1 - [24/Jul/2017:11:33:54 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 76 43.469743ms
::1 - [24/Jul/2017:11:33:55 +0000] "AAAA IN www.example.org. udp 45 false 4096" NOERROR 73 133.073µs
第一個查詢仍然「慢」,但後續的查詢只需要 133 µs。
可能的錯誤
health 的文件指出「此外掛程式只需啟用一次」,這可能會讓您認為以下是一個有效的 Corefile:
health
. {
whoami
}
但這行不通,並導致一些難以理解的錯誤:
"Corefile:3 - Error during parsing: Unknown directive '.'".
這裡發生了什麼?health
被視為區域,現在解析器預期看到指令 (cache
、etcd
等),但下一個權杖是 .
,而不是指令。Corefile 應該如下建構:
. {
whoami
health
}
health 的文件中那句話的意思是,一旦指定了 health,它對於整個 CoreDNS 過程都是全域的,即使您只為一個伺服器指定了它。
另請參閱
還有 許多其他 外掛程式可以與 CoreDNS 一起使用。您也可以編寫 自己的 外掛程式。
如何處理查詢 是深入探討 CoreDNS 如何處理 DNS 查詢的內容。