2021年8月15日日曜日

Kubernetesクラスタで、ノード起動後にDockerが起動せずにReadyにならない場合の確認と対処

Kubernetesクラスタに参加しているマシンを起動した直後に、kubectl get nodesで見えるステータスがNotReadyからReadyに変わるはずであるが、ごくまれにマシンは正常に起動しているにもかかわらず、Docker Daemonが正常に起動せず、それに引きずられてKubeletも起動しないため、Kubernetesクラスタ側からは認識されないという現象が起きるのでメモ書き程度に。

今回の題材にする環境は、おおよそ下記に示すソフトウェアや台数で構成しています。

  • Kubernetes 1.17.13
  • Ubuntu Server 18.04
  • Docker CE 19.03
  • Kubernetesクラスタの構築場所: オンプレミスのVMware ESXi ホスト上
  • Kubernetes Control-Planeノード x 3台
  • ワーカーノード x 5台

この事象が起きるクラスタはPrometheusで監視しているので、この現象が起きると毎回アラートが飛んでくるのであるが、大体いつもマシンは起動しているのに何故?と毎回焦るので…。
ここに書いたことで、この現象はそういえば書いたなという記憶に残ってくれてすぐに対処できたり、焦らなくなることに期待。


当該マシンにログイン後、下記コマンドでdockerとkubeletの動作状態を確認する。

sudo systemctl status docker
sudo systemctl status kubelet

docker / kubeletどちらのデーモンもinactiveになっているのであれば、dockerとkubeletを下記コマンドで手動で立ち上げてやることにより、とりあえずクラスタ内で機能する状態に戻せるはずです。

sudo systemctl start docker
sudo systemctl start kubelet

これらのコマンドで戻らない、あるいは起動してもinactiveに戻ってしまう場合などは、control-plane側で何か障害が起きているか、あるいはノード自体の情報がクラスタから飛んでしまっているなど別な要因も考えられます。


今回の現象がなぜ起こったのかを少し考えてみると、手作業でDocker Daemonを起動した際に時間が掛かっていたので、システム起動時の場合はタイムアウトとなり、Dockerが起動せずにそのまま立ち上がってしまうのが原因ではないかと考えております。
(systemctlコマンドから起動する際は人間が待っていれば良いのですが…)

Dockerが起動していない状態では、Kubeletも当然のように動作できないのでこのような現象が引き起こされるのではないかと推測しています。
(当該のKubernetesクラスタは、開発用の仮想サーバー20台程度を無理やり1台の仮想ホストに押し込んでいる環境下にあるので、多少動作遅延が出てもまぁあり得るよなあとしか思えないような状況)

Kubernetes + Containerdなど、Docker以外のCRIを使用している環境では、同じ現象が起きるかはまだ遭遇したことがありません。
(今回の現象の条件を考えると、似たようなことは起きる可能性はあるんじゃないかと思います)