Hashicorp Project の Serf ( http://www.serfdom.io/ ) が 11/1 に version 0.2.0 にバージョンアップしました。当記事は、バージョンアップの手順や、追加された機能や設定について、簡単な検証をしたまとめです。
今回のバージョンから、設定ファイルの外部化と暗号化対応により、Serf が実サービスに投入できるレベルになったと思います。
ところで、Serf はオーケストレーションツール、という理解であっていますでしょうか? ドメイン名が “serfdom” なので、司るほうの orchestration なのかな?と。あまり自信がありません。なんというか、「Serf は考えるんじゃない!感じるんだ!」というツールのような気がしています。
乗るしかない、このビッグウェーブに!! ← それは surf
■ Serf v 0.1.0 → v.0.2.0 へのバージョンアップ作業
既に 0.1.0 のバイナリが組み込まれているときは、バイナリを上書きするだけで動きます。自分の場合は /usr/local/bin/serf にファイルを置いていました。そのため、旧ファイルを念の為に残しつつ、新しいバイナリを設置しています。
wget -O 0.2.0_linux_amd64.zip https://dl.bintray.com/mitchellh/serf/0.2.0_linux_amd64.zip unzip 0.2.0_linux_amd64.zip sudo mv /usr/local/bin/serf /usr/local/bin/serf-0.1.0 sudo mv ./serf /usr/local/bin/serf-0.2.0 sudo ln -s /usr/local/bin/serf-0.2.0 /usr/local/bin/serf
バージョンを確認すると v0.2.0 になっている事がわかります。
$ serf -v
Serf v0.2.0
Agent Protocol: 1 (Understands back to: 0)
■バージョンとプロトコルの互換性について
バージョンが変わるとプロトコルは変わります。しかし、後方互換を持たせる方針のようで、直前のバージョンのプロトコルは利用できます。
たとえば、v0.3.0 が出るとすると、v0.2.0 との互換性はあります。しかし v0.3.0 には v0.1.0 との互換性はありません。あくまでも直前バージョンのみです。
プロトコルを指定するには、エージェント起動時に -protocol を用います。
$ serf agent -protocol=0
省略時は、”-protocol=1″(現行バージョン)となり、古いプロトコルを指定するときだけ明示する必要があります。どのプロトコルで動作しているかは、”serf members -detailed”で確認します。
$ serf members -detailed node3 192.168.10.3 alive Protocol Version: 0 Available Protocol Range: [0, 1] node1 192.168.10.1 alive Protocol Version: 1 Available Protocol Range: [0, 1]
■暗号化対応
v0.2.0 からはノード間の通信に encrypt (暗号化) モードが対応しました。これまで、serf agent が動作していた環境では、誰でも無条件にノードに加わる ( join ) できました。暗号化モードを使えば、一致しないと加わることが出来ません。
使用するには serf agent のオプションで “-encrypt=鍵” を指定します。鍵の部分は ‘serf keygen’ コマンドで自動生成するのが楽です。
$ serf keygen dMKFuJhWyIXDW+gPCJ6L6w==
あとは、serf agent 起動時に、次のように指定します。
$ serf agent -node=qb1 -encrypt=ukmr3yRhM39ONNWAQOAH8w==
もし、暗号化されていない環境から接続しようとしても、エージェント側には ‘==> Reading remote state failed: EOF’ と表示され、接続に失敗します。また、先方のエージェントのログには ‘[ERR] Failed to receive remote state: SecretKey is configured but remote state is not encrypted’ と表示されます。
起動後のエージェントのログには、暗号化通信時は Encrypted: ture と表示されます。
==> Starting Serf agent...
==> Serf agent running!
Node name: 'qb1'
Bind addr: '0.0.0.0:7946'
RPC addr: '127.0.0.1:7373'
Encrypted: true
この暗号化対応のお陰で、個人的には実環境にも投入できるのかな、と思っています。
■agent 起動時の自動 join 対応
従来は join するまでコマンドを2回する必要がありました。serf agent の起動と、serf join で接続先の指定をする必要がありました。たとえば、このように2行必要です。
$ serf agent & $ serf join 192.168.10.1
このバージョンからは serf agent の引数 ‘-join=’ として、接続先が指定できます。例えば、エージェントの起動と共に 192.168.10.1 に接続する場合は、次のように実行します。
$ serf agent -join=192.168.10.1
■agent 起動時、外部設定ファイルの指定に対応
バージョンが上がり、設定項目も増えてきました。運用上助かるのが、設定ファイルやファイルのあるディレクトリをオプションで指定できる点です。これまでは serf agent の起動オプションで明示する必要がありましたが、今後はファイルを置くだけで設定が済みます。
設定ファイルは agent 起動時、’-config-file=’ オプションで指定できます。
$ serf agent -config-file=./serf.json
ファイルの内容は JSON 形式です。serf aget のオプション群をそのまま書き直すだけで動作します。例えば、ノード名 ‘qb1’、ロール名 ‘development’、暗号化対応、ログレベル ‘debug’ の場合、通常の起動コマンドは次のようになります。
$ serf agent -node=qb1 \ -role=development \ -encrypt=ukmr3yRhM39ONNWAQOAH8w== \ log_level=debug
これを JSON 形式のファイルに書き換えると、次のようになります。
{ "role": "development", "node_name": "qb1", "encrypt_key": "ukmr3yRhM39ONNWAQOAH8w==", "log_level": "debug" }
あとは、先のように serf agent -config-file= でパスを指定すると実行できます。オプション -encrypt は、”encrypt_key” に書き換える必要があります。
オプションでハイフンの有無を気にしなくて良いのは助かります。あとは、複数の設定の切り分けがスムーズにできそうですね。
あとは、起動時の自動 join に対応する -join= 相当のものは ‘start_join’ で指定できます。ここは配列で指定しなくてはいけません。例: “192.168.10.1” に接続する記述は、次のようになります。
{ "role": "development", "node_name": "qb2", "encrypt_key": "ukmr3yRhM39ONNWAQOAH8w==", "log_level": "debug", "start_join": [ "192.168.10.1" ] }
複数の接続先を指定するときは、次のように書き換えます。
"start_join": [ "192.168.10.1", "192.168.10.3" ]
■細かいところ
serf members で role が表示されるのも、何気に便利ですね。
$ serf members qb2 192.168.10.2 alive development qb1 192.168.10.1 alive development
これは、どちらも ‘development’ というロールで動いている事が分かります。
その他細かい変更点は CHANGELOG をご覧下さい。
■参考:
CHANGELOG
https://github.com/hashicorp/serf/blob/master/CHANGELOG.md
Serf Protocol Compatibility Promise – Serf
http://www.serfdom.io/docs/compatibility.html
Configuration – Serf
http://www.serfdom.io/docs/agent/options.html
Pingback: natインスタンスの冗長化 | DEVLAB