[ #k8s ][ #DNS ] CoreDNS 1.0.1を触ってみた。

2017-12-17 10:21:59AIX、UNIX、Linux, Containerarm, arm64, container, CoreDNS, DNS, docker, github, ipv6, k8s, kubernetes, linux, 設定

Kubernetes(k8s)、触ってます? 私はベアメタル全盛の現場にいるので触ったことすらありません。昔ちょろっとDockerとかやったぐらいで、Container管理とかは全くです。

しかし、実はqiitaを覗いていたところDNSのコンポーネントであるCoreDNSというのを知って、少し興味が出たので触ってみました。

情報について

k8sに含まれた的な記事は上記のリンクから。
で、qiitaで確認した記事は下記のリンクから。

使用方法についてはqiitaの記事でも多く書かれているのですが、自分なりに書いておこうと思います。

Webサイトはこちら。ダウンロードやら、ドキュメントやら、後述するプラグインのことなんかも書いてあります。

インストール手順

まずはインストールから。ソースファイルなどはGitHubから。

ありがたいことに、ソースファイル以外にもバイナリ自体も配布されています。しかも対応アーキテクチャとしてx86だけでなく、Aarch64や、PowerPC、Power、Windowsとかのバイナリも配布されています。個人的にARMは多用しているのでありがたいですね。

バイナリを使用するときは、そのバイナリに対してPATHを通してあげるだけです。

$ coredns --version CoreDNS-1.0.1 linux/arm64, go1.9.2, 99e163c3

お手軽ですね。

起動仕方は以下の通り。基本的には以下の構文でいけるかなと。

$ coredns -conf=/etc/coredns/corefile -dns.port 53 -pidfile=/var/run/corefile.pid

設定について

で、設定ファイルの扱いになるCorefileについては以下のような記述方式になると思います。

$ cat /etc/coredns/corefile .:53 { errors log . { class denial } health cache whoami root /etc/coredns proxy . 9.9.9.10:53 { protocol dns } }

CoreDNSの前身となるSkyDNSの記述方式であるCaddyとかいう方式らしいです。

引用:Corefile Explained

The Corefile is parsed like a Caddyfile. We support everything that is described on that page, for instance the use of environment variables.

とりあえずざっくりとした解説になります。詳細については公式ドキュメントを参照してください。

POINT

  • .:53 { :この場合は、ルートゾーンとそれ以下のすべてに対して権限を持つサーバーを定義します。待ち受けるポート番号は53ですね。
  • errors :参照中のエラーについて標準出力する
  • log . { class denial } :すべての要求に対して共通ログ形式でstdoutにクエリログエントリが書き込まれます。幾つかオプションが存在しますが、denialはNXDOMAINまたはNODATAのいずれかのとき出力するようになります。
  • healthCoreDNS自体の死活監視ですね。
  • cache :書いて字のごとく。問い合わせ自体をキャッシュできるようになります。キャッシュ期間も制御できるようになるほか、その時のデータをメトリクスとして取得できるようにもなります。
  • whoamiCoreDNSが起動時にCorefileを見つけることができない場合、ロードされるデフォルトのプラグインです。
  • root  :zoneファイルなんかを置いてあるディレクトリ位置を指定します。
  • proxy . 9.9.9.10:53 { protocol dns }DNSリバースプロキシとロードバランサ機能を提供する。コレの面白いところは、使用できるプロトコルがdns以外にもgRPCdns.google.comに対してhttpsでアクセスするhttps_googleナンていうのもあります。

という感じになるでしょうか。

他にもDNSSECを有効にしたりするプラグインや、dnstapを使用するためのプラグイン、hostsファイルを参照するようにするプラグイン、BIND形式のzoneファイルを読み込むようにも出来たりします。

そういう意味では、内向けのDNSサーバとしてはサクッと作れて便利なんじゃないでしょうか。

用意されているプラグイン

現在用意されているプラグインはこちらから確認することが出来ます。

通常のプラグインとしては同梱されていないですが、PowerDNSのSQLを使用してバックエンドを利用するためのプラグインがあったり、デフォルトで用意されているProxyプラグインではなく、forwardするためのプラグインもあったりします。

感想

UnboundやPowerDNSなんかも便利ですが、必要最低限の機能で良い場合なんかはいいかもしれませんね。

あとロードバランサー的なことが出来たりするので、dnsdistの代わりでもいいかもしれません(CoreDNSはクエリを細かく制御は今のところ出来ないようですが)。配分ポリシーもラウンドロビン方式しか無いようなので、このあたりも実装次第なのかなぁと。

あと、IPv6についてもForwardプラグインなどは記事時点では対応しているようですが、本体自体の正式な対応は「K8s v1.9 (GA on 12/23/2017).」なのかな。

ちなみに自分は、他のDNSツールとパフォーマンスなどは比較してはいません。そのうちdnsperfとかresperfとかで確認ぐらいはしてみようかと思いますが。

k8sとしてのコンポーネントとして使用するだけでなく、リゾルバーぐらいの機能だけを使用したいなら、十分な選択肢になると思います。

間違い等ありましたらご指摘ください。

2017-12-17 10:21:59AIX、UNIX、Linux, Containerarm, arm64, container, CoreDNS, DNS, docker, github, ipv6, k8s, kubernetes, linux, 設定