🎼

[Azure] Chaos Studio で AKS の Pod にカオス注入実験してみた

2021/12/26に公開

Azure Chaos Studio がプレビュー提供されましたね!

AKS については Chaos Mesh が利用されるとのことで、チュートリアル+α を試してみました。

環境

  • AKS 1.21.7
  • Windows 10
  • WSL2 (Ubuntu 20.04)

デプロイした素材

いつもの Azure Voting App を使いました。

チュートリアルの実施

基本的に、まずは Pod に障害を起こす実験であれば、チュートリアル通りに進めれば大丈夫だと思います。

  1. AKS クラスターの作成
  2. Chaos Mesh のインストール
  3. Chaos Studio への AKS のオンボード
  4. 実験の作成
  5. 実験リソースに AKS への権限を付与
  6. 実験の実行

こんな感じの順番ですね。

注意点 : Kubernetes のバージョン

チュートリアル内で Chaos Mesh をインストールする Helm コマンドの実行時、下記のような警告が出力されます。

MutatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 MutatingWebhookConfiguration

上記の通り、Chaos Mesh (v2.0.3) 内部で利用されている実装の一部が Kubernetes の v1.22 以降では動作しない状態となっています。

このため、Kubernetes のバージョンは v1.21.x を利用するようにしましょう。

実際の結果

kubectl get po -w

NAME                                READY   STATUS              RESTARTS   AGE
azure-vote-back-6c4dd64bdf-crdxw    1/1     Running             0          7s
azure-vote-front-85b4df594d-cj5dt   1/1     Running             0          28s
azure-vote-front-85b4df594d-l9xcl   1/1     Running             0          32s
azure-vote-front-85b4df594d-pbg62   1/1     Running             0          32s
azure-vote-front-85b4df594d-pbg62   1/1     Running             0          2m34s
azure-vote-front-85b4df594d-pbg62   1/1     Running             0          3m4s
azure-vote-front-85b4df594d-pbg62   1/1     Running             1          3m8s
azure-vote-front-85b4df594d-pbg62   1/1     Running             2          3m9s
kubectl get po -w

NAME                                READY   STATUS    RESTARTS   AGE
azure-vote-back-6c4dd64bdf-crdxw    1/1     Running   0          7m30s
azure-vote-front-85b4df594d-bzkfk   1/1     Running   0          4m14s
azure-vote-front-85b4df594d-l9xcl   1/1     Running   0          7m30s
azure-vote-front-85b4df594d-pbg62   1/1     Running   2          7m30

このように、azure-vote-front-85b4df594d-pbg62 という Pod が 2 回 Restart されています。

Chaos Mesh のアクション pod-failuer によって Pod が異常終了し、再起動が行われたことがわかります。

Pod Failure: injects fault into a specified Pod to make the Pod unavailable for a period of time.

再起動が 2 回行われているのは、実験の JSON ファイルの duration30s と指定していたため、継続した注入により複数回の異常終了が発生した、ということですね。

ちなみに、実行後の kubectl describe pods における「Events」の状態は、下記のようになっていました。

$ kubectl describe pods azure-vote-front-85b4df594d-pbg62

Name:         azure-vote-front-85b4df594d-pbg62
...

Events:
  Type    Reason     Age                  From               Message
  ----    ------     ----                 ----               -------
  Normal  Scheduled  7m13s                default-scheduler  Successfully assigned default/azure-vote-front-85b4df594d-pbg62 to aks-agentpool-15067392-vmss000002
  Normal  Pulled     41s (x2 over 2m12s)  kubelet            Container image "mcr.microsoft.com/azuredocs/azure-vote-front:v1" already present on machine
  Normal  Killing    41s (x2 over 71s)    kubelet            Container azure-vote-front definition changed, will be restarted
  Normal  Pulled     41s                  kubelet            Container image "gcr.io/google-containers/pause:latest" already present on machine
  Normal  Created    40s (x3 over 2m12s)  kubelet            Created container azure-vote-front
  Normal  Started    40s (x3 over 2m12s)  kubelet            Started container azure-vote-front

Pod の再起動じゃなくて削除をするには?

前述の通り、チュートリアルではアクションとして pod-failuer が使われています。これは、下記の通り「指定された時間のあいだ、Pod が異常終了するよう注入する」というアクションです。

Pod Failure: injects fault into a specified Pod to make the Pod unavailable for a period of time.

Pod を削除した際の動きを確認するには、アクションとして pod-kill を使えば OK です。

Pod Kill: kills a specified Pod.To ensure that the Pod can be successfully restarted, you need to configure ReplicaSet or similar mechanisms.

やってみた

実験の JSON ファイルを下記のように修正しました。

{"action":"pod-kill", "mode":"one", "duration":"30s", "selector":{"namespaces":["default"]}}

保存して実行した結果がこちら

$ kubectl get po -w

NAME                                READY   STATUS              RESTARTS   AGE
azure-vote-back-6c4dd64bdf-84zmd    1/1     Running             0          4m39s
azure-vote-front-85b4df594d-q7hs9   1/1     Running             0          3m41s
azure-vote-front-85b4df594d-vgggh   1/1     Running             0          4m38s
azure-vote-front-85b4df594d-wdsbz   1/1     Running             0          4m38s
azure-vote-front-85b4df594d-wdsbz   1/1     Terminating         0          5m8s
azure-vote-front-85b4df594d-wdsbz   1/1     Terminating         0          5m8s
azure-vote-front-85b4df594d-gq8rq   0/1     Pending             0          0s
azure-vote-front-85b4df594d-gq8rq   0/1     Pending             0          0s
azure-vote-front-85b4df594d-gq8rq   0/1     ContainerCreating   0          0s
azure-vote-front-85b4df594d-gq8rq   1/1     Running             0          1s

azure-vote-front-85b4df594d-wdsbz という Pod が Kill されて、新しく azure-vote-front-85b4df594d-gq8rq という Pod が作成されました。

この通り、アクションとして pod-kill を使えば、Pod が削除された時の動作を確認することができます。

おわりに

カオスエンジニアリングが簡単にできる…ということで、なかなか便利に使えそうです。

現時点では、実行結果のレポーティングや、実行結果を踏まえたロールバックアクション等の機能は充実していない印象でした。実行結果の画面は実にあっさり…

まだまだプレビュー段階ですが、今後に期待です!

(宣伝)

CodeZine さんにおいて、わたしも執筆に参加させていただいたカオスエンジニアリングの記事を公開済みです!

今回の Azure Chaos Studio ではなく Chaos Toolkit を使った記事ですが、カオスエンジニアリングの概要や考え方なども参考にしていただけるかなと思いますので、是非🤗

Discussion