とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

kube-monkey を調べてみた

Chaos Engineeringに興味があっていろいろ調べているのでメモ。

Chaos EngineeringといえばNetflixのChaosmonkeyが有名である。

github.com

先にこちらを試していたのだが、Spinnakerとの連携が必要となる。 まあそれは別にいいのだが公式にはKubernetes への対応も謳っているものの実際は動かないケースが見られた(後日記載予定)ので別のものを試すことにした。

というわけで今回は kube-monkey を見てみた。

github.com

なおこの記事を書いているときの 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つからできるらしい

今回は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デバッグレベルのログを出力するように変更

f:id:mazinlabs:20190328102014p:plain
kube-monkey のデプロイ

アプリケーションのデプロイ

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 を小さめに設定しているとまったくスケジューリングされず動作がわからないのでデバッグのときは大きめに設定するとよいかも