Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
kube-monkey — Kubernetesクラスター向けのNetflix Chaos Monkeyの実装 | Kitploit
ツール/GitHubGitHub/asobti/kube-monkey
カオスエンジニアリング
GitHubasobti/kube-monkey

kube-monkey

Kubernetesクラスター向けのNetflix Chaos Monkeyの実装

リポジトリを見る
3.1k25411日前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Build Go Report Card License Docker Pulls Artifact Hub

kube-monkey は、Kubernetes クラスター向けの Netflix の Chaos Monkey の実装です。クラスター内の Kubernetes (k8s) Pod をランダムに削除し、障害に強いサービスの開発を促進・検証します。

Kubernetes Slack の #kube-monkey に参加しましょう。


kube-monkey は、平日の設定済みの時刻(run_hour、デフォルトは午前 8 時)に実行され、同じ日のうちにランダムな Pod 停止が発生する Deployment のスケジュールを構築します。ランダムな Pod 停止が発生する可能性のある時間帯は設定可能で、デフォルトは午前 10 時から午後 4 時です。

kube-monkey はネームスペースのリストで設定でき、

  • ブラックリストに登録できます(ブラックリストに登録されたネームスペース内の Deployment には一切触れません)

ブラックリストを無効にするには、blacklisted_namespaces 設定パラメータに [""] を指定します。

Chaos へのオプトイン

kube-monkey はオプトインモデルで動作し、kube-monkey による Pod の終了に明示的に同意した Kubernetes (k8s) アプリケーションに対してのみ終了をスケジュールします。

オプトインは、k8s アプリケーションに以下のラベルを設定することで行われます:

kube-monkey/enabled: kube-monkey にオプトインするには "enabled" に設定します
kube-monkey/mtbf: 平均故障間隔 (MTBF)。整数と単位で指定します。d は日、h は時間、m は分を表します。たとえば "3d" に設定すると、k8s アプリケーションはおよそ 3 営業日に 1 回 Pod が停止されると見込めます。"2h" に設定すると、2 時間ごとに Pod を失うと見込めます。単位なしの値は日として扱われるため、"3" と "3d" は同じ意味です。平均故障間隔の最短は 1 分です。すべての終了は毎日の実行ウィンドウ内(start_hour と end_hour を参照)で発生することに注意してください。したがって、1 日より短い mtbf の場合、その日の終了はすべてそのウィンドウに収められます。
kube-monkey/identifier: k8s アプリケーションの一意の識別子です。Pod は k8s アプリケーションからラベルを継承するため、k8s アプリケーションに属する Pod を識別するために使用されます。つまり、kube-monkey がアプリ が犠牲者として登録されていることを検出した場合、kube-monkey はラベル を持つすべての Pod を探し、どの Pod が停止対象の候補かを判断します。この値はアプリの名前と同じに設定することを推奨します。 : デフォルトの動作では、kube-monkey はアプリの Pod を 1 つだけ停止します。この動作は値を設定することで上書きできます:

  • kill-all: kube-monkey にステータスに関係なく(準備完了でない、実行中でない Pod も含む)すべての Pod を停止させたい場合に指定します。kill-value は不要です。このラベルは慎重に使用してください。
  • fixed: kill-value で指定した数の実行中の Pod を停止したい場合に指定します。過剰に指定した場合は、実行中のすべての Pod を停止し、警告を発行します。
  • random-max-percent: kill-value で停止できる 最大 % を指定します。スケジュールされた時刻に、実行中の Pod の一様な ランダムで指定された % が終了されます。
  • fixed-percent: kill-value で停止できる 固定 % を指定します。スケジュールされた時刻に、指定された 固定 % の実行中の Pod が終了されます。

kube-monkey/kill-value: kill-mode の値を指定します

  • fixed の場合、停止する Pod の整数を指定します
  • random-max-percent の場合、kube-monkey が停止できる Pod の最大 % を指定するために 0〜100 の数値を指定します
  • fixed-percent の場合、停止する Pod の % を指定するために 0〜100 の数値を指定します

オプトインした Deployment が purge ごとに 1 つの Pod を停止する例

root@kitploit:~
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monkey-victim
  namespace: app-namespace
spec:
  template:
    metadata:
      labels:
        kube-monkey/enabled: enabled
        kube-monkey/identifier: monkey-victim
        kube-monkey/mtbf: '2'
        kube-monkey/kill-mode: "fixed"
        kube-monkey/kill-value: '1'
[... omitted ...]

新しいバージョンの Kubernetes では、k8s アプリケーションのメタデータにもラベルを追加する必要がある場合があります。

