前回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ごとに出せるのはよいですね。これ以外にも色々なツールがあるようなので、おいおい。