我需要在 kubernates pod 中添加交换内存。这样,如果任何 Pod 超出可用 RAM,则它可以使用硬盘中的交换内存。这在 kubernates 中可能吗?
从 Kubernetes 1.22 开始,支持交换内存(作为 alpha 功能)。
swapon
或 /etc/fstab
);fail-on-swap
),NodeSwap
功能门,并且MemorySwap.SwapBehavior=UnlimitedSwap
让 kubernetes 工作负载使用交换内存。请注意,目前不支持为每个工作负载单独设置交换限制(尽管这是计划在测试版中进行的)。要么不允许任何容器使用任何交换内存,要么所有容器都可以使用无限的交换内存。
(如果工作负载不允许允许使用交换,那么根据 Linux 内核 cgroups 版本,它们仍然可以被交换。在 cgroups v2 之前,进程无法对交换和物理内存强制实施单独的限制,但只能为合并总数。)
有关更多详细信息,请参阅文档以及其中引用的 kubernetes 增强提案 (KEP)。
禁用交换。您必须禁用交换才能使 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
但请记住,这不是推荐的方式。
我希望 Pod 在容器内进行交换,而不是在主机上。如果应用程序使用太多内存,内核会重新启动服务。如果容器重新启动,则会减少正常运行时间。交换可以提供帮助
在节点上启用交换已经包含在之前的答案中。
如果您需要控制哪些 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