目次
こんにちは、エンジニアのいずみです。
Chaos Meshでカオスエンジニアリング その1です。
その1はGoogleCloud上へデプロイして動かしてみよう編です。
Chaos Meshについて
Choas Meshとは
Chaos MeshはKubernetesに様々な障害のシミュレーションを行い、障害シナリオをオーケストレーションすることができ、開発、テスト、本番環境など様々な環境で現実に起こり得る様々な障害を手軽にシミュレーションして、システムの問題を発見することができます。
具体的なできることを公式ドキュメントから抜粋すると以下になります。
- 基本的なリソース障害:
- PodChaos : Podの再起動、Podの永続的な使用不可状態、特定のPod内の特定のコンテナ障害などのPod障害。
- NetworkChaos : ネットワーク遅延、パケット損失、パケット障害、ネットワーク パーティションなどのネットワーク障害。
- DNSChaos : DNSドメイン名の解析失敗や間違ったIPアドレスの返送などのDNS障害。
- HTTPChaos : HTTP通信遅延などのHTTP通信障害。
- StressChaos : CPU、メモリの負荷。
- IOChaos : I/O遅延、読み取りおよび書き込み障害など、アプリケーション ファイルのI/O障害。
- TimeChaos : タイムジャンプ例外。
- KernelChaos : アプリケーション メモリ割り当ての例外などのカーネル障害。
- プラットフォーム障害:
- AWSChaos : AWSノードの再起動などのAWSプラットフォームの障害。
- GCPChaos : GCPノードの再起動などのGCPプラットフォームの障害。
- アプリケーション障害:
- JVMChaos : 関数呼び出しの遅延などのJVMアプリケーションの障害。
Chaos Meshの構築
GKEクラスタの作成
Chaos Meshをデプロイするクラスタを作成します。
また、このクラスタは障害をシミュレートする対象のアプリケーションが稼働するクラスタでもあります。
$ gcloud container clusters create chaos \
--release-channel regular \
--zone asia-northeast1-a \
--node-locations asia-northeast1-a \
--project grasys-dev
Chaso Meshのインストール
インストールの方法としてはKubernetesのパッケージマネージャである「helm」を利用する方法、インストールスクリプトを利用する方法がありますが今回はhelmを利用します。
helmリポジトリの準備
$ helm repo add chaos-mesh https://charts.chaos-mesh.org
"chaos-mesh" has been added to your repositories
$ helm repo list
NAME URL
chaos-mesh https://charts.chaos-mesh.org
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "chaos-mesh" chart repository
Update Complete. ⎈Happy Helming!⎈
Choas Meshのインストール
# namespaceの作成
$ kubectl create ns chaos-mesh
# インストール
# デフォルトのインストールオプションではNodePortで構成されるのでClusterIPに変更します
$ helm install chaos-mesh chaos-mesh/chaos-mesh -n=chaos-mesh \
--set chaosDaemon.runtime=containerd \
--set chaosDaemon.socketPath=/run/containerd/containerd.sock \
--set dashboard.service.type=ClusterIP --version 2.7.2
Ingressを追加する
インストールした直後にDashboardへアクセスする為にはchaos-dashboardのサービスへportforwardを行う必要がありますが、毎回portforwardを行うのは面倒なのでingressを作成して公開します。
また、ドキュメントではnginx controllerを利用していますが、GKEのデフォルトingressを利用する用に以下のmanifestをデプロイします。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: chaos-mesh-ingress
namespace: chaos-mesh
spec:
defaultBackend:
service:
name: chaos-dashboard
port:
number: 2333
$ kubectl apply -f ingress.yaml
$ kubectl get ingress -n chaos-mesh
$ kubectl get ingress -n chaos-mesh
NAME CLASS HOSTS ADDRESS PORTS AGE
chaos-mesh-ingress <none> * xx.xx.xx.xx 80 44h
ingressが作成されるとingressのglobal ipでDashbordを公開されます。
http://xx.xx.xx.xxへアクセスするとDashbordへアクセスすることができます。
Dashbordへのログイン
Chaos MeshはRBAC Authorizationを使用してユーザー権限を管理しているため、Dashbordへアクセスすると以下のようなtoken入力ポップアップが表示されます。「click here to generate」リンクからRBAC作成用のyaml出力画面へ遷移することができ必要なmanifestを作成できます。
今回はCluster scope、Manager権限で作成します。
$ kubectl apply -f rbac.yaml
$ kubectl create token 'rbac.yamlで定義したServiceAccount名'
tokenが出力
Token入力
NameとTokenを入力してSubmitするとログインできます。

RBAC作成用yaml出力

これでChaos MeshのDashbordへログインできました。
ここからは実際に障害発生のシミュレーションをしていきますが、#1では正常に動作するかをpodのkillで確認して詳細な障害発生シミュレーションは次回に記載します。
障害のシミュレーション
障害発生対象のpodをデプロイします。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
$ kubectl apply -f nginx.yaml
メニュー「Experiments」 > 「New experiment」へ進みシミュレーションを作成します。
今回の設定は「Kubernetes」の「Pod Fault」から「Pod Kill」を選択します。
「Grace Period」は30にしているので30秒後に先ほどデプロイしたnginxのpodがkillされるはずです。

Namespace、Label Selectorsで対象のpodを指定、NameにはExperimentの名称を設定します。


Submitボタンクリック後すぐに既存のpodがkillされ新しいpodが起動してきました。
これで基本的な動作は確認できました。
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx-5869d7778c-cv89w 1/1 Running 0 41m
nginx-5869d7778c-cv89w 1/1 Terminating 0 41m
nginx-5869d7778c-cv89w 1/1 Terminating 0 41m
nginx-5869d7778c-qw9ph 0/1 Pending 0 0s
nginx-5869d7778c-qw9ph 0/1 Pending 0 1s
nginx-5869d7778c-qw9ph 0/1 ContainerCreating 0 1s
nginx-5869d7778c-qw9ph 1/1 Running 0 3s
ここまででChaos Meshのインストール方法と基本的なExperimentの設定を確認しました。
次回は色々な障害のシミュレーションを行なっていきたいと思います。

