1.問題
テスト環境のノードがNotReadyです。ノード情報を確認して、kubeletがノードをAPIサーバーに登録できないことを確認してください。
# kubectl get node
# kubectl describe node 10.0.0.166
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
MemoryPressure Unknown Mon, 25 May 2020 16:26:43 +0800 Mon, 25 May 2020 16:27:59 +0800 NodeStatusUnknown Kubelet stopped posting node status.
ノードnodeはsystemdを使用してkubeletプロセスを管理しているため、以下に示すようにkubeletを正常に起動できないことがわかります。
# systemctl status kubelet
kubelet.service - Kubernetes Kubelet Server
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Active: failed (Result: start-limit) since Mon 2020-05-25 16:28:33 CST; 24h ago
Docs: https://github.com/GoogleCloudPlatform/kubernetes
Main PID: 12866 (code=exited, status=255)
# 使用 journalctl _PID=<PID> 来输出systemd管理下的进程日志
# journalctl _PID=12866 | vim -
-- Logs begin at Mon 2020-05-25 16:27:55 CST. --
May 25 16:28:32 VM-46765c59-4e9d-4731-b658-2b0c1d5bc49e-002 kubelet[2866]: F0525 04:28:32.821839 2866 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 2097148 0 -2]
May 25 16:28:32 VM-46765c59-4e9d-4731-b658-2b0c1d5bc49e-002 systemd[1]: kubelet.service: main process exited, code=exited, status=255/n/a
May 25 16:28:32 VM-46765c59-4e9d-4731-b658-2b0c1d5bc49e-002 systemd[1]: Unit kubelet.service entered failed state.
チェックを実行し、スワップがクローズされていないことを確認しました。
# cat /proc/swaps
Filename Type Size Used Priority
/dev/dm-1 partition 2097148 0 -2
# free -m
total used free shared buff/cache available
Mem: 64247 7431 53662 12 3153 56284
Swap: xx xx xx
2.ソリューション
// 关闭Swap,机器重启后不生效
# swapoff -a
// 永久关闭Swap,注释掉swap那一行
# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
// 查看Swap
# free -m
# cat /proc/swaps
Kubernetesクラスターマスターとノードでスワップを無効にした後、次のコマンドを実行してkubeletを再起動します
# systemctl daemon-reload
# systemctl restart kubelet
もう一度実行して、ポッドが正常に動作していることを確認します。
# kubectl get node
# kubectl get pod --all-namespaces
3. kubelet起動制限スワップ
swapがkubeletのエラーを開いてプロセスを直接終了するのはなぜですか?基本知識の概要を取得するには、Kubernetesでスワップを無効にし、Kubeletがコンテナーのメモリスワップ#7294の構成を許可する必要がある理由を参照してください。
-
誰もが最初に話し合ったのは、ポッドがスワップの使用を許可されている場合、デフォルトのスワップ設定をどのように測定すべきか、そしてスケジューラがスワップに基づいてスケジューリングをどのように実行すべきかということでした。
-
しばらく話し合った後、スワップのサポートは複雑であることがわかりました。。。つまり、非常に複雑です。大きな男が立ち上がって言った、「スワップが必要なシーンは本当にあるの?」
-
その後、みんながスワップを批判し始めました。スワップはさまざまなパフォーマンスの不確実性をもたらし、どのシーンをスワップを使用する必要があるのかわかりませんでした。みんなが満場一致で全員を決めた後、スワップは本当に有害です。しかし、それは有益ではありません、そしてそれは使用するのが複雑です、それを使用しないでください(K8S 1.5バージョン)。
-
次に、誰かがそれを使用したい場合はどうなりますか?最初は、パラメーター構成によってサポートされていましたが、後で推奨されない使用法を見つけました。誰かが使用する必要がありました。コードにはさまざまな落とし穴があります。一緒に使用しないことをお勧めします。
-
その後、1.8以降はデフォルトでは使用されません。強制的に開かない限り、当局は強く推奨せず、踏む責任があります。
Issueを見ると、このプロセスは本当に機能が必要かどうかの典型的な議論であると私は主に考えていますが、最終的には、明確なユーザーシナリオなしに問題を複雑にしないことが非常に重要です。
- kubelet起動パラメーターの意味--fail-swap-on
このフラグは次のように表されます。ノードでスワップが有効になっている場合、Kubeletの起動に失敗します。つまり、true(デフォルト値)の場合、swapを閉じる必要があります。falseは、ホストがswapを開いた場合でも、kubeletは正常に開始できるが、ポッドはswapを使用できることを意味します。コードのこの部分は、頻繁に問題が直接発生するためです。ホストのスワップを無効にすることをお勧めします。
4.参考記事
https://www.jianshu.com/p/6f3268ce642f
https://blog.csdn.net/zstack_org/article/details/56274966
https://blog.csdn.net/nklinsirui/article/details/80855415