Vagrant上で動かしていたKubernetesが動かなくなった


はじめに

Vagrantを利用してKubernetes環境を構築していますが、kubectlを叩いたときにエラーが返ってきたので、それの解決策を記述します。

開発環境

VagrantでVMを2つ起動させ、Kubeadmを利用してKubernetesクラスタを構築しています。
Master一台、Node一台の構成です。

Vagrantを利用してKubernetesクラスタを構築する方法については、これらの記事を参考にしています。

発生した問題

$ kubectl get pods
The connection to the server [master_IP]:6443 was refused - did you specify the right host or port?

今までは、kubectlが正常に動作していたが、突然、podを取得できなりました。

原因の確認

Vagrant上でのみ発生する問題かと思ったが、そういうわけでは無さそうでした。

とりあえず、kubeletが動いているかを確認してみました。

$ systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
   Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: activating (auto-restart) (Result: exit-code) since Wed 2020-02-12 11:55:58 UTC; 3s ago
     Docs: https://kubernetes.io/docs/home/
  Process: 2679 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (cod
 Main PID: 2679 (code=exited, status=255)

Feb 12 11:55:58 master systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a
Feb 12 11:55:58 master systemd[1]: kubelet.service: Unit entered failed state.
Feb 12 11:55:58 master systemd[1]: kubelet.service: Failed with result 'exit-code'.

どうやら、kubeletが正常に動作してなさそうなので、ログを確認してみました。

$ journal -xe | grep kubelet
:
:
Feb 12 12:04:03 master kubelet[5988]: F0212 12:04:03.063233    5988 server.go:273] failed to run Kubelet: running with swap on is not supported, please disable swap! or set --fail-swap-on flag to false. /proc/swaps contained: [Filename                                Type                Size        Used        Priority /dev/dm-1                               partition        1003516        0        -1]
Feb 12 12:04:03 master systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a
Feb 12 12:04:03 master systemd[1]: kubelet.service: Unit entered failed state.
Feb 12 12:04:03 master systemd[1]: kubelet.service: Failed with result 'exit-code'.

どうやら、Swapがオンになっていることが問題らしいので、オフにします。
同様にして、ノード側もSwapをオフにします。
そして、ノードを確認してみます。

$ swapoff -a
$ kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   8d    v1.17.2
node     Ready    <none>   8d    v1.17.2

無事、masterとnodeの両方でkubeletが正常に動作したようです!

今後の対策

Swap機能をオフにする

/etc/fstabのSwapに関する部分をコメントアウトする。
ubuntu16.04では、/dev…から始まる文章でした。

$ vim /etc/fstab
/dev/mapper/vagrant--vg-swap_1 none            swap    sw              0       0

下記に別の対策も記述してありますが、個人的には、Swap機能をオフにする方法をおすすめします。

VMを一時停止する

VMをシャットダウン(vagrant halt)すると、次に起動したときにSwapがオンになるので、VMを一時停止(vagrant suspend)する。

最後に

Kubeadmを構築する段階で /etc/fstab からSwapをオフにしている人は、このような問題は発生しないと思いますが、同じような問題が発生している人の助けになれば幸いです。

無事、Kubernetesが動くようになったので、私はKubernetes完全ガイドを進めたいと思います。