如何在 kubernetes pod 中添加交换内存?

问题描述 投票:0回答:4

我需要在 kubernates pod 中添加交换内存。这样,如果任何 Pod 超出可用 RAM,则它可以使用硬盘中的交换内存。这在 kubernates 中可能吗?

kubernetes memory
4个回答
4
投票

Kubernetes 1.22 开始,支持交换内存(作为 alpha 功能)。

  1. 使用交换内存设备配置节点的主机操作系统(例如,使用
    swapon
    /etc/fstab
    );
  2. 将该节点上的 kubelet 配置为:
    • 尽管检测到交换的存在仍然开始(禁用
      fail-on-swap
      ),
    • 启用
      NodeSwap
      功能门,并且
    • 配置
      MemorySwap.SwapBehavior=UnlimitedSwap
      让 kubernetes 工作负载使用交换内存。

请注意,目前不支持为每个工作负载单独设置交换限制(尽管这是计划在测试版中进行的)。要么不允许任何容器使用任何交换内存,要么所有容器都可以使用无限的交换内存。

(如果工作负载不允许允许使用交换,那么根据 Linux 内核 cgroups 版本,它们仍然可以被交换。在 cgroups v2 之前,进程无法对交换和物理内存强制实施单独的限制,但只能为合并总数。)

有关更多详细信息,请参阅文档以及其中引用的 kubernetes 增强提案 (KEP)。


3
投票

官方 Kubernetes 先决条件说:

禁用交换。您必须禁用交换才能使 kubelet 正常工作 正确地。

您应该使用 cpu/内存限制进行部署。 Kubelet 并不是为处理交换情况而设计的。如果允许在主机系统上发生内存交换,则可能会导致 Kubernetes 内出现性能和稳定性问题。

但是有一种方法可以在安装时禁用交换

kubeadm
:

  • /etc/systemd/system/kubelet.service.d/20-allow-swap.conf
    中创建一个包含以下内容的文件:

[Service] Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

  • 执行:

sudo systemctl daemon-reload

  • 使用标志
    kubeadm
    运行
    --ignore-preflight-errors=Swap
    :

kubeadm init --ignore-preflight-errors=Swap

但请记住,这不是推荐的方式。


0
投票

我希望 Pod 在容器内进行交换,而不是在主机上。如果应用程序使用太多内存,内核会重新启动服务。如果容器重新启动,则会减少正常运行时间。交换可以提供帮助


0
投票

在节点上启用交换已经包含在之前的答案中。

如果您需要控制哪些 pod 和容器可以交换以及交换的程度,您可以将 nri-memory-qos 插件 安装到集群中。这允许使用注释控制容器级别的交换。

helm repo add nri-plugins https://containers.github.io/nri-plugins
helm install nri-memory-qos nri-plugins/nri-memory-qos --set nri.patchRuntimeConfig=true --namespace kube-system
© www.soinside.com 2019 - 2024. All rights reserved.