ChaosMesh@システムテスト¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. ChaosMesh の仕組み¶
アーキテクチャ¶
ChaosMesh は、chaos-dashboard、chaos-controller-manager、chaos-daemon、といったコンポーネントから構成されている。
他のカオスエンジニアリングツール (例:Chaos monkey、Chaos Kong) と比べて、Kubernetes により合った手法でカオスエンジニアリングを実行できる。

注入できる障害¶
▼ Kubernetes¶
- Pod の障害 (再起動など)
▼ AWS¶
- Amazon EC2 Node の障害 (再起動など)
▼ Google Cloud¶
- Google Compute Engine の障害 (再起動など)
02. セットアップ¶
マニフェストとして¶
チャートとして¶
GitHub リポジトリから chaos-mesh チャートをインストールし、リソースを作成する。
$ helm repo add <チャートリポジトリ名> https://charts.chaos-mesh.org
$ helm repo update
$ kubectl create namespace chaos-testing
$ helm install <Helmリリース名> <チャートリポジトリ名>/chaos-mesh -n chaos-testing --version <バージョンタグ>
03. 障害例¶
Podを一時的に停止させる¶
対象のPodを一時的に使用できない状態にし、他のPodへの切り替えやサービスの継続性を確認する。
apiVersion: chaos-mesh.org/v1alpha1
kind: Schedule
metadata:
namespace: system
name: foo-pod-failure-one-mode
annotations:
# 平常時は障害注入を無効化しておく
experiment.chaos-mesh.org/pause: "true"
spec:
schedule: "30 10 21 3 *"
startingDeadlineSeconds: 60
concurrencyPolicy: Forbid
historyLimit: 1
type: PodChaos
# 注入する障害の内容を設定する
podChaos:
selector:
namespaces:
- system
labelSelectors:
app.kubernetes.io/name: foo
# 対象のPodからランダムに1個を選択する
mode: one
# 選択したPodを一時的に使用できない状態にする
action: pod-failure
# 障害を1分間継続する
duration: 1m
gracePeriod: 0
Podを強制的に削除する¶
対象のPodを強制的に削除し、KubernetesによるPodの再作成とサービスの復旧を確認する。
apiVersion: chaos-mesh.org/v1alpha1
kind: Schedule
metadata:
namespace: system
name: foo-pod-kill-one-mode
annotations:
# 平常時は障害注入を無効化しておく
experiment.chaos-mesh.org/pause: "true"
spec:
schedule: "35 10 21 3 *"
startingDeadlineSeconds: 60
concurrencyPolicy: Forbid
historyLimit: 1
type: PodChaos
# 注入する障害の内容を設定する
podChaos:
selector:
namespaces:
- system
labelSelectors:
app.kubernetes.io/name: foo
# 対象のPodからランダムに1個を選択する
mode: one
# 選択したPodを強制的に削除する
action: pod-kill
レスポンスを遅延させる¶
対象のPodに対する通信へ遅延を発生させ、レスポンスの遅延やタイムアウト時の動作を確認する。
apiVersion: chaos-mesh.org/v1alpha1
kind: Schedule
metadata:
namespace: system
name: foo-response-delay-one-mode
annotations:
# 平常時は障害注入を無効化しておく
experiment.chaos-mesh.org/pause: "true"
spec:
schedule: "40 10 21 3 *"
startingDeadlineSeconds: 60
concurrencyPolicy: Forbid
historyLimit: 1
type: NetworkChaos
# 注入する障害の内容を設定する
networkChaos:
action: delay
selector:
namespaces:
- system
labelSelectors:
app.kubernetes.io/name: foo
# 対象のPodからランダムに1個を選択する
mode: one
# 送信方向と受信方向の両方に遅延を発生させる
direction: both
# 500ミリ秒の遅延と最大100ミリ秒の揺らぎを発生させる
delay:
latency: 500ms
jitter: 100ms
correlation: "50"
# 障害を2分間継続する
duration: 2m
パケットを損失させる¶
対象のPodに対する通信でパケット損失を発生させ、通信エラーやリトライ時の動作を確認する。
apiVersion: chaos-mesh.org/v1alpha1
kind: Schedule
metadata:
namespace: system
name: foo-network-loss-one-mode
annotations:
# 平常時は障害注入を無効化しておく
experiment.chaos-mesh.org/pause: "true"
spec:
schedule: "45 10 21 3 *"
startingDeadlineSeconds: 60
concurrencyPolicy: Forbid
historyLimit: 1
type: NetworkChaos
# 注入する障害の内容を設定する
networkChaos:
action: loss
selector:
namespaces:
- system
labelSelectors:
app.kubernetes.io/name: foo
# 対象のPodからランダムに1個を選択する
mode: one
# 送信方向と受信方向の両方でパケットを損失させる
direction: both
# 20パーセントの確率でパケットを損失させる
loss:
loss: "20"
correlation: "25"
# 障害を2分間継続する
duration: 2m
CPUに負荷をかける¶
対象のPodのCPU使用率を高め、処理性能の低下やオートスケーリング時の動作を確認する。
apiVersion: chaos-mesh.org/v1alpha1
kind: Schedule
metadata:
namespace: system
name: foo-cpu-stress-one-mode
annotations:
# 平常時は障害注入を無効化しておく
experiment.chaos-mesh.org/pause: "true"
spec:
schedule: "50 10 21 3 *"
startingDeadlineSeconds: 60
concurrencyPolicy: Forbid
historyLimit: 1
type: StressChaos
# 注入する障害の内容を設定する
stressChaos:
# 対象のPodからランダムに1個を選択する
mode: one
selector:
namespaces:
- system
labelSelectors:
app.kubernetes.io/name: foo
# 2個のワーカーでCPU使用率を80パーセントまで高める
stressors:
cpu:
workers: 2
load: 80
# 障害を3分間継続する
duration: 3m
メモリに負荷をかける¶
対象のPodでメモリを消費させ、メモリ不足やPodの再起動時の動作を確認する。
apiVersion: chaos-mesh.org/v1alpha1
kind: Schedule
metadata:
namespace: system
name: foo-memory-stress-one-mode
annotations:
# 平常時は障害注入を無効化しておく
experiment.chaos-mesh.org/pause: "true"
spec:
schedule: "55 10 21 3 *"
startingDeadlineSeconds: 60
concurrencyPolicy: Forbid
historyLimit: 1
type: StressChaos
# 注入する障害の内容を設定する
stressChaos:
# 対象のPodからランダムに1個を選択する
mode: one
selector:
namespaces:
- system
labelSelectors:
app.kubernetes.io/name: foo
# 1個のワーカーで256MBのメモリを消費する
stressors:
memory:
workers: 1
size: 256MB
# 障害を3分間継続する
duration: 3m