本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes v1.22 的新功能:使用交换内存的 alpha 支持

1.22 版本引入了对按节点配置 Kubernetes 工作负载交换内存使用的 Alpha 支持。

在之前的版本中,Kubernetes 不支持在 Linux 上使用交换内存,因为当涉及交换时,很难提供保障并对 Pod 内存使用情况进行核算。作为 Kubernetes 早期设计的一部分,交换支持被认为超出范围,如果节点上检测到交换,kubelet 默认会启动失败。

然而,有许多用例将受益于 Kubernetes 节点支持交换,包括提高节点稳定性、更好地支持具有高内存开销但工作集较小的应用程序、使用内存受限设备以及内存灵活性。

因此,在过去两个版本中,SIG Node 一直致力于收集适当的用例和反馈,并提出一种以受控、可预测的方式向节点添加交换支持的设计,以便 Kubernetes 用户可以执行测试并提供数据以继续在交换之上构建集群功能。节点交换内存支持的 Alpha 毕业是我们实现此目标的第一个里程碑!

它是如何工作的?

可以设想在节点上使用交换的多种可能方式。为了使初始实现的范围易于管理,当节点上已配置并可用交换时,我们建议 kubelet 应能够配置为:

  • 它可以在交换开启的情况下启动。
  • 默认情况下,它将指示容器运行时接口(Container Runtime Interface)为 Kubernetes 工作负载分配零交换内存。
  • 您可以配置 kubelet 以指定整个节点的交换使用。

节点上的交换配置通过 KubeletConfiguration 中的 memorySwap 暴露给集群管理员。作为集群管理员,您可以通过设置 memorySwap.swapBehavior 来指定节点在存在交换内存时的行为。

这可以通过向容器运行时接口 (CRI) 添加 memory_swap_limit_in_bytes 字段来实现。kubelet 的配置将控制 kubelet 通过 CRI 指示容器运行时为每个容器分配多少交换内存。然后容器运行时会将交换设置写入容器级别的 cgroup。

我该如何使用它?

在已配置交换内存的节点上,可以通过在 kubelet 上启用 NodeSwap 功能门,并禁用 failSwapOn 配置设置--fail-swap-on 命令行标志来启用 Kubernetes 在节点上使用交换。

您还可以选择配置 memorySwap.swapBehavior 以指定节点将如何使用交换内存。例如,

memorySwap:
  swapBehavior: LimitedSwap

swapBehavior 的可用配置选项是

  • LimitedSwap(默认):Kubernetes 工作负载的交换使用受到限制。未由 Kubernetes 管理的节点上的工作负载仍可使用交换。
  • UnlimitedSwap:Kubernetes 工作负载可以使用其请求的任意数量的交换内存,直至系统限制。

如果未指定 memorySwap 的配置且已启用功能门,则 kubelet 默认将应用与 LimitedSwap 设置相同的行为。

LimitedSwap 设置的行为取决于节点是使用 v1 还是 v2 的控制组(也称为“cgroups”)运行

  • cgroups v1:如果设置了 Pod 的内存限制,Kubernetes 工作负载可以使用任意组合的内存和交换,直至 Pod 的内存限制。
  • cgroups v2:Kubernetes 工作负载不能使用交换内存。

注意事项

系统上存在交换会降低可预测性。交换的性能比常规内存差,有时甚至差几个数量级,这可能导致意外的性能回归。此外,交换会改变系统在内存压力下的行为,应用程序无法直接控制其内存使用的哪些部分被交换出去。由于启用交换允许 Kubernetes 中工作负载使用更多内存,而这些内存无法可预测地核算,因此它也增加了出现“嘈杂邻居”和意外打包配置的风险,因为调度器无法核算交换内存使用情况。

启用交换内存的节点性能取决于底层物理存储。当使用交换内存时,在每秒 I/O 操作 (IOPS) 受限的环境中,例如具有 I/O 节流的云虚拟机,性能将显著低于固态硬盘或 NVMe 等更快的存储介质。

因此,我们不建议在某些性能受限的工作负载或环境中启用交换。集群管理员和开发人员应在生产场景中使用交换之前对其节点和应用程序进行基准测试,而这方面需要您的帮助

展望未来

Kubernetes 1.22 版本引入了对节点交换内存的 Alpha 支持,我们将继续努力在 1.23 版本中实现 Beta 毕业。这将包括

  • 添加通过 cgroups 在 Pod 级别控制交换消耗的支持。
    • 这将包括设置 kubelet 在主机上检测到的系统保留交换量的能力。
  • 确定一组用于节点 QoS 的指标,以评估启用和未启用交换的节点的性能和稳定性。
  • 收集测试用例的反馈。
    • 我们将考虑引入新的交换配置模式,例如工作负载的节点范围交换限制。

我如何了解更多信息?

您可以查看 Kubernetes 网站上当前的文档

有关更多信息,以及协助测试和提供反馈,请参阅 KEP-2400 及其设计提案

我如何参与?

我们始终欢迎您的反馈!SIG Node 定期举行会议,并且可以通过 Slack(频道 #sig-node)或 SIG 的邮件列表联系。如果您想提供帮助,请随时联系我,Elana Hashman(Slack 和 GitHub 上的 @ehashman)。