Kubernetes v1.22 alpha特性: 支持使用交换内存

Author: Elana Hashman (Red Hat)

1.22版本引入了一个alpha特性支持: Kubernetes工作负载可以配置使用node节点上的交换内存

在之前版本中,Kubernetes不支持在Linux上使用交换内存,因为当涉及内存交换时,很难描述pod内存的使用情况。 并且如果在一个节点上检测到交换分区,该节点上的kubelet默认情况下将无法启动。

但是,交换内存有许多使用场景 ,并且可以改进节点稳定性、更好地支持具有高内存开销但工作集较小的应用程序、使用内存受限的设备和内存灵活性。

因此,在过去的两个版本中,SIG Node(k8s社区Node方向的兴趣小组)一直在收集关于交换内存的使用场景与社区反馈建议。 并提出了一种以可控的、可预测的方式向节点添加交换内存(swap)支持的设计, 以便Kubernetes用户可以进行测试swap并提供测试数据,从而可以基于具有swap的运行时构建集群功能。

swap支持的第一个里程碑,便是该特性alpha阶段毕业。

初衷

swap有两种不同类型的用户,它们可能会重叠:

  • 节点管理员: 他们可能希望交换可用来进行节点级性能调优和稳定性/减少嘈杂的邻居问题
  • 应用程序开发人员: 他们编写的应用程序将从使用交换内存中受益

用户故事

通过使用swap提高系统稳定性

Cgroupsv2改进的内存管理算法,如oomd,强烈推荐使用swap。因此,在节点上使用少量的交换可以改善更好的资源压力处理和恢复.

节点的swap配置通过KubeletConfiguration 中的memorySwap字段对集群管理员可见

作为集群管理员,您可以通过设置memorySwap.swapBehavior来指定swap使用限制。

kubelet通过向容器运行时接口(CRI)添加memory_swap_limit_in_bytes字段, 实现容器对swap的使用限制,然后容器运行时将swap设置写入容器级别cgroup

使用方式

step1: kubelet开启该特性

--feature-gates="...,NodeMemorySwap=true"

step2: failSwapOn配置为false

/var/lib/kubelet/config.yaml

...
failSwapOn: false
...

step3: 配置swap使用限制(可选)

/var/lib/kubelet/config.yaml

...
memorySwap:
  swapBehavior: LimitedSwap
...

memorySwap.swapBehavior可选值

  • LimitedSwap(default): Kubernetes工作负载可以使用多少交换是有限的,工作负载使用的内存、交换内存总和 <= 工作负载的resource.limits.memory
  • UnlimitedSwap: Kubernetes工作负载可以根据请求使用尽可能多的交换内存,直到达到系统swap最大限制

LimitedSwap设置的行为取决于节点运行的是v1还是v2的控制组(即cgroups):

  • cgroups v1: Kubernetes工作负载可以使用多少交换是有限的,工作负载使用的内存、交换内存总和 <= 工作负载的resource.limits.memory值.
  • cgroups v2: swap的配置独立于内存,因此,在这种情况下,容器运行时可以将memory.swap.max设置为0,并且不允许使用交换

memorySwap.swapBehavior设置为UnlimitedSwap

Copyright © weiliang 2021 all right reserved,powered by Gitbook本书发布时间: 2024-04-22 16:03:41

results matching ""

    No results matching ""