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时