kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

kubernetesでいろんな障害を想定してみる ① workerノード

前回kubeadmでマルチマスターのクラスタを構築しましたので、いろいろな障害を想定して試していきたいと思います。今回はworkerに限ったところだけです。

前提

  • 上記にも記載の通り、workerだけです。masterは今回何もしません。
  • ちょっとリソースが苦しいので、master x 1、worker x 2にしてます。masterの障害テストを行う際にはマルチマスターでやります。
  • 前回の最後で実施したkubernetesチュートリアルでいくつかのpodがたった状態からスタートします。
    • serviceで公開している
    • replicas=4を設定している

障害テスト

podの強制終了

pod削除はkubectl delete podでできますが、gracefulにやってくれるようなので、 --grace-period=0 --forceをつけて強制削除してみます。実行前はこうなってます。

$ kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   0          18m   192.168.226.66   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          18m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   0          18m   192.168.226.65   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rhcth   1/1     Running   0          39m   192.168.43.1     worker-0   <none>           <none>

4台のpodが2台のnodeに分散してます。では1台削除します。

$ kubectl delete pod kubernetes-bootcamp-69fbc6f4cf-rhcth --grace-period=0 --force
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "kubernetes-bootcamp-69fbc6f4cf-rhcth" force deleted

はい、削除しました。podの状態を見てみます。

$ kubectl get pod -o wide
NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   0          18m   192.168.226.66   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          18m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   0          18m   192.168.226.65   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rhcth   1/1     Running   0          39m   192.168.43.1     worker-0   <none>           <none>

すぐに新しいpodが追加されています。

強制削除の場合はリソースが残るかも、とありましたが、そこはちょっと置いときます。

nodeの強制リブート

nodeを強制リブートしてみたいと思います。リブートなので一定時間後に上がってくる想定ですね。Vagrantを使っているのでvirtualboxからリセットしてみたいと思います。

まず、pod・リセット前は以下の状態です。

NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   1          45m   192.168.226.67   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          25m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          45m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   1         45m   192.168.226.68   worker-1   <none>           <none>

リセットするとこうなります。リセットしたのはworker-1です。

NAME                                   READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   0/1     Error     1          45m   <none>         worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          25m   192.168.43.3   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          45m   192.168.43.2   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   0/1     Error     1          45m   <none>         worker-1   <none>           <none>

でしばらく経つと元に戻ります。

NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   2          46m   192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          26m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          46m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   2          46m   192.168.226.70   worker-1   <none>           <none>

kubectl get nodeの方はステータスが変わりませんでした。リブートのような短い時間では検出できないのかもしれません。

nodeの強制シャットダウン

今度は強制シャットダウンです。シャットダウン後、起動はしない状態にしてみます。

今回はnodeが先に変化しました。NotReadyになっていますね。

NAME           STATUS     ROLES    AGE    VERSION
controller-0   Ready      master   170m   v1.17.3
worker-0       Ready      <none>   159m   v1.17.3
worker-1       NotReady   <none>   159m   v1.17.3

ただし、podはまだ変化がありません。この時、ブラウザでworker-1にアクセスしてみると当然ながらアクセスできません。worker-0側はアクセスできます。上位にLoad Balancerがほしいところです。。。。

NAME                                   READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Running   2          56m   192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          36m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          56m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Running   2          56m   192.168.226.70   worker-1   <none>           <none>

5分ほど経過すると以下のように対象ノードのpodがterminateされ、生きているnodeでpodが上がってきました。

NAME                                   READY   STATUS              RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Terminating         2          60m   192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running             0          40m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running             0          60m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Terminating         2          60m   192.168.226.70   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   0/1     ContainerCreating   0          1s    <none>           worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   0/1     ContainerCreating   0          1s    <none>           worker-0   <none>           <none>

しばらくするとこうなります。replicas=4が保持されるわけですね。

NAME                                   READY   STATUS        RESTARTS   AGE     IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-5bz9r   1/1     Terminating   2          62m     192.168.226.69   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running       0          42m     192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running       0          62m     192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-lwdzr   1/1     Terminating   2          62m     192.168.226.70   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Running       0          2m11s   192.168.43.4     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Running       0          2m11s   192.168.43.5     worker-0   <none>           <none>

では対象ノードを起動して(ちゃんと上がってくれば)確認します。

nodeはReadyに戻りました。

NAME           STATUS   ROLES    AGE    VERSION
controller-0   Ready    master   3h2m   v1.17.3
worker-0       Ready    <none>   171m   v1.17.3
worker-1       Ready    <none>   171m   v1.17.3

