コンテナ/クラウド環境におけるSerfを使った構成管理



 クラウドやコンテナ技術の進歩により、近年では動的にサービスを構成するホストを増減させるような構成を容易に取れるようになっている。このような構成の際に問題となるのが、動的に増えたホストをどうやってサービスに組み込むか、という点だ。今回はこういった問題を解決するために有用なツール「Serf」を紹介する。

管理するサーバーが増えると管理の手間も増える

 複数台のサーバーを組み合わせてサービスを運用することは昔から行われていたが、かつてはサーバーの導入は大仕事であり、運用中のサービスにおいてサーバーを増やしたり、逆に減らしたりする、といったことは頻繁には行われないものだった。しかし、近年ではクラウドやVPSなど、低コストで迅速にサーバーの追加/削除を行えるサービスが増えており、それに伴ってサービスの運用途中に動的に構成サーバーの数を変動させることも珍しくなくなっている。

 このように構成サーバーが頻繁に変更される環境では、サーバーの管理や設定変更が大きな手間となる。たとえばIPアドレスの管理1つを取っても、クラウドやVPSでは異なるサブネットのIPアドレスがサーバー毎にランダムに割り振られるケースが多く、管理者側でそれらをきっちりと把握しなければならない。そのため、実運用環境ではZabbixなどの管理・監視ツールを利用して管理するケースが多かった。

 ただ、用途によっては管理・監視ツールを使うのは大がかりすぎる、という場合もある。たとえば単純にクラスタ内に存在するホストの一覧を取得したい、もしくはホストの追加/削除を検知したい、といった場合、多くの管理・監視ツールが備えているリソースやサービスの監視機能は不要だ。また、こういった管理・監視ツールの多くは中央集権型の構造を取っており、利用するには監視用のサーバーを用意する手間が必要だ。

 今回紹介する「Serf」は、特にサービスやリソースの監視は不要だがクラスタ内のホストのディスカバリは行いたい、もしくはクラスタにホストが追加されたり、削除されたことを検出してなにか処理を行いたい、といった目的に適した分散型のサーバー管理・監視ツールだ(図1)。

図1 SerfのWebサイト
図1 SerfのWebサイト

シンプルで導入コストが低い「Serf」

 Serfは分散型のアーキテクチャを持ち、中央サーバーが不要なのが最大の特徴である。バイナリファイルを1つインストールするだけで利用でき、導入の手間も少ない。

 Serfが提供する機能を簡単にまとめると、以下のようになる。

  • クラスタに参加しているサーバーのIPアドレスやホスト名、タグといった情報の一覧表示
  • サーバーの死活管理
  • クラスタへのサーバーの追加や削除といったイベントに応じた処理の実行とその結果の収集

 なお、Serfでチェックできるのはあくまでそのサーバーが稼働しているかどうか(厳密には後述するエージェントが稼動しているかどうか)のみで、そのサーバー上で稼動している個別サービスの死活監視機能やリソースの管理機能は用意されていない。こういった需要には、ほかのツールを組み合わせて対応することになる。

Serfのユースケース

 Serfでのクラスタ管理は、クラスタに参加しているメンバの状態が変わった際に何らかのアクションを実行する、というのが基本となる。

 たとえばこれを使った活用例としては、ロードバランサを使った負荷分散・冗長化を行っている環境で、ホストの追加を自動的に検知して設定を変更しロードバランス対象に追加する、といったものが挙げられる。また、DockerやOpenStackなどを使ったクラスタで、新たに追加されたサーバーをクラスタノードに自動で追加する、といった使い方も可能だ。

 また、イベント処理機能を利用し、任意のタイミングで各サーバーで一斉に指定した処理を実行させることもできる。これを利用して、たとえば一斉にソフトウェアの更新や設定の変更を実行する、といったことが可能だ。

Serfのインストールとクラスタの構成

 Serfの特徴の1つに、インストールが容易である点がある。管理・監視ツールによっては別途データベースなどを用意する必要があるものがあるが、Serfは特に依存するライブラリやソフトウェアがなく、バイナリファイルを1つインストールするだけで動作する。

 Serfのバイナリファイルは公式サイトのダウンロードページからダウンロードが可能だ。Linuxだけでなく、Mac OS XやFreeBSD、OpenBSD、Windows向けのバイナリも用意されている(図2)。

図2 Serfのダウンロードページ
図2 Serfのダウンロードページ

 公開されているバイナリはZIP形式で圧縮されているので、これを展開して/usr/loca/binなどのディレクトリにコピーすればインストールは完了だ。また、ソースコードはGitHubで公開されている。

 なお、SerfではTCPおよびUDPの7946番ポートを使用するので、このポートに対し外部からアクセスできるようファイアウォールを設定しておく必要がある。また、RPCを使って外部のSerfに対してAPIコールを実行する場合は7373番ポートが利用される。こちらに関しては必要に応じて設定すれば良い。