Gremlinをはじめて解き放った日

こんにちは。

先日、色々あり急きょ引き受けたKubernetes(マネージド)本番環境構築への畏れを呟いたらたくさんの方から励ましの言葉をいただきました。 めちゃくちゃ勇気が湧きました。ありがとうございますm(__)m

一先ずクラスタ構築やアプリが動作する確認までは何とか終わり、CI/CDも最低限は実装し、ほっと一息・・・もつかの間。

「セルフヒーリング効くの?」「HPAする?」「CPUやメモリめっちゃ食わない?」・・・

「このクラスタ、本当にKubernetesの特性生かせてる?」

ひぃ~自信ない~~~~ (ToT)/~~~


というわけで、Kubernetesの機能がちゃんと働くか、テストの時間をもらいました。

何かいい考え方や手法がないかなと思い調べ、「カオスエンジニアリング」からヒントを得ることに。

参考:
Principles of Chaos Engineering
Qiita「カオスエンジニアリングと聞いてカオスになった人必見」

今回は単なる「障害注入テスト」ですが、ゆくゆくは日常的にテストできる仕組みを作れたらいいかもねということで、 いくつかのツールの中から Gremlin を使ってみることにしました。

TechCrunchの記事にもあるようにGremlinがKubernetes に対応したということで、どのくらい使いやすい(インフラテスト初心者でも使える?)のか試してみたかったのです。
あとは帰り道気づいたけど、Kubernetes Podcast でも取り上げられていました。
kubernetespodcast.com

結論から言うと「始め方は想像よりとても簡単!だが奥が深い世界」であることがわかりました。

以降はこちらのページを参考に手順を追った記録です。
www.gremlin.com

途中 Namespace や Helm のバージョンに若干躓きつつも、カオスエンジニアリングにおける「Hello World!」の一歩が踏み出せました。


Gremlin を Kubernetes で使ってみよう

ではさっそく始めていきます。
Kubernetes クラスタが構築済みであることを前提に進めます。

1.Gremlin account を作成

gremlin.com からサインアップします。

2.Gremlin Daemon credential を取得

https://app.gremlin.com/ へログイン

②右上の人型アイコン → [Company Settings] → [Teams] → [Cloud Service(チーム名)] → [Configuration] の順で選択

③ [Download] をクリックし、自分の端末にcertificate.zip をダウンロード

④zip を解凍し、リネームする

以下のファイルが含まれている。

  • public-key certificate
  • matching private key

それぞれ [gremlin.cert] と [gremlin.key] にリネームする。

3.Kubernetes クラスタ上に Secret を作成

①カオステストを実行するクラスタに対し、以下のコマンドで Secret を作成する

kubectl create secret generic gremlin-team-cert --from-file=./gremlin.cert --from-file=./gremlin.key

# Secret を確認
kubectl get secret


4.Helm を使った Gremlin client のインストール

Gremlin クライアントを Kubernetes クラスタに簡単にインストールするには Helm が便利。

①Helm がまだインストールされていなければ、インストール(apt)

②Gremlin Team ID を取得する

  • https://app.gremlin.com/ へログイン
  • 右上の人型アイコン → [Company Settings] → [Teams] → [Cloud Service(チーム名)] → [Configuration] の順で選択
  • Team ID を控える


環境変数に Team ID を設定する

export GREMLIN_TEAM_ID="【Team ID】"


④cluster ID を設定する(任意の内容)

export GREMLIN_CLUSTER_ID="【任意のcluster ID】"


⑤Gremlin Helm リポジトリを登録し、インストール

# リポジトリ登録(私の環境ではすでに用意されてた)
helm repo add gremlin https://helm.gremlin.com

# gremlin用namespaceを作成
kubectl create namespace gremlin

# gremlin をインストール
helm install gremlin gremlin/gremlin \
\--namespace gremlin \
\--set gremlin.teamID=$GREMLIN_TEAM_ID \
\--set gremlin.clusterID=$GREMLIN_CLUSTER_ID


5.Gremlin App を使って攻撃設定

ここでは試しに、Kubernetes クラスタに対するCPU 攻撃を Gremlin App を使って設定します。

以下の一文が印象的でした。

カオスエンジニアリングにおける「Hello World!」はCPUリソース攻撃である。


①ナビゲーションバーから[Attacks] → [New Attack]を選択

あれ、クラスタがいない・・・?

→ Gremlin の Pod が作成できていなかった。
→ namespace=gremlin に Secret を作成したら表示されるようになった。

②下にスクロールし、[local-hostname] 等で対象を選択

まずは1つだけ選択。後から「Blast Radius(爆発半径)」を広げていけばいい。


③更に下にスクロールし、[Choose a Gremlin] → [Resource]を選択

④CPU攻撃の設定内容を確認する
デフォルトでは「1CPUに60秒間攻撃」

⑤更に下にスクロールし、[Unleash Gremlin] を押してスタート
(Gremlin を解き放て!)

⑥しばらく待つ → 「Successful」で完了

⑦上記をクリックすると、結果ページが表示
ログを見るには、[Executions]をクリック

2019-12-16 10:31:09 - Setting up cpu gremlin with guid '*****' for 60 seconds on 100% of 1 core
2019-12-16 10:31:09 - Setup successfully completed
2019-12-16 10:31:09 - Running cpu gremlin with guid '*****' for 60 seconds on 100% of 1 core
2019-12-16 10:32:09 - Attack on cpu_1 completed successfully


まとめ

想像よりもはるかに簡単にツールを導入できました。
律儀にこんなメールも届いていた。
f:id:dombri:20191216220842j:plain

明日は数値を変えて試してみたり、freeユーザーが使えるもう一つの操作である「シャットダウン」をやってみようと思います。