はじめに
Vagrantを利用してKubernetes環境を構築していますが、kubectlを叩いたときにエラーが返ってきたので、それの解決策を記述します。
開発環境
VagrantでVMを2つ起動させ、Kubeadmを利用してKubernetesクラスタを構築しています。
Master一台、Node一台の構成です。
Vagrantを利用してKubernetesクラスタを構築する方法については、これらの記事を参考にしています。
- https://qiita.com/sotoiwa/items/67fbb50915a8eba5a4ce
- https://medium.com/@raj10x/multi-node-kubernetes-cluster-with-vagrant-virtualbox-and-kubeadm-9d3eaac28b98
発生した問題
$ 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完全ガイドを進めたいと思います。