この記事はdodosoft Advent Calendar 2016 20日目。

今回はインフラ周りの内容、DNS Service Discoveryを使ってEtcd Clusterを構築した話にします。

Why?

最近Docker周りにハマっていたのですが、自分が仕事でやってるようなEnterpriseな環境で 使い物にするためには、Cluster等の構築が必須になります。なので、まず初めにDocker Swarmや Kuberunetesを使える環境を作るわけですが、そのためのEtcdの設定をする必要があります。 ただ、2,3台のベアメタルサーバ程度の設定なら1台づつ設定ファイルを書いていけば問題ないのですが、 数十台とかのレベルになるととてもそんな面倒なことはできません。

なので、OSのインストールからEtcdの設定までをできる限り自動化することを目指しました。

Let’s configure Etcd cluster!

## Etcd EtcdとはCoreOS社が開発している、 オープンソースの分散Key-Value Storeです。Docker SwarmやKuberunetesのクラスタではこの Etcdを使って設定項目を共有しています。

このEtcdでClusterを構築するために、Clusterのメンバーを取得する必要があるのですが、その Discovery方法には3つの方法があります。

  • Static
  • etcd Discovery
  • DNS Discovery

詳細に関してはコチラを参考に してください。

今回はこの中でDNS Discoveryを利用します。DNS DiscoveryはDNSのService Record (SRV Record)という仕組みを使ってClusterメンバーのDiscoveryを行います。

DNS Service Record

DNS Service RecordはDomain Nameに対して、_<ServiceName>._<tcp or udp>.domainというレコードを 追加でき、そのドメインのサーバがどんなサービスをどのポート番号で提供しているかを表せるものです。

_http._tcp.example.jp.   IN  SRV 1   0   80  server01.example.jp.
_http._tcp.example.jp.   IN  SRV 2   0   80  server02.example.jp.

server01.example.jp.    IN  A   192.168.20.31
server02.example.jp.    IN  A   192.168.20.32

上のサンプルでは、server01.example.jp及びserver02.example.jp80番ポートで HTTPサービスを提供していることを表しています。Etcdは、--discovery-srvで指定したZoneから _etcd-server._tcpで指定されたホストを検索し、そのホスト間でClusterを構築します。

_etcd-server._tcp.example.com. 300 IN  SRV  0 0 2380 host01.example.com.
_etcd-server._tcp.example.com. 300 IN  SRV  0 0 2380 host02.example.com.
_etcd-server._tcp.example.com. 300 IN  SRV  0 0 2380 host03.example.com.

このように、DNSサーバに対してRecordを追加していき、各サーバに対してはCloud-initを使ってEtcd Serviceの登録、 --discovery-srvオプションの追加をしてやることで、簡単にノードを増やすことができるようになりました。

(相当ぶっ飛ばしましたが、Cloud-initでの設定方法などはコチラ を参考にしてください。)

DNS Update

ここまででもノード管理がかなり簡単になりましたが、ノードが増えるたびにレコードを追加していくことや、 ノードとIPアドレスの対応は手動で管理する必要がでてきます。

そこで、DHCPとDNSを連携させるDNS Updateの仕組みを使います。 DNS UpdateはRFC2136でも規定されている、動的にDNSの Zoneファイルを変更させる仕組みです。

詳細については省きますが、DHCPと組み合わせることで、DHCP Lease 発行 にあわせてそのIPに対するFQDNをZoneファイルに自動で追加することができます。

これによって、さらにEtcdノードの管理が簡略化できました。

Summary

かなり省略して書きましたが、ここまでやった感想としてDNS, DHCP周りはやれることってたくさんあるんだなと 感じました。ただ現在デファクトのDHCPD, BINDでやりましたが、 これらの設定は結局設定ファイルの書き換えなので、 Software Definedな世界にはまだまだだなという印象でした。

最近では、DHCPだとKeaというものが出てきたりしてます。KeaにはAPIがついていたり、 拡張用のSDKがついている、BackendにMySQLやPostgreSQLといったDBMSが使えるなど、可能性は広がっています。

Software Defined Infrastructureな世界になってくると、意外とこういった機能をプログラマブルにする必要 も出てきたりするので、引き続き動向は追いかけておきたいですね。