一般的にkubernetesではswapを利用することができません。
クラウド環境では問題になるケースは少ないかと思いますが、オンプレ環境でメモリを動的に増やすことができない環境では厳しい制約になり得ます。
さらに言えば、メモリ容量が多い場合であっても、なおswapには利用価値があります。
The casual reader may think that with a sufficient amount of memory, swap is unnecessary but this brings us to the second reason. A significant number of the pages referenced by a process early in its life may only be used for initialisation and then never used again. It is better to swap out those pages and create more disk buffers than leave them resident and unused.
https://www.kernel.org/doc/gorman/html/understand/understand014.html
<拙訳>
お気楽な読者の方は、メモリが充分にある状況ではswapは不要だと考えるかもしれませんが、私たちはこれに対して次の理由を提示します。
プロセス起動時に参照される膨大な量のページは初期化処理にのみ利用され、その後2度と利用されない、というケースがあり得ます。
この場合、これらのページをスワップアウトしてディスクバッファを作るほうが、メモリ内に留めて使わないままにして置くよりもベターです。
このような動機からkubernetesでswapを有効にする方法を調べたので、以下に記載します。
想定環境
環境起因な方法ではありませんが記載の都合上、以下の環境を想定します。
- kubeadmで環境構築を実施している
- Master Node、Worker Nodeが分離している
また説明の簡略化のため、Master Nodeは構築済みとの前提です。
手順
[Worker Node]
$ kubeadm join ...
※「...」部分はMaster Node起動時に出力された値を埋めてください。
kubeadmではkubeadm join実行時にSwapが無効になっていることをチェックし、有効になっている場合は処理を停止するようになっているため、まずはSwapを無効化した状態でWorker Nodeをクラスターに参加させます。
[Master Node]
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 11d v1.18.2
worker Ready <None> 11d v1.18.2
クラスターに参加できたことを確認します。上記のようにWorker Nodeの情報が出力されればOKです。
[Worker Node]
$ sudo echo "failSwapOn: false" >> /var/lib/kubelet/config.yaml
$ sudo systemctl daemon-reload
$ sudo swapon -a
$ sudo sed -i -e "s/#\/dev\/mapper\/vagrant--vg-swap_1/\/dev\/mapper\/vagrant--vg-swap_1/g" /etc/fstab
$ sudo systemctl restart kubelet
ここが肝です。
- Swap有効化でも動作するようkubeletの設定に追記
- Swap有効化
- kubelet再起動
をしてやるとkubernetesのWroker NodeでSwapを利用できます。