耐障害性を上げるために障害を意図的に起こす!?ChaosMonkey入門: Spinnaker

こんにちは。 Scalaをメインに、フロントやサーバサイド含め色々やってるスクラムマスターの技術戦略室 鈴木( @moc_yuto )です。
最近、PokemonGoに新キャラが追加されて久しぶりに起動しています。

さて今回のテーマとしては、「ChaosMonkey」です。

ChaosMonkeyを導入してみたいという方は結構いらっしゃるかと思うのですが、上記のレポジトリを見ると「Spinnaker」というツールが必須と書かれています。
ということで、今回はSpinnakerとはなんぞやというところを紹介したいと思います。

目次

そもそもChaosMonkeyとは?

ChaosMonkeyとは、Netflix社が作ったテスティングツールの一つで、クラウド上のインスタンスクラスタを自動でクラッシュさせ、わざとサービス障害を発生させるツールです。 作られた背景としては、そもそもクラウド上のインスタンスクラスタはクラッシュを前提に「設計」するべきです。ですが、動作する「環境」で脆弱な部分が無いかを確認するには実際に障害を起こしてしまうのが一番近道になるためです。

アプリケーション上では、テストコードという形で異常系のイテレーションテストを行いますが、インフラでの異常系のイテレーションテストはなかなかできません。 ChaosMonkeyを利用すれば、インフラのイテレーションテストが実現できるのです。

ChaosMonkeyの詳しい解説は アジャイル DevOps: Chaos Monkey を使用する がオススメです。

Spinnaker概要

Spinnakerは、NetflixGoogleとPivotalと共同して作成したOSSのツールで、NetflixOSSであるAsgardを刷新したツールです。

ホームページにも書かれていますが、AWS, GCP, Azureなど主要なクラウドプラットフォームに幅広く対応しています。

機能

Spinnakerが提供している機能を大きく分けると以下2つになります。

  • クラスタマネジメント
    ロードバランサ, セキュリティグループ, auto-scalingグループを作成する機能のラッパーです。
    アプリケーションという単位を作ると、その配下に1ロードバランサ、1セキュリティグループを作り、サーバーグループ(auto-scalingグループ)を作ります。
    各サービスはAWS上での設定と同様に細かい設定が可能です。
    f:id:cyberz-dev-writer:20170224145536p:plain

  • デプロイマネジメント
    Pipelineという名前で提供されています。Pipeline内でstageというタスク群をつなぎ合わせ、実施します。

実際に触ってみる

インストール方法

以下ドキュメントにまとまっています。
Netflix OSS Spinnaker on the AWS Cloud: Quick Start Reference Deployment

ハマりどころ

  • pem指定忘れ
    Cloudformationで作成した際、SSHコマンドが生成されますが、そのSSHコマンドにpemの指定が入ってないので忘れがちです。
    また、作成されたインスタンスにもpemは配備されていないので、まずpemの配備から始めましょう。

  • connection failed
    channel 9: open failed: connect failed: Connection refused
    ↑は再起動とかすると発生しがちですが、以下で解決すると思います。
    > sudo service clouddriver restart

他にもよくあるトラブルは公式でガイドとしてまとめられています。困ったら一読すると良いと思います。

構成

NexflixがCloudFormationのテンプレートを提供しているのでそれを利用して作成します。
配布されているテンプレートはこんな感じです。
f:id:cyberz-dev-writer:20170224145705p:plain

  • BastionServer: ローカルから接続する踏み台サーバ
  • SpinnakerWebServer: Spinnakerが稼働しているサーバ

クラスタマネジメント

Spinnakerではクラスタを管理できます。 AWSGCP、Azure各クラウドサービスにおいて、同じインターフェイスで管理できるのが強みです。

設定

アプリケーションの作成をします。
こんな感じです。 f:id:cyberz-dev-writer:20170224154639p:plain

Spinnaker上でのクラスタの作成手順としては、

  1. アプリケーション作成
  2. セキュリティグループ作成
  3. ロードバランサ作成
  4. サーバーグループ(auto-scaling)作成

という流れになります。
ロードバランサ、セキュリティグループは一つしか作れない模様です。

デプロイマネジメント

  • Pipeline
    stageをつなぐことでデプロイを実施する
  • Stage
    pipelineのタスクの一つ

Pipelineの設定

デプロイマネジメントのための機能です。 f:id:cyberz-dev-writer:20170224155158p:plain

上記に示すように

  • Configurationステージ
  • Bakeステージ
  • CheckPreconditionsステージ
  • Deployステージ

という各ステージを設定することが出来ます。

システム構成

SpinnakerはデフォルトでJavaとCassandraで動いています。

Cassandraを使うために、Spinnaker-Web-Serverはm4.largeを利用しています。 ただそんなに負荷のかかるサーバではなく、m4.largeは大きすぎるのでcassandraを使わずにS3に変更することも可能です。

以下のリンクに詳しく記載されています。

Front50: Cassandra to Object Store (S3, Azure, or GCS) · Spinnaker : Global Continuous Delivery

ChaosMonkeyとSpinnaker

SpinnakerとChaosMonkeyの関係について説明すると、 ChaosMonkeyはSpinnakerで作ったアプリケーション内で動作するようになっています。
Spinnakerで動作するクラスタ内部でMonkeyが暴れまわってくれるという構造ですね。

Spinnaker上でのChaosMonkeyの設定

現在、ChaosMonkey上のドキュメントは若干古いため、設定ファイルの場所が変わっています。 How to deploy - Chaos Monkey

Spinnakerのプラグイン周りの設定はsetting.jsというjsファイルで保持されていますが、以下の位置に移動しています。

$ vi /opt/spinnaker/config/setting.js

...
feature: {
    pipelines: true,
    notifications: false,
    fastProperty: true,
    ...
    chaosMonkey: false

このfalseをtrueに変更し、設定を以下で読み込み直すと設定完了です。

sudo sh /opt/spinnaker/bin/reconfigure_spinnaker.sh

実際の画面 f:id:cyberz-dev-writer:20170227113437p:plain

まとめ

Spinnakerについてまとめてみましたが、いかがでしたでしょうか?
Spinnakerに関する記事があまりなく調べ始めたときは、そもそもどういうツールかもよくわからなかったので、把握するまでにかなり苦戦しました。
この記事でSpinnakerへの理解が広がれば幸いです。

(おまけ)勉強会告知

最後に勉強会の告知です!

3月9日のアドウェイズさんとCyberZの勉強会があるのですが、Scalaについて発表します!
是非ご参加ください。お待ちしております。