为什么在Kubernetes上禁用交换


35

从Kubernetes 1.8开始,看来我需要在节点上禁用交换(或设置--fail-swap-onfalse)。

我找不到Kubernetes坚持禁用交换的技术原因。这是出于性能原因吗?安全原因?为什么没有记录此原因?

Answers:


28

kubernetes的思想是将实例紧密打包为尽可能接近100%的利用率。所有部署都应固定有CPU /内存限制。因此,如果调度程序将Pod发送到计算机,则绝对不要使用swap。您不想交换,因为它会减慢速度。

其主要表现。


2
是的,这个想法是,如果一个节点只有3gig的空闲空间可以使用..而您的新Pod想要4 ..它要在另一个节点上运行。
迈克(Mike)

这对我来说并没有太大意义,可以通过让os交换一些不常用的内存页面来交换而又不以明显的方式损害性能的方式来确定您的节点是否可以打包?
Frederik Baetens

13

据我了解,这样做的原因是kubelet并非旨在处理交换情况,而Kubernetes团队则不打算实现这一点,因为其目标是Pod应该适合主机的内存。

这个问题

对交换的支持很重要。有保证的豆荚永远都不需要交换。易爆豆荚应满足要求,而无需交换。BestEffort豆荚无法保证。现在的kubelet缺乏智能功能,无法在各个吊舱之间提供适量的可预测行为。


10

TL; DR未正确使用交换功能只是一个懒惰的黑客,这表明他们对内存子系统的了解不足,并且缺乏基本的系统管理技能。设计基础架构服务而不了解这些系统注定会以失败告终。

因此,我对此有一些评论,这对我来说似乎更像是懒惰,而不是功能或要求。绝对可能正确地处理交换,分析内存并确定如何正确利用内存子系统而不会发生交换。有很多与此相关的工具,您可以保证进程不会很容易地利用交换,因此性能问题是不正确的。根本不使用这种工具只是简单的懒惰编码,总体上,完全取消交换将损害系统性能。这里的关键是正确使用它。我同意将Pod换出到磁盘会影响性能,但是应该将许多事情换出到磁盘。

另外,Linux内核旨在利用交换,并且完全禁用它会产生负面影响。解决此问题的更好方法是将Pod固定到主内存中,而不允许它们交换到磁盘,降低vfs缓存压力,以便除非绝对必要,否则它不会交换,即使这样,您也可能导致固定的进程如果主内存已耗尽,将使MALLOC失败。

取决于容器中的过程,具有严重故障的容器或被OOM杀手杀死的容器可能会导致一些灾难性的后果。但是,我了解到,在这些容器中运行的过程理想上应该是无状态且短暂的,但是在运行20年的系统中,我从未见过有人100%地遵循预期的设计。

此外,这没有考虑到未来的技术,例如非易失性内存,以及像intel xpoint这样的较新的内存系统,这些系统可以用于使用混合磁盘/内存系统显着扩展主内存。使用这些类型的系统,他们可以将它们直接用作补充主内存,也可以利用交换文件扩展主内存,而对性能的影响可以忽略不计。


2
我非常怀疑kubernetes项目的维护者是否懒惰。目的论据似乎都没有在kubernetes中运行的容器化生态系统的范围内。
spuder

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.