
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 はネームスペースのリストで設定でき、
ブラックリストを無効にするには、blacklisted_namespaces 設定パラメータに [""] を指定します。
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 の数値を指定します---
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 アプリケーションのメタデータにもラベルを追加する必要がある場合があります。
---
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 ...]
// TODO: switch to using cluster DNS. という注記があるとおり、クラスタ DNS を明示的にサポートしていないため、apiserver を上書きする必要がある場合があります。[kubernetes]
host="https://your-apiserver-url.com:apiport"
スケジュールは平日に 1 日 1 回実行されます。これは、その日の終了スケジュールが生成されるタイミングです。スケジュール時に kube-monkey は以下を行います:
kube-monkey/mtbf から今日停止する Pod の数を計算します。アプリは 1 日に 24h/mtbf 回停止されるため、mtbf が 1 日以上なら最大 1 回の終了、それより短ければ複数回の終了になりますこれは、犠牲者となった k8s アプリケーションの Pod が停止される、日中にランダムに生成された時刻です。 終了時刻に kube-monkey は以下を行います:
kube-monkey の Docker イメージは DockerHub にあります。
リポジトリをクローンしてコンテナをビルドします。
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 にあります。
[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
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
注:この設定では、startHour と endHour で何を設定しても、60 秒ごとに Pod への攻撃が継続されます。
[debug]
enabled= true
schedule_immediate_kill= true
Kube-monkey は通知をサポートしており、攻撃後に任意のエンドポイントへ通知できます。 Slack の Webhook またはカスタム API を使用できます。
[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 環境変数で設定、それ以外の場合は空) message: '{
"what": "Kube-monkey(${kubemonkeyid}) attack of {$name} in {$namespace}",
"who": "{$name}",
"when": {$timestamp}
}'
ヘッダーは、環境変数の値を取得するための特別なプレースホルダーをサポートしています。 これは、保護されたエンドポイントを持つ API を呼び出す場合に便利です。 典型的なシナリオは、Kubernetes Secret に保存された API トークンを Kube-monkey コンテナに渡し、それを環境変数を介して渡したい場合です。
headers = ["api-key:{$env:API_TOKEN}", "Content-Type:application/json"]
{$env:API_TOKEN} は環境変数 API_TOKEN の値に置き換えられます。
環境変数が存在しない場合でも、通知呼び出しはキャンセルされません。値は空文字列として解決され、ログに警告が表示されます。
手動
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
kube-system)で、kube-monkey を k8s アプリケーションとして実行します。サンプルの Kubernetes yaml ファイルについては、examples/ ディレクトリを参照してください。
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 ロギングページ を参照してください。
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
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 ファイルを参照してください。
fookube-monkey/identifier: fookube-monkey/kill-mode