Litmusは、ステートフルなアプリケーションを実行するKubernetes環境のための、オープンソースのカオスエンジニアリングフレームワークだ。MayaDataの支援するLitmusを使うことで、テストスイートの実行、ログのキャプチャ、レポートの生成、カオステストの実行が可能になる。エンドツーエンドのテスト手法の一部として、CI/CDパイプラインに追加することもできる。
Litmusは、ユニットテストや統合テストでは見逃される可能性のある、Kubernetes上の検出困難なバグを検出できるように設計されており、カオスと機能(functional)という、2種類のテストを実行することが可能だ。カオステストはアプリケーションのレジリエンスに焦点を当てたもので、フレームワークにはコンテナクラッシュやディスク障害、ネットワーク遅延、パケット損失などの望ましくない動作に対する、事前定義されたテストがいくつか含まれている。機能テストはシステム要件の充足を確認するためのもので、Litmusではアプリケーションのスケーリングなどの要件のテストも含んでいる。Kubernetesデプロイメントが、ステートフルなワークロードに適しているか判断するためにも使用可能だ。
Litmusは4つの主要コンポーネントで構成されている。テスト用のKubernetesクラスタを設定するデプロイメント(Deployment)、テストスイートの実行、ログのキャプチャ、およびレポートの生成によってテストの実行を支援するファシリテータ(Facilitator)、テスト実行時にKubernetesクラスタ内からトリガされる、コンテナ化されたテストであるテストモジュール、そして最後のコンポーネントである、テスト自体である。
Litmusの資料で実験(experiment)と呼んでいるLitmusテストを実行するには、Litmusの実験ディレクトリにある既存のカオス実験を選択して、環境変数を介して渡されるアプリケーションとテスト値を更新した上で、kubectlを使用してlitmusbookを実行する。
kubectl create -f experiments/chaos/run_litmus_test.yml
テストはコンテナ内で実行され、テストと環境変数を評価した後、Pumpaなどのオープンソースツールを活用して、実験を行うために必要なインフラストラクチャのオーケストレーションを行う。テストが完了すると、Litmusは、事前定義された終了基準に基づいて実験の成否を評価する。テスト結果は、テストのメタデータとともに、Kubernetesカスタムリソースに保存される。Litmusテストを実行するCI/CDパイプラインでは、これらのカスタムリソースからジョブステータスを判断することが可能だ。
Litmusアーキテクチャ [Litmus資料より]
テストは、Go言語のCucumber BDDフレームワークであるGodogを使用してBDDスタイルの英語で記述するか、あるいはAnsible Playbookとして作成することが可能で、Litmus Test Playbookコンポーネントにグループ化される。Litmusのテストの大半は、Kubernetesジョブコントローラによって管理されるKubernetesポッド内で実行される、Ansible Playbookである。テスト実行時に環境変数を利用して、一般的なまたは特殊なテストユーティリティタスク用のテストライブラリを取り込むことも可能だ。カオスメトリクスをPrometheusエンドポイントに公開するChaos-Exporterも提供されている。
Kubernetesネイティブなオープンソースのコンテナ接続ストレージソリューションOpenEBSのメインスポンサであるMayaDataが開発したLitmusの本来の目的は、ステートフルなKubernetesアプリケーションにエンドツーエンドの検証手段を提供することにあった。データが安全にアクセス可能であるという保証とともに、ステートフルなアプリケーションをKubernetesで実行できることを保証する必要性が、その開発の原動力となっている。拡張性を備え、さまざまな永続ストレージソリューションで動作するように設計されたLitmusは、Percona MySQL、MongoDB、Apache Cassandra、Minioといったステートフルアプリケーションもサポートし、デプロイ、ロード、再スケジュール、スケールアップ、アップグレード、プロビジョニング解除といった、一般的なアプリケーションライフサイクルシナリオをカバーする。
Litmusを導入するには、GithubレポジトリのGetting Startedセクション、または公式ドキュメントを見るとよいだろう。