まず、CoreDNSを入手します。以下のいずれかの方法で入手してください。
-
最新リリースをGitHubからダウンロードし、解凍します。これで「coredns」実行ファイルが作成されます。
-
gitからコンパイルするには、GitHubからソースコードを入手します。ディレクトリを
coredns
に変更し、go get
- いくつかの依存関係を取得します。その他の依存関係はvendoredされています。go build
これで「coredns」実行ファイルが作成されます。
-
Dockerイメージをdocker hubから入手します。
KubernetesでCoreDNSを使用する場合は、kubernetesプラグインを使用したSDに関するこの記事を確認してください。
このクイックスタートの残りの部分では、2つの異なるユースケースに焦点を当てます。
- 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プラグインを有効にしましょう。 Corefileに単語「cache」を追加し、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が指定されると、1つのサーバーに対してのみ指定した場合でも、CoreDNSプロセス全体に対してグローバルであることを意味します。
こちらもご覧ください
CoreDNSで使用できる多数のその他のプラグインがあります。また、独自のプラグインを作成することもできます。
クエリがどのように処理されるかは、CoreDNSがDNSクエリを処理する方法の詳細な説明です。