本文发表已超过一年。较旧的文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
Kubernetes v1.22 新特性:Alpha 支持使用交换内存
1.22 版本引入了在每个节点上为 Kubernetes 工作负载配置交换内存使用的 Alpha 支持。
在之前的版本中,Kubernetes 不支持在 Linux 上使用交换内存,因为当涉及到交换时,很难提供保障并计算 Pod 的内存利用率。作为 Kubernetes 早期设计的一部分,交换支持被认为是超出范围的,如果 kubelet 在节点上检测到交换,默认将启动失败。
然而,有许多用例可以从 Kubernetes 节点支持交换中受益,包括提高节点稳定性、更好地支持内存开销大但工作集小的应用、使用内存受限设备以及内存灵活性。
因此,在过去的两个版本中,SIG Node 一直致力于收集适当的用例和反馈,并提出了一个设计方案,以一种受控、可预测的方式将交换支持添加到节点,以便 Kubernetes 用户可以进行测试并提供数据,以便在交换的基础上继续构建集群能力。节点交换内存支持进入 Alpha 是我们实现这一目标的第一个里程碑!
它是如何工作的?
可以想象在节点上使用交换内存的方式有很多种。为了使这个初始实现的范围易于管理,当交换内存已在节点上配置并可用时,我们提议应该能够配置 kubelet,使其能够做到:
- 它可以在开启交换的情况下启动。
- 默认情况下,它将指示容器运行时接口 (CRI) 为 Kubernetes 工作负载分配零交换内存。
- 你可以配置 kubelet 来指定整个节点的交换利用率。
节点上的交换配置通过 KubeletConfiguration 中的 memorySwap
暴露给集群管理员。作为集群管理员,你可以通过设置 memorySwap.swapBehavior
来指定节点在存在交换内存时的行为。
这可以通过向容器运行时接口 (CRI) 添加一个 memory_swap_limit_in_bytes
字段来实现。kubelet 的配置将控制 kubelet 通过 CRI 指示容器运行时为每个容器分配多少交换内存。然后,容器运行时会将交换设置写入容器级别的 cgroup。
如何使用它?
在已配置交换内存的节点上,可以通过在 kubelet 上启用 NodeSwap
feature gate,并禁用 failSwapOn
配置设置或 --fail-swap-on
命令行标志来启用 Kubernetes 在节点上使用交换。
你也可以选择配置 memorySwap.swapBehavior
,以指定节点将如何使用交换内存。例如:
memorySwap:
swapBehavior: LimitedSwap
swapBehavior
的可用配置选项包括
LimitedSwap
(默认):Kubernetes 工作负载使用的交换内存量受到限制。不受 Kubernetes 管理的节点上工作负载仍可以使用交换。UnlimitedSwap
:Kubernetes 工作负载可以使用任意多的请求交换内存,直至达到系统限制。
如果未指定 memorySwap
的配置但 feature gate 已启用,kubelet 默认将应用与 LimitedSwap
设置相同的行为。
LimitedSwap
设置的行为取决于节点是运行在 v1 还是 v2 版本的 control group(也称为“cgroup”)下
- cgroups v1: 如果设置了 Pod 的内存限制,Kubernetes 工作负载可以使用内存和交换的任意组合,直至达到 Pod 的内存限制。
- cgroups v2: Kubernetes 工作负载不能使用交换内存。
注意事项
系统上存在交换会降低可预测性。交换的性能比常规内存差,有时甚至相差多个数量级,这可能导致意外的性能下降。此外,交换会改变系统在内存压力下的行为,并且应用程序无法直接控制其内存使用的哪些部分会被换出。由于启用交换允许 Kubernetes 工作负载使用更多内存,而这些内存无法被可预测地计算,因此也增加了“吵闹的邻居”(noisy neighbours)和意外打包配置的风险,因为调度器无法考虑交换内存的使用情况。
启用交换内存的节点性能取决于底层物理存储。与固态硬盘或 NVMe 等更快的存储介质相比,在每秒 I/O 操作次数 (IOPS) 受限的环境中(例如存在 I/O 限制的云虚拟机),使用交换内存时的性能会显著降低。
因此,对于某些性能受限的工作负载或环境,我们不建议使用交换。集群管理员和开发者应在使用交换进行生产部署之前对节点和应用程序进行基准测试,并且我们需要你的帮助!
展望未来
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)。