Kubernetes基础——kubelet检测交换内存时无法启动

一、Kubernetes社区公告

交换分区的配置
kubelet 的默认行为是在节点上检测到交换内存时无法启动。 这意味着要么禁用交换(swap)功能,要么让 kubelet 容忍交换。

若需允许交换分区(swap),请在 kubelet 配置文件中添加 failSwapOn: false,或通过命令行参数指定。 
注意:
即使设置了 failSwapOn: false,工作负载默认情况下仍无法访问交换空间。
可以通过在 kubelet 配置文件中设置 swapBehavior 来修改此设置。
若要使用交换空间, 请设置 swapBehavior 的值,这个值不能是默认的 NoSwap。 更多细节参阅交换内存管理。 要禁用交换分区(swap),可以使用命令
sudo swapoff -a 暂时关闭交换分区功能。 要使此更改在重启后仍然生效,请确保在系统的配置文件(如 /etc/fstab 或 systemd.swap)中禁用交换功能, 具体取决于你的系统配置方式。

 二、交换内存(swap)管理

特性状态: Kubernetes v1.30 [beta] (enabled by default: true)
要在节点上启用交换内存,必须启用 kubelet 的 NodeSwap 特性门控(默认启用), 同时使用 --fail-swap-on 命令行参数或者将 failSwapOn 配置设置为 false。 为了允许 Pod 使用交换内存,在 kubelet 配置中不应将 swapBehavior 设置为 NoSwap(默认行为)。

警告:
当内存交换功能被启用后,Kubernetes 数据(如写入 tmpfs 的 Secret 对象的内容)可以被交换到磁盘。

用户还可以选择配置 memorySwap.swapBehavior 以指定节点使用交换内存的方式。例如:

memorySwap:
  swapBehavior: LimitedSwap
NoSwap(默认):Kubernetes 工作负载不会使用交换内存。
LimitedSwap:Kubernetes 工作负载对交换内存的使用受到限制。 只有具有 Burstable QoS 的 Pod 可以使用交换内存。
如果启用了特性门控但是未指定 memorySwap 的配置,默认情况下 kubelet 将使用与 NoSwap 设置相同的行为。

采用 LimitedSwap 时,不属于 Burstable QoS 分类的 Pod (即 BestEffort/Guaranteed QoS Pod) 被禁止使用交换内存。为了保持上述的安全性和节点健康性保证, 在 LimitedSwap 生效时,不允许这些 Pod 使用交换内存。

在详细介绍交换限制的计算之前,有必要定义以下术语:

nodeTotalMemory:节点上可用的物理内存总量。
totalPodsSwapAvailable:节点上可供 Pod 使用的交换内存总量 (一些交换内存可能被保留由系统使用)。
containerMemoryRequest:容器的内存请求。
交换内存限制被配置为 (containerMemoryRequest / nodeTotalMemory) * totalPodsSwapAvailable 的值。

需要注意的是,位于 Burstable QoS Pod 中的容器可以通过将内存请求设置为与内存限制相同来选择不使用交换内存。 以这种方式配置的容器将无法访问交换内存。

只有 Cgroup v2 支持交换内存,Cgroup v1 不支持。

 

https://kubernetes.io/zh-cn/docs/concepts/architecture/nodes/#swap-memory

 

posted on 2025-03-18 17:45  gkhost  阅读(72)  评论(0)    收藏  举报

导航