
ランダムなKubernetesポッドを定期的に終了させ、任意のポッド障害時のシステム挙動をテストします。namespace、ラベル、アノテーション、スケジュールフィルターに対応し、制御されたカオス実験が可能です。
chaoskube は Kubernetes クラスター内のランダムな Pod を定期的に停止します。

システムが任意の Pod 障害下でどのように動作するかをテストします。
実行すると、デフォルトでは10分ごとに任意の名前空間の Pod を1つ停止します。
$ chaoskube
INFO[0000] starting up dryRun=true interval=10m0s version=v0.21.0
INFO[0000] connecting to cluster master="https://kube.you.me" serverVersion=v1.10.5+coreos.0
INFO[0000] setting pod filter annotations= labels= minimumAge=0s namespaces=
INFO[0000] setting quiet times daysOfYear="[]" timesOfDay="[]" weekdays="[]"
INFO[0000] setting timezone location=UTC name=UTC offset=0
INFO[0001] terminating pod name=kube-dns-v20-6ikos namespace=kube-system
INFO[0601] terminating pod name=nginx-701339712-u4fr3 namespace=chaoskube
INFO[1201] terminating pod name=kube-proxy-gke-earthcoin-pool-3-5ee87f80-n72s namespace=kube-system
INFO[1802] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[2402] terminating pod name=heapster-v1.2.0-1107848163-bhtcw namespace=kube-system
INFO[3003] terminating pod name=l7-default-backend-v1.0-o2hc9 namespace=kube-system
INFO[3603] terminating pod name=heapster-v1.2.0-1107848163-jlfcd namespace=kube-system
INFO[4203] terminating pod name=nginx-701339712-bfh2y namespace=chaoskube
INFO[4804] terminating pod name=nginx-701339712-51nt8 namespace=chaoskube
...
chaoskube は、対象 Pod を名前空間、ラベル、アノテーション、および経過時間でフィルタリングしたり、特定の曜日、時間帯、年間の日付をカオスから除外したりできます。
chaoskube は Helm でインストールできます。Helm のクイックスタートガイドに従った後、chaoskube チャートをインストールしてください。
$ helm repo add chaoskube https://linki.github.io/chaoskube/
$ helm install chaoskube chaoskube/chaoskube --atomic --namespace=chaoskube --create-namespace
設定方法やその他の便利な Helm チャートについては、kubeapps.com の chaoskube を参照してください。
サンプルマニフェスト を参照してください。提供されている ClusterRole を使用して、chaoskube に適切な 権限を必ず付与してください。
デフォルトでは chaoskube は無害で、何も停止しません。対象クラスターを検証したら、--no-dry-run フラグを指定してドライランモードを無効にできます。また、デプロイメントに合わせて、より積極的な間隔やその他のサポートされているフラグを指定することもできます。
Kubernetes クラスター内で実行していて、同じクラスターを対象にしたい場合は、これだけで十分です。
別のクラスターを対象にしたい場合やローカルで実行したい場合は、--master フラグでクラスターを指定するか、--kubeconfig フラグで有効な kubeconfig を指定してください。デフォルトでは、ホームディレクトリの標準的な kubeconfig パスを使用します。つまり、その中で現在のコンテキストとして設定されているものが対象になります。
カオスの量を増減したい場合は、--interval フラグで停止間隔を変更してください。あるいは、chaoskube デプロイメントのレプリカ数を増やすこともできます。
chaoskube はデフォルトで、システム Pod や自身を含む、すべての名前空間の任意の Pod を停止することに注意してください。
chaoskube は、実行中であることを確認するために使用できるシンプルな HTTP エンドポイントを提供します。これは Kubernetes の liveness および readiness プローブに使用できます。デフォルトではポート 8080 でリッスンします。無効にするには、chaoskube に --metrics-address="" を渡してください。
ただし、ラベル、アノテーション、名前空間のセレクター、Pod 名の包含/除外パターン、および最小経過時間の設定を指定することで、chaoskube の検索範囲を制限できます。
$ chaoskube --labels 'app=mate,chaos,stage!=production'
...
INFO[0000] setting pod filter labels="app=mate,chaos,stage!=production"
これにより、ラベル app が mate に設定され、ラベル chaos が何らかの値に設定され、ラベル stage が production に設定されていない、または未設定のすべての Pod が選択されます。
対象 Pod を名前空間セレクターでフィルタリングすることもできます。
$ chaoskube --namespaces 'default,testing,staging'
...
INFO[0000] setting pod filter namespaces="default,staging,testing"
これにより、default、staging、testing の3つの名前空間の Pod にフィルタリングされます。
名前空間は、名前空間ラベルセレクターによってさらにフィルタリングできます。
$ chaoskube --namespace-labels='!integration'
...
INFO[0000] setting pod filter namespaceLabels="!integration"
これにより、ラベル integration が付いた名前空間のすべての Pod が除外されます。
対象 Pod は OwnerReference の kind セレクターでフィルタリングできます。
$ chaoskube --kinds '!DaemonSet,!StatefulSet'
...
INFO[0000] setting pod filter kinds="!DaemonSet,!StatefulSet"
これにより、DaemonSet と StatefulSet の Pod が除外されます。
$ chaoskube --kinds 'DaemonSet'
...
INFO[0000] setting pod filter kinds="DaemonSet"
これにより、DaemonSet の Pod のみが含まれます。
注意: include フィルターを使用すると、OwnerReference が定義されていないすべての Pod が自動的に除外されます。
Pod を名前でフィルタリングできます:
$ chaoskube --included-pod-names 'foo|bar' --excluded-pod-names 'prod'
...
INFO[0000] setting pod filter excludedPodNames=prod includedPodNames="foo|bar"
これにより、名前に 'foo' または 'bar' を含み、'prod' を 含まない Pod だけが対象になります。
名前空間を除外したり、ラベルやアノテーションのセレクターと組み合わせて使用したりすることもできます。
$ chaoskube \
--labels 'app=mate,chaos,stage!=production' \
--annotations '!scheduler.alpha.kubernetes.io/critical-pod' \
--namespaces '!kube-system,!production'
...
INFO[0000] setting pod filter annotations="!scheduler.alpha.kubernetes.io/critical-pod" labels="app=mate,chaos,stage!=production" namespaces="!kube-system,!production"
これにより、上記のラベルセレクターの検索範囲がさらに制限され、kube-system と production 名前空間の Pod も除外され、クリティカルとマークされたすべての Pod も無視されます。
アノテーションセレクターを使用して、chaoskube をクラスターアドオンとして実行し、必要に応じて Pod が終了をオプトインできるようにすることもできます。たとえば、次のように chaoskube を実行できます:
$ chaoskube --annotations 'chaos.alpha.kubernetes.io/enabled=true' --debug
...
INFO[0000] setting pod filter annotations="chaos.alpha.kubernetes.io/enabled=true"
DEBU[0000] found candidates count=0
DEBU[0000] no victim found
そのアノテーションをすでにどこかで使用していない限り、最初はすべての Pod が無視されます(デバッグモードで候補の数を確認できます)。その後、Pod に chaos.alpha.kubernetes.io/enabled=true というアノテーションを付けることで、個々のデプロイメントを選択的にカオスモードにオプトインできます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
template:
metadata:
annotations:
chaos.alpha.kubernetes.io/enabled: "true"
spec:
...
--minimum-age フラグを使用すると、最近開始された Pod を除外できます。
$ chaoskube --minimum-age 6h
...
INFO[0000] setting pod filter minimumAge=6h0m0s
カオスを導入する時間を、曜日、時間帯、年間の日付、またはそれらすべてを組み合わせて制限できます。
--excluded-weekdays オプションで曜日の略称のカンマ区切りリスト、--excluded-times-of-day オプションで時間帯のカンマ区切りリスト、--excluded-days-of-year オプションで年間の日付のカンマ区切りリストを指定し、それらを解釈する --timezone を指定します。
$ chaoskube \
--excluded-weekdays=Sat,Sun \
--excluded-times-of-day=22:00-08:00,11:00-13:00 \
--excluded-days-of-year=Apr1,Dec24 \
--timezone=Europe/Berlin
...
INFO[0000] setting quiet times daysOfYear="[Apr 1 Dec24]" timesOfDay="[22:00-08:00 11:00-13:00]" weekdays="[Saturday Sunday]"
INFO[0000] setting timezone location=Europe/Berlin name=CET offset=1
UTC または Local を使用するか、(IANA) tz データベース からタイムゾーン名を選択してください。ローカルマシンで chaoskube をテストしている場合は、Local が最も適切です。chaoskube をクラスターにデプロイする場合は、特定のタイムゾーン(たとえば、チームメンバーの大半が住んでいる場所)を指定してデプロイする必要があります。これにより、チームと chaoskube が、特定の曜日がいつ始まりいつ終わるかについて共通の理解を持てるようになります。チームが複数のタイムゾーンにまたがっている場合は、デフォルトでもある UTC を選ぶのがおそらく最善です。間違ったタイムゾーンを選ぶと、特定の曜日の意味がサーバーとの間で数時間ずれてしまいます。
Kubernetes クラスターにカオスを発生させることができる他のプロジェクトがいくつかあります。
chaoskube にはない機能です。また、アプリケーションを構成する Pod のグループを認識して特別に扱うこともできます。たとえば、アプリケーションのすべての Pod を一度に停止できます。kube-mokey は、設定オプションによるグローバルな対象フィルタリングに加え、アノテーションによるカオスへのオプトインを Pod に許可します。個々のアプリは独自の方法でオプトインできます。たとえば、アプリAは毎平日 1 Pod の停止を要求でき、より勇敢なアプリBは Pod の 50% の停止を要求できます。Netflix の ChaosMonkey で使用されている設定ファイルと同様の形式に対応しています。kubectl を数行の bash で使用する、非常にシンプルなランダム Pod キラーです。名前空間と間隔を指定すると、その間隔ごとにその名前空間のランダムな Pod を停止します。初期の とほぼ同じです。このプロジェクトは、何人かの素晴らしいコントリビューターのアイデアと助けがなければ現在の姿にはなっていませんでした:
お気軽に issue を作成するか、プルリクエストを送ってください。
| Option | Environment | Description | Default |
|---|
--interval | CHAOSKUBE_INTERVAL | Pod 停止の間隔 | 10m |
--labels | CHAOSKUBE_LABELS | Pod をフィルタリングするためのラベルセレクター | (すべてに一致) |
--annotations | CHAOSKUBE_ANNOTATIONS | Pod をフィルタリングするためのアノテーションセレクター | (すべてに一致) |
--kinds | CHAOSKUBE_KINDS | Pod をフィルタリングするための Owner の kind セレクター | (すべての kind) |
--namespaces | CHAOSKUBE_NAMESPACES | Pod をフィルタリングするための名前空間セレクター | (すべての名前空間) |
--namespace-labels | CHAOSKUBE_NAMESPACE_LABELS | 名前空間とその Pod をフィルタリングするためのラベルセレクター | (すべての名前空間) |
--included-pod-names | CHAOSKUBE_INCLUDED_POD_NAMES | 含める Pod 名の正規表現パターン | (すべて含む) |
--excluded-pod-names | CHAOSKUBE_EXCLUDED_POD_NAMES | 除外する Pod 名の正規表現パターン | (除外なし) |
--excluded-weekdays | CHAOSKUBE_EXCLUDED_WEEKDAYS | カオスを停止する曜日(例: "Sat,Sun") | (除外する曜日なし) |
--excluded-times-of-day | CHAOSKUBE_EXCLUDED_TIMES_OF_DAY | カオスを停止する時間帯(例: "22:00-08:00") | (除外する時間帯なし) |
--excluded-days-of-year | CHAOSKUBE_EXCLUDED_DAYS_OF_YEAR | カオスを停止する年間の日付(例: "Apr1,Dec24") | (除外する日付なし) |
--timezone | CHAOSKUBE_TIMEZONE | tz データベースのタイムゾーン(例: "America/New_York", "UTC", "Local") | (UTC) |
--max-runtime | CHAOSKUBE_MAX_RUNTIME | chaoskube が終了するまでの最大実行時間 | -1s (無期限) |
--max-kill | CHAOSKUBE_MAX_KILL | 1 間隔あたりに終了する Pod の最大数を指定します | 1 |
--minimum-age | CHAOSKUBE_MINIMUM_AGE | Pod をフィルタリングするための最小経過時間 | 0s (すべての Pod に一致) |
--dry-run | CHAOSKUBE_DRY_RUN | Pod を停止せず、実行されていたであろう操作をログに記録するだけ | true |
--log-format | CHAOSKUBE_LOG_FORMAT | ログメッセージの形式を指定します。オプションは text と json | text |
--log-caller | CHAOSKUBE_LOG_CALLER | ログメッセージに呼び出し元の関数名と場所を含める | false |
--slack-webhook | CHAOSKUBE_SLACK_WEBHOOK | 通知用の Slack ウェブフックのアドレス | disabled |
--client-namespace-scope | CHAOSKUBE_CLIENT_NAMESPACE_SCOPE | Kubernetes API 呼び出しを指定された名前空間に限定する | (すべての名前空間) |
chaoskube