Serf/Consulで管理を自動化! ~実践的な手法を紹介~

第7回Consulのオーケストレーションと自動化

複数のサーバやコンテナの環境上において、Consulは何らかの処理を、同時かつ自動的に処理する仕組みがあります。ここでは、それらの自動化の種類と使い方を見ていきます。

オーケストレーション

クラウドの広がりと共にオーケストレーション(Orchestration)という言葉も使われるようになってきました。オーケストレーションという言葉の意味には諸説ありますが、Wikipediaにおいては「複雑なコンピュータシステム/ミドルウェア/サービスの配置/設定/管理の自動化を指す用語」と紹介されています。

このようなオーケストレーションという表現は抽象的ですので、具体的な利用シーンを見てみましょう。複数のサーバ環境において、開発や運用という立場を越えて、次のような使い方が想定されます。

  • アプリケーションやミドルウェアを自動インストール(デプロイ)したい
  • インストール済みのソフトウェアのバージョンを確認したい
  • 各々のサーバのload averageや、CPUやメモリリソースの利用状況を確認したい
  • コマンドを一斉実行し、デーモンやプログラムの再起動を行いたい

クラウドや仮想化が広範囲に展開する前は、管理対象のサーバ数も少なく、また環境が増減することがなかったため、比較的手作業でも行えたのではないかと思います。しかし、近年の環境は、管理対象の台数が増えただけでなく、その対象が増減する(動的に変化する)ケースが増えつつあります。

これらは管理対象のサーバ台数が少なければ、手動で実行したほうが速い場合もあります。しかし、何台も同じ繰り返しの作業がある場合や、クラウドや仮想化環境のようにインフラが動的に変化するような環境において、正確かつ迅速な作業を実施するために、オーケストレーションが必要とされています。

Consulが提供するオーケストレーション機能

Consulが持つ機能は、クラスタのメンバー管理やサービス検出機能だけではありません。Consulには、様々な処理を自動的に行う、いわゆるオーケストレーションを行うための仕組みが提供されています。これは、Consulクラスタが構成されているサーバ上で、同時にコマンドやスクリプトを実行するための仕組みです。

コマンド実行のトリガは、任意のタイミングだけでなく、ノードやサービスの検出状況に変化が生じた時に自動的に行えます。これは第2回で取り上げたSerfのイベント処理と似ています。Consulのメンバー管理機能は、Serfを元にして取り込まれてきた経緯があります。

初期のConsulにはSerfの機能は内部的にしか使用されておらず、オーケストレーション機能はありませんでした。しかし、Consulのバージョンを経ることで、Serfと同じような機能を使えるようになっています。

表1 Serf/Consulの同時実行コマンドと結果取得コマンド
同時実行コマンド 結果取得コマンド
Consul consul event consul exec
Serf serf event serf query

これらはChefやPuppetのような構成管理ツールを使うような状況と似ていますが、少し異なります。構成管理ツールの場合は、設定時点において対象となるサーバ上のサービスが正常かどうかを判断することができません。Consulはサービス検出機能を持っていますので、正常なサービスを稼働している対象のみ、自動的に処理を行うことができます。ただし、決して構成管理ツールが不要になるのではなく、サービス検出と併用することによって、相互に補完し合うこともできます。

Consulのイベントハンドラ

Consulのオーケストレーションと呼ばれる機能の実体は、イベントハンドラです。これは、任意のタイミングまたはConsulのサービス検出と連動し、任意のコマンドやスクリプトを自動実行する仕組みです。今回は、一番手軽に利用できるリモート実行機能を見ていきます。

リモートでコマンドを実行するConsul exec

Consulには、ローカル上だけでなく、リモートのサーバ上でコマンドやスクリプトを同時に実行する機能があります。それぞれのサーバにログインする必要なく、迅速な処理を行えます。また、リモートのサーバ上で実行した処理結果を、手元の標準出力に表示します。これはSerfにおけるserf queryを実行した時と同様の処理です。

Consulクラスタ上でコマンドを実行するには、コンソール上でconsul execを実行します。実行するのはクラスタ内のどのサーバでも構いませんし、コマンドラインでリモート上のConsulエージェントを指定することもできます。

たとえば、各ノードでuptimeコマンドを実行した結果を知りたい場合はconsul exec uptimeと実行します。

$ consul exec uptime
    server:  17:17:16 up 2 days,  7:08,  2 users,  load average: 0.01, 0.03, 0.00
    server:
==> server: finished with exit code 0
    node1:  18:48:36 up 3 days,  5:26,  0 users,  load average: 0.00, 0.00, 0.00
    node1:
==> node1: finished with exit code 0
    node2:  19:03:11 up 2 days,  4:31,  1 user,  load average: 0.00, 0.00, 0.00
    node2:
==> node2: finished with exit code 0
3 / 3 node(s) completed / acknowledged

ここでは全てのノート情報が帰ってきましたが、特定のノード情報だけを知ることもできます。-nodeオプションを使ってノード名を指定することができます。たとえばノード名がnode1の結果だけを知りたい場合は、次のように実行することができます。

$ consul exec -node=node1 uptime
    node1:  19:02:04 up 3 days,  5:40,  0 users,  load average: 0.00, 0.00, 0.00
    node1:
==> node1: finished with exit code 0
1 / 1 node(s) completed / acknowledged

-nodeオプションの他にも、consul execには実行対象のノードやサービスを絞るためのオプションが提供されています表2⁠。オプションを指定して実行する場合、書式はconsul exec [オプション] <コマンド>です。

表2 execオプション
オプション 説明
-http-addr コマンドを実行させたいConsulエージェントのHTTPアドレス。標準は127.0.0.1:8500。ローカルだけでなく、リモートのConsulエージェントに対しても実行可能。
-datacenter 実行対象のデータセンター名を絞る場合に使用。
-prefix リクエスト送信時、Consulのキーバリューストアへデータを保管する時に使う接頭辞。標準は_rexec
-node 実行対象をノード名称で絞る場合に使用(正規表現⁠⁠。
-service 実行対象をサービスで絞る場合に使用(正規表現⁠⁠。
-tag 実行対象をタグで絞る場合に使用(正規表現⁠⁠。
-wait リモート実行時、エージェントが応答しなかった場合のタイムアウト値を指定(タイムアウトを10秒にする場合:consul exec -wait=10s <コマンド>⁠。
-wait-repl 指定した期間待機後、コマンド実行(10秒待機後のコマンド実行:-wait-reply=10s⁠。
-verbose より詳細なメッセージの表示。

これを応用して、アプリケーションのセットアップを行うこともできます。例えばnode1という名称のサーバにnginxパッケージをyumを使ってセットアップするには、次のように実行します。

$ consul exec -node=node1 "sudo yum -y install nginx"

注意点は、コマンドの実行がConsulエージェント起動時のユーザ権限による影響を受ける点です。一般ユーザでエージェントを起動した場合は、root権限の処理をするためには適切なsudo設定が必要です。また、root権限で起動している場合は、全てのコマンドが実行可能な点にも注意が必要です。

まとめ

consul execや、一斉に実行するオーケストレーション機能を備えているものの、その実施タイミングは人の手により手動で行う必要があります。ノードの増減や、サービスの正常・異常など状態変化によって自動的に行う仕組みが、Consulには組み込まれています。

次回は、consul eventconsul watchを使い、ノードやサービスの状態変化に応じてイベントを自動実行する仕組みや、Consul Templateを使った設定変更の変更を行う方法を見ていきます。

参考

おすすめ記事

記事・ニュース一覧