从Kubernetes 1.8开始,看来我需要在节点上禁用交换(或设置--fail-swap-on
为false
)。
我找不到Kubernetes坚持禁用交换的技术原因。这是出于性能原因吗?安全原因?为什么没有记录此原因?
从Kubernetes 1.8开始,看来我需要在节点上禁用交换(或设置--fail-swap-on
为false
)。
我找不到Kubernetes坚持禁用交换的技术原因。这是出于性能原因吗?安全原因?为什么没有记录此原因?
Answers:
kubernetes的思想是将实例紧密打包为尽可能接近100%的利用率。所有部署都应固定有CPU /内存限制。因此,如果调度程序将Pod发送到计算机,则绝对不要使用swap。您不想交换,因为它会减慢速度。
其主要表现。
TL; DR未正确使用交换功能只是一个懒惰的黑客,这表明他们对内存子系统的了解不足,并且缺乏基本的系统管理技能。设计基础架构服务而不了解这些系统注定会以失败告终。
因此,我对此有一些评论,这对我来说似乎更像是懒惰,而不是功能或要求。绝对可能正确地处理交换,分析内存并确定如何正确利用内存子系统而不会发生交换。有很多与此相关的工具,您可以保证进程不会很容易地利用交换,因此性能问题是不正确的。根本不使用这种工具只是简单的懒惰编码,总体上,完全取消交换将损害系统性能。这里的关键是正确使用它。我同意将Pod换出到磁盘会影响性能,但是应该将许多事情换出到磁盘。
另外,Linux内核旨在利用交换,并且完全禁用它会产生负面影响。解决此问题的更好方法是将Pod固定到主内存中,而不允许它们交换到磁盘,降低vfs缓存压力,以便除非绝对必要,否则它不会交换,即使这样,您也可能导致固定的进程如果主内存已耗尽,将使MALLOC失败。
取决于容器中的过程,具有严重故障的容器或被OOM杀手杀死的容器可能会导致一些灾难性的后果。但是,我了解到,在这些容器中运行的过程理想上应该是无状态且短暂的,但是在运行20年的系统中,我从未见过有人100%地遵循预期的设计。
此外,这没有考虑到未来的技术,例如非易失性内存,以及像intel xpoint这样的较新的内存系统,这些系统可以用于使用混合磁盘/内存系统显着扩展主内存。使用这些类型的系统,他们可以将它们直接用作补充主内存,也可以利用交换文件扩展主内存,而对性能的影响可以忽略不计。
有再次启用它的票证,您将在那里获得更多洞察