Litmus Chaosで始めるカオスエンジニアリング

# TL;DR
* Litmus Chaosとはなんぞや
* 自前のRKE2クラスタにLitmus Chaosをインストールしたよ
* Podを削除するカオス実験をしたよ
# Litmus Chaosとは
オープンソースのカオスエンジニアリングツールです．
カオスエンジニアリングといえばNetflixのChaos Monkeyが有名ですが，特にKubernetesに特化したカオスエンジニアリングツールとしてChaos MeshやLitmus Chaosが挙げられます．
個人的にLitmus ChaosはChaos Meshよりも安定して動作する印象があります．
ちなみにクラウドネイティブを推進する財団 CNCF (Cloud Native Computing Foundation) のincubating projectsでもあります．
https://litmuschaos.io/
# Litmus Chaosのインストール
おもむろにHelmでインストールします．
## 実装環境
- Ubuntu 22.04.1 LTS
- RKE2 v1.24.12（Kubernetes環境）
- Helm v3.12.0
- kubectl v1.25.3
## Helm
リポジトリを追加
```
helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
```
チャートを検索
```
helm search repo litmuschaos
```
```
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
litmuschaos/kube-aws            2.14.0          2.14.0          A Helm chart to install litmus aws chaos experi...
litmuschaos/kube-azure          2.14.0          2.14.0          A Helm chart to install litmus Azure chaos expe...
litmuschaos/kube-gcp            2.14.0          2.14.0          A Helm chart to install litmus gcp chaos experi...
litmuschaos/kubernetes-chaos    2.28.0          2.14.0          A Helm chart to install litmus chaos experiment...
litmuschaos/litmus              2.15.10         2.14.0          A Helm chart to install ChaosCenter
litmuschaos/litmus-agent        0.1.4           0.1.4           A Helm chart to install litmus agent
litmuschaos/litmus-core         2.14.0          2.14.0          A Helm chart to install litmus infra components...
```
ネームスペースの作成
```
kubectl create ns litmus
```
作成したネームスペースでlitmusをインストール
```
helm install chaos litmuschaos/litmus -n litmus
```
```
NAME: chaos
LAST DEPLOYED: Sat Jul  1 14:36:45 2023
NAMESPACE: litmus
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing litmus 😀

Your release is named chaos and it's installed to namespace: litmus.

Visit https://docs.litmuschaos.io to find more info.
```
## エラー対処
### Podが立たない😇
```
kubectl get pod -n litmus
```
```
NAME                                        READY   STATUS     RESTARTS   AGE
chaos-litmus-auth-server-65bbc55ddf-45nqc   0/1     Init:0/1   0          86s
chaos-litmus-frontend-588f4c66cf-6cqn2      1/1     Running    0          86s
chaos-litmus-server-7fb7954696-2m7j2        0/1     Init:0/1   0          86s
chaos-mongodb-79b779578-hvmff               0/1     Pending    0          85s
```
なんだかデータベースのMongoDBがPendingになっている
### 永続ボリュームが怪しい🤨
```
kubectl get pvc -n litmus
```
```
NAME            STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
chaos-mongodb   Pending                                                     2m12s
```
やっぱりPVCがPendingでした．
そこでPVCの詳細をkubectl describeで見てみます．
```
kubectl describe pvc chaos-mongodb -n litmus
```
```
Events:
  Type    Reason         Age                   From                         Message
  ----    ------         ----                  ----                         -------
  Normal  FailedBinding  95s (x26 over 7m37s)  persistentvolume-controller  no persistent volumes available for this claim and no storage class is set
```
利用可能なPVが無い！ストレージクラスがセットされていない！と怒られている気がします．
そこでPVCに既存のストレージクラスを追加してみます．
```
NAME         PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  36d
```
```pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: chaos-mongodb
  namespace: litmus
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  volumeMode: Filesystem
  #下記を追記
  storageClassName: local-path
```
PVCを消して新しくapplyしてみます．
```
kubectl delete pvc chaos-mongodb -n litmus
```
```
kubectl apply -f pvc.yaml
```
新しいPVCを使用するためにpodを削除
```
kubectl delete pod --all -n litmus
```
```
pod "chaos-litmus-auth-server-65bbc55ddf-45nqc" deleted
pod "chaos-litmus-frontend-588f4c66cf-6cqn2" deleted
pod "chaos-litmus-server-7fb7954696-2m7j2" deleted
pod "chaos-mongodb-79b779578-hvmff" deleted
```
### 確認
```
kubectl get pod -n litmus
```
```
NAME                                        READY   STATUS    RESTARTS   AGE
chaos-litmus-auth-server-65bbc55ddf-8zsqd   1/1     Running   0          46s
chaos-litmus-frontend-588f4c66cf-zn2ww      1/1     Running   0          46s
chaos-litmus-server-7fb7954696-dvhs4        1/1     Running   0          46s
chaos-mongodb-79b779578-kxvnt               1/1     Running   0          46s
```
全てのPodが起動しました！
# Litmus Chaosを使ってみる
## アクセス
kubectl port-forwardを使ってfrontendにアクセスしてみます．
```
kubectl get svc -n litmus
```
```
NAME                               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
chaos-litmus-auth-server-service   ClusterIP   10.43.240.149   <none>        9003/TCP,3030/TCP   18m
chaos-litmus-frontend-service      ClusterIP   10.43.16.75     <none>        9091/TCP            18m
chaos-litmus-server-service        ClusterIP   10.43.158.78    <none>        9002/TCP,8000/TCP   18m
chaos-mongodb                      ClusterIP   10.43.66.109    <none>        27017/TCP           18m
```
kubectlを実行しているノードの9091番ポートをfrontendサービスに転送
```
kubectl -n litmus port-forward svc/chaos-litmus-frontend-service 9091:9091 --address 0.0.0.0 &
```
ブラウザからアクセスすると次のような画面が出てきます．（デフォルトではユーザ名：admin，パスワード：litmus）
![スクリーンショット 2023-07-01 180029.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690612/b3971748-4689-f7f1-ada9-d3c6ededae37.png)
## カオス実験
メニューのChaos Scenariosを選択し，右上のSchedule a Chaos Scenarioからカオス実験をスケジュールすることができます．
![スクリーンショット 2023-07-01 180422.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690612/0b89daf1-286a-c5be-9c34-a8af8bbb45c8.png)
今回はChaosHubsからKubernetesクラスタ内の任意のPodを削除するpod-deleteを試してみたいと思います．
下記のgeneric/pod-deleteを選択
![スクリーンショット 2023-07-01 181239.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690612/06c063f1-6597-d75f-e8a8-a844f2d9689f.png)
設定が終わると先ほどのchaos Scenariosに実行中のカオス実験が表示されます．
![スクリーンショット 2023-07-01 182101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690612/d9ae77e2-7397-15de-f284-30951e961e15.png)
実験が終了すると結果の詳細を確認することができます．
![スクリーンショット 2023-07-01 182547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690612/01b24d67-4f39-71ec-0abf-0e6ddd06b92f.png)
# 終わりに
Litmus Chaosのインストールから簡単なカオス実験までをまとめてみました．
個人的にはカオス実験のシナリオをGUIを使って直感的に操作できるのがとっても良いと思いました！
それでは良いカオス体験を！