kubeletサービスの実行中にスワップを開けないのはなぜですか?

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

おすすめ

転載: blog.csdn.net/yjk13703623757/article/details/106361453