CodeZine(コードジン)

特集ページ一覧

Kubernetesクラスターのノードにカオス挿入してみよう~Azure Kubernetes Serviceでカオスエンジニアリング

クラウドネイティブ時代の実践カオスエンジニアリング 第5回

  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

実験の実施

 今回は、Kubernetes上の動作も確認したいので、いくつかコンソールを開いておきましょう。

1. ノードの状態確認のためのコンソール

 下記のコマンドを実行し、ノードの状態をリアルタイムに出力できるようにしておきます。

kubectl get nodes -w

2. Podの状態確認のためのコンソール

 別のコンソールにて下記のコマンドを実行し、ノードの状態をリアルタイムに出力できるようにしておきます。

kubectl get pods -o wide -w

3. Webアクセス可否の確認

 別のコンソールにて、Webアクセスができるか確認する準備をしておきます。このコンソールはWebブラウザでもOKです。

curl http://20.89.82.247/

4. Chaos Toolkitの実行

 さらに別のコンソールで下記のコマンドを実行し、実験を開始します!

chaos --verbose run stop_aksnode.json 

実験の結果

 Chaos Toolkitのコマンドを実行して少し待つと、curlコマンドを実行した際に応答が帰ってこなくなります。すなわち、Webアクセスができない状態となります。

 「1. ノードの状態確認のためのコンソール」からも、ノードが落ちたことが確認できます(少しタイムラグが生じる場合があります)。

> kubectl get nodes -w
NAME                                STATUS     ROLES   AGE   VERSION
aks-nodepool1-67032099-vmss000000   Ready      agent   14m   v1.20.9

(ここでchaos runコマンドを実行)

aks-nodepool1-67032099-vmss000001   Ready      agent   14m   v1.20.9
aks-nodepool1-67032099-vmss000002   Ready      agent   14m   v1.20.9
aks-nodepool1-67032099-vmss000002   NotReady   agent   14m   v1.20.9
aks-nodepool1-67032099-vmss000002   NotReady   agent   14m   v1.20.9

 そして実行から約5分後、「2. Podの状態確認のためのコンソール」を確認すると、Podの停止が試みられ、並行して別のノード(aks-nodepool1-67032099-vmss000000)でPodが起動されることが確認できます。

> kubectl get pods -o wide -w
NAME                                READY   STATUS              RESTARTS   AGE   IP           NODE                                NOMINATED NODE   READINESS GATES
azure-vote-back-6c4dd64bdf-7gh9p    1/1     Running             1          11m   10.244.2.5   aks-nodepool1-67032099-vmss000002   <none>           <none>
azure-vote-front-85b4df594d-fhhzg   1/1     Running             1          11m   10.244.2.7   aks-nodepool1-67032099-vmss000002   <none>           <none>
azure-vote-back-6c4dd64bdf-7gh9p    1/1     Running             1          12m   10.244.2.5   aks-nodepool1-67032099-vmss000002   <none>           <none>
azure-vote-front-85b4df594d-fhhzg   1/1     Running             1          12m   10.244.2.7   aks-nodepool1-67032099-vmss000002   <none>           <none>

(ここでchaos runコマンドを実行)

azure-vote-back-6c4dd64bdf-7gh9p    1/1     Terminating         1          17m   10.244.2.5   aks-nodepool1-67032099-vmss000002   <none>           <none>
azure-vote-front-85b4df594d-fhhzg   1/1     Terminating         1          17m   10.244.2.7   aks-nodepool1-67032099-vmss000002   <none>           <none>
azure-vote-back-6c4dd64bdf-8f87l    0/1     Pending             0          0s    <none>       aks-nodepool1-67032099-vmss000000   <none>           <none>
azure-vote-front-85b4df594d-s9m7s   0/1     Pending             0          0s    <none>       aks-nodepool1-67032099-vmss000000   <none>           <none>
azure-vote-back-6c4dd64bdf-8f87l    0/1     ContainerCreating   0          0s    <none>       aks-nodepool1-67032099-vmss000000   <none>           <none>
azure-vote-front-85b4df594d-s9m7s   0/1     ContainerCreating   0          0s    <none>       aks-nodepool1-67032099-vmss000000   <none>           <none>
azure-vote-back-6c4dd64bdf-8f87l    1/1     Running             0          21s   10.244.1.4   aks-nodepool1-67032099-vmss000000   <none>           <none>
azure-vote-front-85b4df594d-s9m7s   1/1     Running             0          48s   10.244.1.5   aks-nodepool1-67032099-vmss000000   <none>           <none>

 Podの起動とほぼ同じタイミングでcurlコマンドにも応答するようになります。

> curl http://20.89.82.247/

StatusCode        : 200
StatusDescription : OK
...

 この後、Chaos Toolkitにて停止したノードについて、ノードの起動が行われるか待ってみましたが、自動で起動される気配はありませんでした。

結果から

 これらの結果から、下記のことが分かりました。

  • 1台のノードが停止した場合でも、別のノード上でPodが起動してくることでサービスが復旧する動作を確認できた
  • 停止したノードは自動で起動することは無く、AKSとしてはノードの起動数までは監視していないと考えられるため、別途アクションを検討する必要がある

 実際にKubernetesクラスターのノードに障害があった際の動きを確認するという目的について、達成できました。

補記:5分でPodが再起動した点について

 5分でPodが再起動するというのは遅く感じられたでしょうか?

 この動作はKubernetesの動作であり、「KubeletがNode情報を更新しなくなったことを検知し、300秒経ってもノードが復旧せずPodの情報が更新されない場合、Podが強制退去され別のノードにスケジュールされる」という設定が入っているためです。

> kubectl get pod -o yaml azure-vote-back-6c4dd64bdf-8f87l
apiVersion: v1
kind: Pod
...
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
...

 詳細については、Kubernetesのドキュメント(TaintとToleration)を参照してください。

 時間を短縮することは可能ですが、仕組みを理解したうえで変更することをお勧めします。

次回予告

 次回は、Kubernetesそのものへの、Chaos Toolkitによるカオスの挿入方法について紹介します。



  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:クラウドネイティブ時代の実践カオスエンジニアリング

著者プロフィール

  • 石崎 奏(株式会社NTTデータ)(イシザキ ソウ)

     入社以来、NTTデータグループにおけるWindows/Linuxシステムの技術問合せ、トラブルシュート支援、アーキテクチャレビューに従事。現在は、Azureを中心としたクラウド技術者の能力開発や、グループ全体へのAzure活用支援にも携わる。 Twitter...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5