Chaos Engineeringに興味があっていろいろ調べているのでメモ。
Chaos EngineeringといえばNetflixのChaosmonkeyが有名である。
先にこちらを試していたのだが、Spinnakerとの連携が必要となる。 まあそれは別にいいのだが公式にはKubernetes への対応も謳っているものの実際は動かないケースが見られた(後日記載予定)ので別のものを試すことにした。
というわけで今回は kube-monkey を見てみた。
なおこの記事を書いているときの kube-monkey のバージョンは v0.3.0 である
kube-monkeyはk8sのCluster内のPodをランダムに削除することでシステムの対障害性や回復性を確認するためのツールである。
できること
READMEに書いてあるのを眺めると
- kube-monkeyのオンオフ
- 起動時間の設定(デフォルトは平日8時)
- 動作時間の設定(デフォルトは平日10時〜16時)
- 動作する回数(例として
3
と設定すると週の平日日勤帯に3回動作する) - 特定の(ラベルがついた)アプリだけを削除対象にする
- kill-mode: Podの落とし方を設定
- 全Podを落とす
- 指定数のPodを落とす
- n%以内のPodを落とす
- 指定数の n%以内のPodを落とす
- kill-value: kill-modeで利用する値を設定する
- namespace単位でのblacklist(削除しないリスト)登録
- (READMEには書いてないけど)namespace単位でのwhitelist登録
できないこと
- 動作する日や曜日の設定(平日固定っぽい?)
- TBD
動作
ドキュメントによると
- 1日1回スケジューリングを行い削除するPodをランダム決める(もしくは削除しないことを決める)
- 削除対象のPodの削除時間をランダムに決める
- 削除方法を決める
- 削除の時間に指定された索条方法でPodを削除する
らしい
動かしてみた
namespaceの作成
READMEは kube-system
においているが本当だとよくなさそうなので namespace を別に作る
$ kubectl create namespace kube-monkey namespace/kube-monkey created
設定
READMEを読むと設定は以下の3つからできるらしい
- 環境変数
- /etc/kube-monkey/config.toml
- configmap
今回はconfig.tomlを書いてconfigmapに登録してみる
[kubemonkey] dry_run = false # Terminations are only logged run_hour = 8 # Run scheduling at 8am on weekdays start_hour = 9 # Don't schedule any pod deaths before 10am end_hour = 17 # Don't schedule any pod deaths after 4pm blacklisted_namespaces = ["kube-system"] # Critical apps live here whitelisted_namespaces = ["default"] time_zone = "Asia/Tokyo" # Set tzdata timezone example. Note the field is time_zone not timezone # Add debug parameters [debug] enabled= true schedule_immediate_kill= true
scheduleがなかなか割当らないのでデバッグをオンにした。 (オンにすると30秒ごとにスケジューリングが行われる模様)
$ kubectl create configmap kube-monkey-config-map --from-file=config.toml -n kube-monkey
READMEはnamespaceを指定していなかったので default
に作られてしまいハマった・・・
Service Accountの作成と権限設定
これもREADMEには書いてないけどないとダメそうなので作って設定しておく。
apiVersion: v1 kind: ServiceAccount metadata: name: kube-monkey namespace: kube-monkey --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kube-monkey-role-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - namespace: kube-monkey kind: ServiceAccount name: kube-monkey
$ kubectl create -f rbac.yml serviceaccount/kube-monkey created
kube-monkeyのデプロイ
--- apiVersion: apps/v1 kind: Deployment metadata: name: kube-monkey namespace: kube-monkey spec: replicas: 1 selector: matchLabels: app: kube-monkey template: metadata: labels: app: kube-monkey spec: containers: - name: kube-monkey command: - "/kube-monkey" args: ["-v=4", "-log_dir=/var/log/kube-monkey"] image: ayushsobti/kube-monkey:v0.3.0 volumeMounts: - name: config-volume mountPath: "/etc/kube-monkey" serviceAccountName: kube-monkey volumes: - name: config-volume configMap: name: kube-monkey-config-map
- apiVersionはREADMEのやつは古いので
apps/v1
に変更 spec.selector
のあたりはSpinnakerを使ったデプロイで必要だったので追加- argsに
-v4
でデバッグレベルのログを出力するように変更
アプリケーションのデプロイ
nginxをデプロイしてみる
apiVersion: apps/v1 kind: Deployment metadata: name: nginx namespace: default labels: app: nginx kube-monkey/enabled: enabled kube-monkey/identifier: nginx kube-monkey/mtbf: '10' kube-monkey/kill-mode: "fixed" kube-monkey/kill-value: '1' spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx kube-monkey/enabled: enabled kube-monkey/identifier: nginx kube-monkey/mtbf: '10' kube-monkey/kill-mode: "fixed" kube-monkey/kill-value: '1' spec: containers: - image: nginx name: nginx ports: - containerPort: 80
kube-monkey/mtbf
はWeekdayのうちn 回故障するというものなので多めに設定
動作確認
$ kubectl logs -n kube-monkey kube-monkey-7fff7ff466-68xlb I0401 06:33:51.282396 1 kubemonkey.go:62] Status Update: Waiting to run scheduled terminations. I0401 06:33:51.282515 1 kubemonkey.go:76] Status Update: All terminations done. I0401 06:33:51.282824 1 kubemonkey.go:19] Debug mode detected! I0401 06:33:51.282966 1 kubemonkey.go:20] Status Update: Generating next schedule in 30 sec I0401 06:34:21.283392 1 schedule.go:64] Status Update: Generating schedule for terminations I0401 06:34:21.305535 1 schedule.go:57] Status Update: 1 terminations scheduled today I0401 06:34:21.305890 1 schedule.go:59] v1.Deployment nginx scheduled for termination at 04/01/2019 15:34:26 +0900 JST ********** Today's schedule ********** k8 Api Kind Kind Name Termination Time ----------- --------- ---------------- v1.Deployment nginx 04/01/2019 15:34:26 +0900 JST ********** End of schedule ********** I0401 06:34:21.306260 1 kubemonkey.go:62] Status Update: Waiting to run scheduled terminations. I0401 06:34:26.339117 1 kubemonkey.go:70] Termination successfully executed for v1.Deployment nginx I0401 06:34:26.339166 1 kubemonkey.go:73] Status Update: 0 scheduled terminations left. I0401 06:34:26.339189 1 kubemonkey.go:76] Status Update: All terminations done. I0401 06:34:26.339287 1 kubemonkey.go:19] Debug mode detected! I0401 06:34:26.339293 1 kubemonkey.go:20] Status Update: Generating next schedule in 30 sec I0401 06:34:56.339917 1 schedule.go:64] Status Update: Generating schedule for terminations I0401 06:34:56.663981 1 schedule.go:57] Status Update: 0 terminations scheduled today
無事にScheduleとTerminateされたことが確認できた。
結果
kube-monkeyは動く。(これ大事)
小ネタ
- run_hour > start_hour にするとErrorになってコンテナが立ち上がらない
kube-monkey/mtbf
を小さめに設定しているとまったくスケジューリングされず動作がわからないのでデバッグのときは大きめに設定するとよいかも