root@kitploit:~
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: monkey-victim
  namespace: app-namespace
  labels:
    kube-monkey/enabled: enabled
    kube-monkey/identifier: monkey-victim
    kube-monkey/mtbf: '2'
    kube-monkey/kill-mode: "fixed"
    kube-monkey/kill-value: '1'
spec:
  template:
    metadata:
      labels:
        kube-monkey/enabled: enabled
        kube-monkey/identifier: monkey-victim
[... omitted ...]

apiserver の上書き

ユースケース:

  • client-go はコード内に // TODO: switch to using cluster DNS. という注記があるとおり、クラスタ DNS を明示的にサポートしていないため、apiserver を上書きする必要がある場合があります。
  • 認証なしのシステムを実行している場合、http の apiserver エンドポイントを強制する必要がある場合があります。

apiserver を上書きするには、config.toml ファイルで指定します

root@kitploit:~
[kubernetes]
host="https://your-apiserver-url.com:apiport"

kube-monkey の動作

スケジュール時刻

スケジュールは平日に 1 日 1 回実行されます。これは、その日の終了スケジュールが生成されるタイミングです。スケジュール時に kube-monkey は以下を行います:

  1. 対象となる k8s アプリケーションのリストを生成します(オプトインしており、ブラックリストに登録されていない k8s アプリケーション(指定されている場合)、およびホワイトリストに登録されている k8s アプリケーション(指定されている場合))
  2. 対象となる各 k8s アプリケーションについて、kube-monkey/mtbf から今日停止する Pod の数を計算します。アプリは 1 日に 24h/mtbf 回停止されるため、mtbf が 1 日以上なら最大 1 回の終了、それより短ければ複数回の終了になります
  3. 各終了について、Pod が停止されるランダムな時刻を計算します

終了時刻

これは、犠牲者となった k8s アプリケーションの Pod が停止される、日中にランダムに生成された時刻です。 終了時刻に kube-monkey は以下を行います:

  1. k8s アプリケーションがまだ対象かどうかを確認します(スケジュール後にオプトアウト、ブラックリスト登録、またはホワイトリストからの削除が行われていないか)
  2. k8s アプリケーションの kill-mode と kill-value が更新されているかどうかを確認します
  3. kill-mode と kill-value に応じて Pod の停止を実行します

Docker イメージ

kube-monkey の Docker イメージは DockerHub にあります。

ビルド

リポジトリをクローンしてコンテナをビルドします。

root@kitploit:~
go get github.com/asobti/kube-monkey
cd $GOPATH/src/github.com/asobti/kube-monkey
make build
make container

設定

kube-monkey は環境変数または /etc/kube-monkey/config.toml に配置された toml ファイルで設定します。kube-monkey のデプロイ前に configmap が存在している必要があります。

設定キーと説明は config/param/param.go にあります。

config.toml ファイルの例

root@kitploit:~
[kubemonkey]
dry_run = true                           # Terminations are only logged
run_hour = 8                             # Run scheduling at 8am on weekdays
start_hour = 10                          # Don't schedule any pod deaths before 10am
end_hour = 16                            # Don't schedule any pod deaths after 4pm
blacklisted_namespaces = ["kube-system"] # Critical apps live here
time_zone = "America/New_York"           # Set tzdata timezone example. Note the field is time_zone not timezone

環境変数の例

root@kitploit:~
KUBEMONKEY_DRY_RUN=true
KUBEMONKEY_RUN_HOUR=8
KUBEMONKEY_START_HOUR=10
KUBEMONKEY_END_HOUR=16
KUBEMONKEY_BLACKLISTED_NAMESPACES=kube-system
KUBEMONKEY_TIME_ZONE=America/New_York

デバッグモードを有効にして kube-monkey の動作をテストする設定例

注:この設定では、startHour と endHour で何を設定しても、60 秒ごとに Pod への攻撃が継続されます。

root@kitploit:~
[debug]
enabled= true
schedule_immediate_kill= true

通知

Kube-monkey は通知をサポートしており、攻撃後に任意のエンドポイントへ通知できます。 Slack の Webhook またはカスタム API を使用できます。

HTTP エンドポイントに攻撃通知を投稿する設定例

root@kitploit:~
[notifications]
  enabled = true
  reportSchedule = true
  [notifications.attacks]
    endpoint = "http://url1"
    message = "message1"
    headers = ["header1Key:header1Value","header2Key:header2/Value"]

プレースホルダー

