初心者がChaos Engineeringの世界を探索してみた：ツール調査まとめ

# はじめに
こんにちは。

私は情報システムやサービスの運用の研究開発業務を担当するグループに所属している**新人エンジニア**です。
新卒として今年からITの世界に飛び込んでみたものの、覚えるべき用語や技術が非常に多く、右往左往する毎日を過ごしています。

今回も前回に引き続き、研究開発に必要な知識を得るためにCNCFのLandscapeに掲載されたツールについて調査しました。

https://qiita.com/melhts/items/e89bbbd036659f845b9c

その中でも今回は、障害対策の一つである「**Chaos Engineering**」の世界へ冒険に出かけようと思います。

本記事はIT知識ゼロの私が、**CNCFのLandscapeに掲載されていたChaos Engineeringツールについて調査した**内容をまとめたものになります。

まずは前提知識をおさらいし、各ツールの紹介をした後に調査して気づいたことについてまとめます。

# 前提知識が分からない...
前回同様に「Chaos Engineeringってなんだ？」となりましたので、ツールの紹介の前に、**前提知識**について説明していこうと思います。

OSSやCNCFについては前回記事である、
『[初心者がObservabilityの世界を探索してみた：ツール調査まとめ](https://qiita.com/melhts/items/e89bbbd036659f845b9c)』
で説明していますので、参考にしていただければと思います。

## Chaos Engineeringって何？
Chaos Engineeringとは、**システムの弱点を見つけるために意図的に障害を発生させ、レジリエンスを高める手法**のことです。

以下にCNCFによるChaos Engineeringの定義を示します。
### Chaos Engineeringの定義
> カオスエンジニアリング(CE)とは、本番環境の分散システムに実験する学問分野です。 分散システムが乱雑で予期せぬ状況に耐えるシステムの能力に対する信頼を築くことを目指します。
> 引用元：[Cloud Native Glossary](https://glossary.cncf.io/ja/chaos-engineering/)

### Chaos Engineeringのメリット
> カオスエンジニアリングは、回復力の要件を満たすための技術です。 インフラストラクチャ、プラットフォーム、そしてアプリケーションの障害に対する回復力を達成するために使用されます。 カオスエンジニアは、アプリケーション、インフラストラクチャ、あるいはプラットフォームが自己修復でき障害が顧客に目立った影響を与えないことを検証するために、プロアクティブにランダムな障害を注入するカオス実験を行います。 カオス実験の目的は、盲点(例えば、モニタリングや自動スケーリング技術)を発見し、重大なインシデントの最中にチーム間のコミュニケーションを改善することです。 このアプローチは、特に本番環境において、複雑なシステムにおける回復力とチームの自信を高めるのに役立ちます。
> 引用元：[Cloud Native Glossary](https://glossary.cncf.io/ja/chaos-engineering/)

### Chaos Engineeringの歴史
Chaos Engineeringは従来の単一サーバー中心のシステムから、クラウドやマイクロサービスによる分散システムが主流になったことにより、システムの信頼性を確保するための手法として進化してきました。
そんな、Chaos Engineeringの大まかな歴史について以下の図にまとめました。

参考文献①：[カオスエンジニアリング入門](https://www.slideshare.net/slideshow/chaosblade-180414267/180414267)
参考文献②：[カオスエンジニアリングの過去と今](https://zenn.dev/hodagi/articles/3ce6ccdb00538c)

![Chaos Engineeringの歴史.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/3269e12a-5400-641f-32e2-dbf62e183ab2.png)

- 2009年にNetflixはAWS Cloudへ移行を開始する
- 2010年にChaosMonkeyの開発を開始する
- 2011年にAWSのUS East Regionで大規模障害が発生したが、Netflixは影響を受けず
- 2013年にChaosMonkeyをGitHubに公開する
- 以降、多くの企業やエンジニアがChaos Engineeringツールを導入するようになる

## Kubernetes（K8s）って何？
Kubernetesは**コンテナオーケストレーションツール**です。
コンテナオーケストレーションツールとはコンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのツールのことです。
 
Kubernetesの読み方は『クーバネティス』、『クバネティス』、『ケイエイツ』など様々です。

::: note info
Kubernetesはギリシャ語で『操舵士』を意味する言葉が由来であり、アプリケーションを管理することを象徴しています。
:::
 
https://kubernetes.io/

### 特徴
- コンテナの運用管理と自動化
- 簡単なデプロイとロールバックが可能
- 複数のマシンにわたってアプリケーションを分散

### 重要な用語
- コンテナ：仮想化技術の一種
- ポッド：コンテナの集合体
- ノード：Kubernetesでポッドを実行するマシン
- クラスタ：Kubernetesのリソースを管理する集合体

# Chaos Engineeringツールの紹介
ここから本題のツール紹介に入ります。現在、CNCFのLandscapeに掲載されている**Chaos Engineeringツールは11ツール**です（2024年11月時点）。その中でもGitHubにソースコードを公開している8ツールについて紹介していきます。

::: note
Chaos Engineeringツール数は他ツールと比較して、少ない部類です。
（Observability：145ツール, Continuous Optimization：23ツール, etc.）
:::

**調査対象ツール**
- Chaos Mesh
- Litmus
- Chaos Toolkit
- ChaosBlade
- Krkn
- Chaoskube
- PowerSeal
- Kubeinvaders

**調査内容**
- 機能概要
- 最新版バージョン
- 初版リリース
- CNCFによる成熟度の分類
- 公式コンテナイメージ提供の有無
- ツール開発に使用している言語とその比率
- ライセンス
- Contributor数
- GitHubリポジトリURL

**調査方法**
- WEB上（公式ホームページ等）

:::note
成熟度はCNCFの技術監査委員会に対して複数の組織からのコミットや健全な変更率を維持していることなどの持続可能性を示すことで高められます。
参考情報：[CNCF Project Metrics](https://www.cncf.io/project-metrics/)
:::

:::note warn
紹介するツールはこの**ブログ執筆時点（2024/11/15）のデータ**となっています。
:::

## 1. Chaos Mesh
Chaos Meshは**Kubernetesに特化したChaos Engineeringツール**です。

https://chaos-mesh.org/

### 特徴
- CRDを活用してKubernetesと自然に統合
- Kubernetesクラスタに簡単にデプロイ可能
- ワークフローを使用して複雑な障害シナリオをオーケストレーション

### ツール内で気になった用語
- **CRD（Custom Resource Definition）**：Kubernetesにカスタムリソースを作成できる機能

| | Chaos Mesh |
|:-: |:-:|
|開発元|PingCAP|
|最新版|v2.7.0（2024年9月）|
|初版リリース|2019年|
|成熟度|INCUBATING|
|公式コンテナイメージ|有り|
|開発言語|GO（66.0%）, TypeScript（27.3%）, Shell（4.3%）|
|ライセンス|Apache-2.0|
|Contributor数|197|
|GitHubリポジトリURL|https://github.com/chaos-mesh/chaos-mesh|

### コメント
**成熟度がINCUBATING**であることから、利用が広まりつつあることが伺えます。

Chaos MeshはKubernetesの専用ツールであり、他のOSSと比較して複雑なシナリオを構築できます。
そのため、**様々なパターンや特異なパターンでカオステストを実行したい場合**に役立つと考えられます。

また、Chaos Meshが提供するカオスエンジニアリングツールである「Chaosd」はKubernetesを使用していない場合でもChaos Meshが提供する機能を利用できるため、Kubernetesに精通していない人でも利用が可能です。

## 2. Litmus
Litmusは**Kubernetesに特化したChaos Engineeringツール**です。

https://litmuschaos.io/

### 特徴
- 自分の環境に合わせて実験をカスタマイズ可能
- Prometheusのメトリクスをエクスポートし、リアルタイムで定量化可能
- 初心者でも数分でスケジュール可能

### ツール内で気になった用語
- **Prometheus**：メトリクスに基づく監視とアラート通知ツール

| | Litmus |
|:-: |:-:|
|開発元|ChaosNative（元MayaData）|
|最新版|v3.12.0（2024年10月）|
|初版リリース|2017年|
|成熟度|INCUBATING|
|公式コンテナイメージ|有り|
|開発言語|GO（85.8%）, SCSS（12.4%）|
|ライセンス|Apache-2.0|
|Contributor数|209|
|GitHubリポジトリURL|https://github.com/litmuschaos/litmus|

### コメント
**成熟度がINCUBATING**であることから、利用が広まりつつあることが伺えます。
今回調査したツールの中でContributors数が最大であるため、コミュニティが広く、活発に活動していることが確認できます。

Kubernetesに特化していることから、**Kubernetes環境でアプリケーションを運用している人**に適していると考えられます。
初心者でも数分でスケジュール可能なことから、Chaos Engineeringに触ったことない人でも利用しやすそうですね！

## 3. Chaos Toolkit
Chaos Toolkitは**カオス実験の作成と実行を支援するCLI駆動ベースのツール**です。

https://chaostoolkit.org/

### 特徴
- Open APIを通じて、どのシステムにも自由に拡張可能
- シンプルなJSON/YAMLベースの宣言的な設定

### ツール内で気になった用語
- **OpenAPI**：APIを記述するためのフレームワーク

| | Chaos Toolkit |
|:-: |:-:|
|開発元|ChaosIQ|
|最新版|v1.19.0（2024年2月）|
|初版リリース|2017年|
|成熟度|記載なし|
|公式コンテナイメージ|有り|
|開発言語|Python（98.8%）, Dockerfile（1.2%）|
|ライセンス|Apache-2.0|
|Contributor数|18|
|GitHubリポジトリURL|https://github.com/chaostoolkit/chaostoolkit|

### コメント
Kubernetesだけでなく、**クラウド（AWS、GCP）やオンプレミス環境でも利用可能**なため、多様なインフラを扱うチームに適していると考えられます。

## 4. ChaosBlade
ChaosBladeは**複数の環境、言語をサポートするChaos Engineeringツール**です。

https://chaosblade.io/

### 特徴
- 豊富な実験シナリオを保有
- ホスト、クラスタ上に自動で実験ツールを展開可能
- 異なる環境に対して使用方法を気にせず、同じインターフェースで実験可能

| | ChaosBlade |
|:-: |:-:|
|開発元|Alibaba|
|最新版|v1.7.4（2024年7月）|
|初版リリース|2019年|
|成熟度|SANDBOX|
|公式コンテナイメージ|有り|
|開発言語|GO（91.3%）, Makefile（5.3%）|
|ライセンス|Apache-2.0|
|Contributor数|40|
|GitHubリポジトリURL|https://github.com/chaosblade-io/chaosblade|

### コメント
ChaosBladeはLinux、Docker、Kubernetesクラスタなどの様々な環境でのデプロイをサポートしており、**Kubernetesだけでなく、Linux等のそれ以外の環境下でカオステストを実行したい場合**に役立つと考えられます。

豊富な実験シナリオを有しており、基本リソース（CPU、メモリ、ネットワーク、カーネル、ファイル、etc.）や多様なプログラミング言語（Java、C++、NodeJS、Golang、etc.）、Kubernetesプラットフォームに対するカオステストが可能です。

::: note warn
ドキュメントの一部には多言語に対応しておらず、中国語のみなっている箇所があります。
::: 

## 5. Krkn
Krknは**Kubernetesに特化したChaos Engineeringツール**です。

https://krkn-chaos.github.io/krkn/

### 特徴
- ほとんどのKubernetesのカオスシナリオをサポート
- OpenShiftとの深い結合
- 主にエンタープライズ向け

### ツール内で気になった用語
- **OpenShift**：Red Hatが開発したエンタープライズ向けKubernetesプラットフォームで、コンテナ化されたアプリケーションのデプロイ、管理、自動化を支援するもの

| | Krkn |
|:-: |:-:|
|開発元|Red Hat|
|最新版|v2.0.6（2024年11月）|
|初版リリース|2020年|
|成熟度|SANDBOX|
|公式コンテナイメージ|有り|
|開発言語|Python（95.3%）, Shell（3.4%）|
|ライセンス|Apache-2.0|
|Contributor数|41|
|GitHubリポジトリURL|https://github.com/krkn-chaos/krkn|

### コメント
Kubernetesに特化していることから、**Kubernetes環境でアプリケーションを運用している人**に適していると考えられます。

Krknと同じ開発元である「Red Hat」が開発した「OpenShift」と深い結合があるため、OpenShiftを導入している企業の方でカオステストを実施したい場合には、ぜひとも導入したいですね！

## 6. Chaoskube
Chaoskubeは**Kubernetesクラスタ内のランダムなポッドを終了させるツール**です。

### 特徴
- 指定された間隔でポッドをランダムに停止可能
- Kubernetesクラスタに簡単にデプロイ可能
- 非常にシンプルな機能構成

| | Chaoskube |
|:-: |:-:|
|開発元|Linki|
|最新版|v0.33.0（2024年8月）|
|初版リリース|2016年|
|成熟度|記載なし|
|公式コンテナイメージ|有り|
|開発言語|GO（97.2%）, Smarty（2.0%）|
|ライセンス|MIT license|
|Contributor数|34|
|GitHubリポジトリURL|https://github.com/linki/chaoskube|

### コメント
Kubernetesに特化していることから、**Kubernetes環境でアプリケーションを運用している人**に適していると考えられます。

「ポッドを終了させる」というシンプルな機能のみを有しているため、小さなリソースで簡単に利用できます。
設定も非常にシンプルなため、**短時間でテストを実行したい場合**に便利だと考えられます。

## 7. PowerfulSeal
PowerfulSealは**Kubernetesに特化したChaos Engineeringツール**です。

https://powerfulseal.github.io/powerfulseal/

### 特徴
- 複数のモードで異なるユースケースに対応
- PrometheusおよびDatadogで障害が与える影響を監視可能

### ツール内で気になった用語
- **Datadog**：クラウド上でシステムのメトリクス、ログ、トレースを一元管理する従量課金制のObservabilityサービス（[DatadogHP](https://www.datadoghq.com/ja/)）

| | PowerfulSeal |
|:-: |:-:|
|開発元|Bloomberg|
|最新版|v3.3.0（2021年9月）|
|初版リリース|2017年|
|成熟度|記載なし|
|公式コンテナイメージ|有り|
|開発言語|Python（98.5%）|
|ライセンス|Apache-2.0|
|Contributor数|30|
|GitHubリポジトリURL|https://github.com/powerfulseal/powerfulseal|

### コメント
Kubernetesに特化していることから、**Kubernetes環境でアプリケーションを運用している人**に適していると考えられます。

PowerfulSealには以下に示す通り3つのモードがあり、用途に応じて使い分けることができそうです。
- 自律モード：任意のシナリオを継続的に実行し、メトリクスを生成する主要なモード
- インタラクティブモード：手動で障害注入するシンプルな機能をもつモード
- ラベルモード：ラベルによってターゲットを絞り込むモード

## 8. Kubeinvaders
Kubeinvadersは**Kubernetes用のゲーム化されたChaos Engineeringツール**です。

### 特徴
- インベーダーゲームのようなUIを使用
- インベーダーを攻撃するとランダムでポッドが停止
- 楽しくテストし、レジリエンスの確認が可能
- ゲームモードとプログラミングモードが存在

| | Kubeinvaders |
|:-: |:-:|
|開発元|Eugenio Marzo（個人）|
|最新版|v1.9.7（2024年8月）|
|初版リリース|2019年|
|成熟度|記載なし|
|公式コンテナイメージ|有り|
|開発言語|JavaScript（78.3%）, HTML（6.7%）, Python（6.1%）|
|Contributor数|Apache-2.0|
|GitHubリポジトリURL|https://github.com/lucky-sideburn/kubeinvaders|

### コメント
Kubernetesに特化していることから、**Kubernetes環境でアプリケーションを運用している人**に適していると考えられます。

ゲームモードでは、「インベーダーを攻撃するとポッドを停止させる」という設計になっており、**ゲーム感覚で楽しくカオステストを体感**することができます。
しかし、複雑なシナリオは実行できないため、実運用には不向きかもしれません。

シンプルな機能かつ直感的な操作でカオステストの実行ができるため、Chaos Engineering初心者におすすめです！！


# まとめ
以上の8ツールについて調査してみました。
調査してみた感想として、かなり似た内容のツールが多いなと感じました。
その中でも、**「Kubeinvaders」は一風変わった特徴**を有しており、興味を持ちました。
私自身ゲームが好きなので、最初はKubeinvadersを用いてカオステストしてみたいと思います！！

また、多くのツールはドキュメントが整っており、どのツールを導入する場合でもそれほど困ることはないと感じました。

以下に、Chaos Engineeringの分類、近年の傾向を示します。

## Chaos Engineeringの分類
Chaos Engineeringツールは大きく2種類に分けられると考えました。下図に調査ツールの分類を示します。
基本的に**Kubernetesに特化したツールが多いため、Kubernetesを利用している方だとツール選択の幅が広がりそう**です！

しかし、Kubernetes自体の学習コストが高いため、初心者には設定が複雑だと感じられる場合があるかもしれません...。
Kubernetes以外のプラットフォームでカオステストを実行したい場合には「ChaosBlade」や「Chaos Toolkit」を利用することをおすすめします！！

![Chaos Engineeringの分類.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3884298/da0183f7-bda8-5dd5-e018-8f81abef220d.png)

## 近年の傾向
新規ツールの初版リリースが4年前（2020年）であることから、**近年はあまり開発されていない分野**であることがわかります。
また、感覚的な話にはなってしまうのですが、Observabilityツールに比べて追加機能や修正の頻度も遅く感じました。
その理由として以下のようなことが考えられます。

- 必要性が比較的低い
- 1つのツールで完結する

Chaos Engineeringはあくまでもレジリエンスを向上させるためのツールであるため、必須となるものではなく、需要が比較的低いと考えます。
さらに、近年のインフラストラクチャは障害が発生しても自動的に回復する機能をもつシステムもあり、カオステストの実行頻度が減少した可能性もあります。

また、Observabilityツールはいくつかのツールを掛け合わせて利用しますが、Chaos Engineeringツールは1つのツールでカオステストの実行が可能です。
そのため、**ツールごとに特徴を持たせづらく、新規ツールの開発がそこまでなされていない**のかもしれません。

しかし、**1つのツールで完結しているということはそれだけ導入、学習のコストが下がる**ということですので、利用者からするととっつきやすい分野であるとも言えます！

# おわりに
今回はIT初学者が**CNCFのLandscapeに掲載されているChaos Engineeringツールについて調査**し、その概要についてまとめました。
私と同じ初学者の方や、Chaos Engineeringについてこれから触っていこうと考えている方の参考になれば幸いです。

Chaos Engineeringツールの調査を通じて感じたこととして、**[Observabilityツール](https://qiita.com/melhts/items/e89bbbd036659f845b9c)と統合**することで、起きやすい障害の傾向を把握し、適切な障害を自動で注入できたりとかしたらおもしろいな～と感じました。

今後は興味を持ったツールを実際に触ってみての具体的な機能や感想、他のツール群の調査まとめを投稿する予定です。

最後までお読みいただき、ありがとうございました。