Kubernetes v1.37:Memory QoS 升级为 Beta

💡 原文英文,约700词,阅读约需3分钟。
📝

内容提要

Kubernetes v1.37 将 Memory QoS 升级为 Beta 并默认启用,适用于 cgroup v2 的 Linux 节点。默认不写入 memory.high/min/low,避免升级改变行为;memoryThrottlingFactor 默认改为 null。用户可显式配置限流与分层预留。该功能由 SIG Node 推动,下一步将迈向 GA。

🔎

延伸解读

升级行为变化:默认不写入内存参数

在 v1.37 中,Memory QoS 特性门控默认开启,但 kubelet 默认不会向 cgroup 写入 memory.high、memory.min 或 memory.low。同时 memoryThrottlingFactor 的默认值从 0.9 改为 null。这意味着升级后,除非你显式配置,否则现有工作负载的内存限流行为不会改变。若配置文件中已显式设置该值,则升级后仍会保留并继续生效。

如何显式启用限流与分层预留

若希望启用内存限流,需在 kubelet 配置中显式设置 memoryThrottlingFactor(0 到 1 之间),kubelet 会据此为 Burstable 和 BestEffort 容器计算 memory.high。若需分层预留,则设置 memoryReservationPolicy 为 TieredReservation,此时 Guaranteed Pod 获得 memory.min,Burstable Pod 获得 memory.low。注意该策略作用于节点上所有 Pod,无法针对单个 Pod 选

分层预留的局限与影响

TieredReservation 策略会统一应用于节点上的每个 Pod,无法为个别 Pod 单独开启或关闭。对于同时运行需要硬预留和应保持可回收的工作负载的节点,只能为所有 Pod 选择同一种策略。此外,硬预留会覆盖计入容器 cgroup 的所有内存,包括页面缓存,因此读取大文件的 Pod 可能持有内核本可回收以服务邻居的内存。

禁用与回退注意事项

升级后如需禁用该功能,可将特性门控 MemoryQoS 设为 false,并确保 kubelet 配置兼容。kubelet 会拒绝配置,如果 memoryThrottlingFactor 被设置为非 0.9 的值,或 memoryReservationPolicy 为 TieredReservation,因此需移除或调整这些字段。当特性门控关闭或未启用分层预留时,kubelet 会在启动时重置 cgroup v2 节点上的陈旧保护值,例如将根 kubepods cgroup 的 memory.min 和 memor

Q&A

Kubernetes v1.37 中 Memory QoS 升级到 Beta 后,默认行为有什么变化?

Memory QoS 在 v1.37 中升级为 Beta 并默认启用,但默认不会向 cgroup 写入 memory.high、memory.min 或 memory.low,因此升级不会改变现有集群的运行时行为。memoryThrottlingFactor 的默认值改为 null,除非显式配置,否则 kubelet 不会设置 memory.high。

Memory QoS 在 v1.37 中为什么将 memoryThrottlingFactor 默认值改为 null?

因为功能门控现在默认开启,如果 memoryThrottlingFactor 仍默认为 0.9,kubelet 会自动为容器设置 memory.high,可能对原本没有限流的工作负载造成限流。改为 null 可确保升级到 v1.37 不会改变现有集群的运行时行为。

如何显式启用 Memory QoS 的内存限流和分层预留?

可以通过 kubelet 配置字段显式启用:设置 memoryThrottlingFactor 为 0 到 1 之间的值(如 0.9)来启用内存限流;设置 memoryReservationPolicy 为 TieredReservation 来启用分层预留。例如:apiVersion: kubelet.config.k8s.io/v1beta1, kind: KubeletConfiguration, memoryThrottlingFactor: 0.9, memoryReservationPolicy: TieredReservation。

升级到 v1.37 后,如果之前配置了 memoryThrottlingFactor,限流行为会受影响吗?

如果 kubelet 配置文件中已包含显式的 memoryThrottlingFactor 值,该值在升级期间会被保留,限流继续像以前一样工作。如果配置文件中没有该字段,kubelet 将使用新的 null 默认值并停止设置 memory.high。要保留限流,需显式添加 memoryThrottlingFactor。

如何禁用 Memory QoS 功能?

可以通过将功能门控设置为 false 来禁用,并确保 kubelet 配置兼容。kubelet 会拒绝配置,如果 memoryThrottlingFactor 设置为非 0.9 的值,或 memoryReservationPolicy 为 TieredReservation,因此需要移除或调整这些字段。例如:featureGates: MemoryQoS: false。

Memory QoS 的 memoryReservationPolicy 设置为 TieredReservation 时有什么限制?

TieredReservation 策略应用于节点上的每个 Pod,无法为单个 Pod 选择加入或退出。每个 Guaranteed Pod 获得 memory.min,每个 Burstable Pod 获得 memory.low。硬预留覆盖容器 cgroup 的所有内存,包括页面缓存,因此读取大文件的 Pod 可能持有内核本可回收的内存,影响邻居。

🏷️

标签

➡️

继续阅读