podです。nodeが上がってきたタイミングでterminatingなpodは消えました。ただ生きているnodeに偏ってますね。残念ながらこの偏りは自動ではなおらないようです。

AME                                   READY   STATUS    RESTARTS   AGE     IP             NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running   0          49m     192.168.43.3   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running   0          69m     192.168.43.2   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Running   0          9m18s   192.168.43.4   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Running   0          9m18s   192.168.43.5   worker-0   <none>           <none>

そこでrolling updateさせます。

$ kubectl rollout restart deployments/kubernetes-bootcamp
deployment.apps/kubernetes-bootcamp restarted

rolling updateさせるとこうなります。

NAME                                   READY   STATUS              RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-65b65458f-8ncdf    0/1     ContainerCreating   0          1s    <none>         worker-0   <none>           <none>
kubernetes-bootcamp-65b65458f-fzpkv    0/1     ContainerCreating   0          1s    <none>         worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Running             0          53m   192.168.43.3   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Running             0          74m   192.168.43.2   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Terminating         0          13m   192.168.43.4   worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Running             0          13m   192.168.43.5   worker-0   <none>           <none>

生きていたpodも含めて再作成されるわけですね。

NAME                                   READY   STATUS        RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
kubernetes-bootcamp-65b65458f-7xzbx    1/1     Running       0          9s    192.168.43.7     worker-0   <none>           <none>
kubernetes-bootcamp-65b65458f-8ncdf    1/1     Running       0          11s   192.168.43.6     worker-0   <none>           <none>
kubernetes-bootcamp-65b65458f-fzpkv    1/1     Running       0          11s   192.168.226.71   worker-1   <none>           <none>
kubernetes-bootcamp-65b65458f-sd8zf    1/1     Running       0          9s    192.168.226.72   worker-1   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-fnv2w   1/1     Terminating   0          53m   192.168.43.3     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-jx8l5   1/1     Terminating   0          74m   192.168.43.2     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rqrwf   1/1     Terminating   0          14m   192.168.43.4     worker-0   <none>           <none>
kubernetes-bootcamp-69fbc6f4cf-rrlvd   1/1     Terminating   0          14m   192.168.43.5     worker-0   <none>           <none>

とりあえずここまで。次回は、障害とまでいかないけど、node上で何かしらリソース不足等が発生した場合を想定してみたいと思います。メモリとかディスクとか。

ところで、kubectl topというk8sのリソースを確認するコマンドがあるのですが、素のkubeadmだと入らないみたいで、以下を参考に入れてみました。

こんな感じで使えます

$ kubectl top node
NAME           CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
controller-0   269m         13%    1185Mi          68%
worker-0       91m          9%     543Mi           60%
worker-1       89m          8%     529Mi           59%
$ kubectl top pod
NAME                                  CPU(cores)   MEMORY(bytes)
kubernetes-bootcamp-65b65458f-7xzbx   0m           8Mi
kubernetes-bootcamp-65b65458f-8ncdf   0m           8Mi
kubernetes-bootcamp-65b65458f-fzpkv   0m           10Mi
kubernetes-bootcamp-65b65458f-sd8zf   0m           11Mi
$ kubectl top pod --all-namespaces
NAMESPACE     NAME                                       CPU(cores)   MEMORY(bytes)
default       kubernetes-bootcamp-65b65458f-7xzbx        0m           8Mi
default       kubernetes-bootcamp-65b65458f-8ncdf        0m           8Mi
default       kubernetes-bootcamp-65b65458f-fzpkv        0m           10Mi
default       kubernetes-bootcamp-65b65458f-sd8zf        0m           11Mi
kube-system   calico-kube-controllers-788d6b9876-whs9s   1m           17Mi
kube-system   calico-node-8dssv                          21m          58Mi
kube-system   calico-node-k8jjn                          21m          63Mi
kube-system   calico-node-n6g72                          31m          58Mi
kube-system   coredns-6955765f44-4pmwr                   3m           19Mi
kube-system   coredns-6955765f44-cz42w                   3m           10Mi
kube-system   etcd-controller-0                          20m          69Mi
kube-system   kube-apiserver-controller-0                38m          348Mi
kube-system   kube-controller-manager-controller-0       17m          71Mi
kube-system   kube-proxy-qhfnb                           1m           21Mi
kube-system   kube-proxy-tqgqw                           1m           23Mi
kube-system   kube-proxy-vvzw6                           1m           28Mi
kube-system   kube-scheduler-controller-0                4m           29Mi
kube-system   metrics-server-7d89945f47-8cpx9            1m           10Mi

podごとに出せるのはよいですね。これ以外にも色々なツールがあるようなので、おいおい。