メッセージでは以下のプレースホルダーを使用できます:

  • {$name}: 犠牲者の名前
  • {$kind}: 犠牲者の種類
  • {$namespace}: 犠牲者のネームスペース
  • {$timestamp}: Unix エポックからの攻撃時刻(ミリ秒)
  • {$time}: 攻撃時刻
  • {$date}: 攻撃日
  • {$error}: 結果のエラー(ある場合)
  • {$kubemonkeyid}: kube-monkey ID(KUBE_MONKEY_ID 環境変数で設定、それ以外の場合は空)
root@kitploit:~
  message: '{
            "what": "Kube-monkey(${kubemonkeyid}) attack of {$name} in {$namespace}",
            "who": "{$name}",
            "when": {$timestamp}
           }'

ヘッダーは、環境変数の値を取得するための特別なプレースホルダーをサポートしています。 これは、保護されたエンドポイントを持つ API を呼び出す場合に便利です。 典型的なシナリオは、Kubernetes Secret に保存された API トークンを Kube-monkey コンテナに渡し、それを環境変数を介して渡したい場合です。

root@kitploit:~
headers = ["api-key:{$env:API_TOKEN}", "Content-Type:application/json"]

{$env:API_TOKEN} は環境変数 API_TOKEN の値に置き換えられます。

環境変数が存在しない場合でも、通知呼び出しはキャンセルされません。値は空文字列として解決され、ログに警告が表示されます。

デプロイ

手動

  1. まず、kube-monkey を実行する予定のネームスペース(たとえば kube-system ネームスペース)に、必要な kube-monkey-config-map configmap をデプロイします。キー名を config.toml として定義してください。

例:kubectl create configmap km-config --from-file=config.toml=km-config.toml または kubectl apply -f km-config.yaml

  1. Kubernetes クラスター内で、他のネームスペースの Pod を停止する権限を持つネームスペース(例:kube-system)で、kube-monkey を k8s アプリケーションとして実行します。

サンプルの Kubernetes yaml ファイルについては、examples/ ディレクトリを参照してください。

  1. kubectl logs -f deployment.apps/kube-monkey --namespace=kube-system でデバッグログを確認できます。ここで、deployment.apps/kube-monkey は kube-monkey の k8s Deployment です。

Helm チャート

Helm で kube-monkey をインストールする方法 を参照してください。

ロギング

kube-monkey は glog を使用しており、glog のすべてのコマンドライン機能をサポートしています。Pod でカスタムの v レベルやカスタムのログディレクトリを指定するには、サンプル Deployment ファイル の args: ["-v=5", "-log_dir=/path/to/custom/log"] を参照してください。

標準化された glog レベル grep -r V\([0-9]\) *

L0: なし

L1: 現在のステータス情報と終了に関するエラーの最高レベル

L2: 成功した終了

L3: より詳細なスケジュールのステータス情報

L4: 冗長なスケジュールと設定情報のデバッグ

L5: 自動解決された重要でない問題

その他のリソース:ログの重大度に関するコミュニティの規約を推奨する k8s ロギングページ を参照してください。

OpenShift 3.x でこれを動作させる手順

root@kitploit:~
git clone https://github.com/asobti/kube-monkey.git
cd examples
oc login http://someserver/ -u system:admin
oc project kube-system
oc create -f configmap.yaml
oc -n kube-system adm policy add-role-to-user -z deployer system:deployer
oc -n kube-system adm policy add-role-to-user -z builder system:image-builder
oc -n kube-system adm policy add-role-to-group system:image-puller system:serviceaccounts:kube-system
oc run kube-monkey --image=docker.io/ayushsobti/kube-monkey:v0.4.0 --command -- /kube-monkey -v=5 -log_dir=/var/log/kube-monkey
oc volume dc/kube-monkey --add --name=kubeconfigmap -m /etc/kube-monkey -t configmap --configmap-name=kube-monkey-config-map

OpenShift 4.x

root@kitploit:~
git clone https://github.com/asobti/kube-monkey.git
cd examples
oc login http://someserver/ -u system:admin
oc project kube-system
oc create -f configmap.yaml
oc -n kube-system adm policy add-cluster-role-to-user edit -z default --rolebinding-name kube-monkey-edit
oc run kube-monkey --image=docker.io/ayushsobti/kube-monkey:v0.3.0 --command -- /kube-monkey -v=5 -log_dir=/var/log/kube-monkey
oc set volume dc/kube-monkey --add --name=kubeconfigmap -m /etc/kube-monkey -t configmap --configmap-name=kube-monkey-config-map

貢献方法

貢献方法 を参照してください。

ライセンス

このプロジェクトは Apache License v2.0 の下でライセンスされています。詳細は LICENSE ファイルを参照してください。

ツールをダウンロード
foo
kube-monkey/identifier: foo

kube-monkey/kill-mode