[转载] Kubernetes v1.37:Memory QoS 进阶到 Beta
本文为授权转载,非本账号原创。
原文:Kubernetes v1.37:Memory QoS 进阶到 Beta(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/)
原作者及译者:借由 Qi Wang (Red Hat), Sohan Kunkerkar (Red Hat) | 译者 Paco Xu (DaoCloud) | 2026.09.14
来源:Kubernetes 官方中文博客;许可:CC BY 4.0(参考地址:https://creativecommons.org/licenses/by/4.0/)。保留原作者和译者署名,正文仅做适配博客编辑器的排版与链接格式转换,未改写技术内容。
内容不代表原作者或 Kubernetes 项目对本账号的认可或背书。
Memory QoS 已在 Kubernetes v1.37 中进阶到 Beta,并默认启用。 在运行 cgroup v2 的 Linux 节点上,该特性使用内存控制器, 为内核提供更好的指引来处理容器内存。 它最早在 v1.22 中以 Alpha 形式引入,并在 v1.36 中扩展了分层内存预留。
本文介绍 v1.37 中的变更、进阶到 Beta 对集群运维人员的意义,以及如何配置该特性。
v1.37 的变更(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#v1-37-%e7%9a%84%e5%8f%98%e6%9b%b4)
Memory QoS 为 Beta 且默认启用(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#memory-qos-%e4%b8%ba-beta-%e4%b8%94%e9%bb%98%e8%ae%a4%e5%90%af%e7%94%a8)
MemoryQoS 特性门控在 v1.37 中已是 Beta。
这意味着在每个 v1.37 版本的 kubelet 中,该特性都会默认启用,无需更改配置。
默认开启该特性是安全的,因为默认的 kubelet 配置并不会启用内存节流或内存预留。
除非你显式配置,否则不会向 cgroup 写入 memory.high、memory.min 或 memory.low 值。
你可以通过 kubelet 配置字段选择性启用特定行为:
- 设置
memoryThrottlingFactor(例如0.9), 以对 Burstable 和 BestEffort 容器启用memory.high节流。 默认值为null,表示不进行节流。 - 将
memoryReservationPolicy设置为TieredReservation, 以通过memory.min和memory.low启用分层内存保护。 默认值为None,表示不进行内存预留。
默认的 memoryThrottlingFactor 变更为 null(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e9%bb%98%e8%ae%a4%e7%9a%84-memorythrottlingfactor-%e5%8f%98%e6%9b%b4%e4%b8%ba-null)
在更早的 Alpha 版本中,memoryThrottlingFactor 的默认值为 0.9,
这意味着启用特性门控后,kubelet 会为容器设置 memory.high。
在 v1.37 中,默认值为 null,
因此除非你配置了具体数值,否则 kubelet 不会设置 memory.high。
作出这一变更是因为特性门控现已默认开启,
如果自动设置 memory.high,可能会节流那些此前在无节流情况下运行的工作负载。
将其设为 null 可确保升级到 v1.37 时不会改变现有集群的运行时行为。
如果你的 kubelet 配置文件中已经显式包含 memoryThrottlingFactor 值,
该值会在升级时被保留,节流行为会继续按原样工作。
如果你的配置文件不包含 memoryThrottlingFactor,
kubelet 会使用新的 null 默认值,并停止设置 memory.high。
若要在这种情况下继续启用节流,请显式添加 memoryThrottlingFactor:
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9
如何在 v1.37 中配置 MemoryQoS(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%a6%82%e4%bd%95%e5%9c%a8-v1-37-%e4%b8%ad%e9%85%8d%e7%bd%ae-memoryqos)
有关配置 Memory QoS 的完整说明,请参阅 使用 cgroup v2 的内存 QoS(参考地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-qos/#memory-qos-with-cgroup-v2)、 配置内存预留(参考地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-qos/#configuring-memory-reservation) 以及系统要求(参考地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-qos/#system-requirements)。
仅启用内存节流(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e4%bb%85%e5%90%af%e7%94%a8%e5%86%85%e5%ad%98%e8%8a%82%e6%b5%81)
将 memoryThrottlingFactor 设置为 0 到 1 之间的值。
kubelet 使用该因子为 Burstable 和 BestEffort 容器计算 memory.high。
有关各 QoS 类如何计算 memory.high,请参阅
内存抑制(参考地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-qos/#memory-throttling)。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9
同时启用内存节流与分层内存预留(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%90%8c%e6%97%b6%e5%90%af%e7%94%a8%e5%86%85%e5%ad%98%e8%8a%82%e6%b5%81%e4%b8%8e%e5%88%86%e5%b1%82%e5%86%85%e5%ad%98%e9%a2%84%e7%95%99)
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryThrottlingFactor: 0.9
memoryReservationPolicy: TieredReservation
启用分层内存预留但不启用节流(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%90%af%e7%94%a8%e5%88%86%e5%b1%82%e5%86%85%e5%ad%98%e9%a2%84%e7%95%99%e4%bd%86%e4%b8%8d%e5%90%af%e7%94%a8%e8%8a%82%e6%b5%81)
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
memoryReservationPolicy: TieredReservation
完全禁用 Memory QoS(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%ae%8c%e5%85%a8%e7%a6%81%e7%94%a8-memory-qos)
升级后若要禁用该特性,请将特性门控设置为 false,并确保 kubelet 配置兼容。
如果 memoryThrottlingFactor 被设置为除此前默认值 0.9 以外的任何值,
或者 memoryReservationPolicy 为 TieredReservation,
kubelet 会拒绝该配置,因此若你设置过这些字段,请删除或调整它们。
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
featureGates:
MemoryQoS: false
当特性门控关闭,或 memoryReservationPolicy 不是 TieredReservation 时,
kubelet 会在 cgroup v2 节点启动时重置残留的保护设置:
将根 kubepods cgroup 的 memory.min 和 memory.low 重置为 0,
并将 Burstable QoS cgroup 的 memory.low 重置为 0。
对于容器,残留的 memory.high 值会在重启或原地调整资源等协调路径上被重置为 max。
已知限制:内存预留是节点范围的(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%b7%b2%e7%9f%a5%e9%99%90%e5%88%b6-%e5%86%85%e5%ad%98%e9%a2%84%e7%95%99%e6%98%af%e8%8a%82%e7%82%b9%e8%8c%83%e5%9b%b4%e7%9a%84)
memoryReservationPolicy 作用于节点上的每一个 Pod。
在 TieredReservation 下,每个 Guaranteed Pod 都会获得 memory.min,
每个 Burstable Pod 都会获得 memory.low;无法让单个 Pod 单独加入或退出。
若节点上同时混合了需要硬预留的工作负载和其内存应保持可回收的工作负载,
则必须为它们统一选择一种策略。
硬预留还会覆盖计入容器 cgroup 的所有内容,包括页缓存, 因此读取大文件的 Pod 可能会占住内核本可回收并提供给相邻工作负载的内存。
SIG Node 正在 kubernetes/kubernetes#140246(参考地址:https://github.com/kubernetes/kubernetes/issues/140246) 中跟踪以上两点。如果你受到影响,最适合在该 Issue 中说明你的工作负载情况。
后续展望(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%90%8e%e7%bb%ad%e5%b1%95%e6%9c%9b)
Memory QoS 的下一个里程碑是进阶到 GA。 Beta 用户的反馈将决定 GA 之前还需要做哪些调整。 如果你遇到问题,请在 kubernetes/kubernetes(参考地址:https://github.com/kubernetes/kubernetes/issues) 提交缺陷报告。
如何进一步了解?(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%a6%82%e4%bd%95%e8%bf%9b%e4%b8%80%e6%ad%a5%e4%ba%86%e8%a7%a3)
- KEP-2570: Memory QoS(参考地址:https://www.kubernetes.dev/resources/keps/2570/)
- Pod Quality of Service Classes(参考地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-qos/)
- Memory QoS with cgroup v2(参考地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-qos/#memory-qos-with-cgroup-v2)
- Managing Resources for Containers(参考地址:https://kubernetes.io/zh-cn/docs/concepts/configuration/manage-resources-containers/)
- Kubernetes cgroups v2 support(参考地址:https://kubernetes.io/zh-cn/docs/concepts/architecture/cgroups/)
- Linux kernel cgroups v2 documentation(参考地址:https://docs.kernel.org/admin-guide/cgroup-v2.html)
参与其中(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/14/kubernetes-v1-37-memory-qos-graduates-to-beta/#%e5%8f%82%e4%b8%8e%e5%85%b6%e4%b8%ad)
此特性由 SIG Node(参考地址:https://www.kubernetes.dev/community/community-groups/sigs/node/) 推动。 如果你有兴趣参与贡献或提供反馈,可以通过以下渠道联系我们:
- Slack:#sig-node(参考地址:https://kubernetes.slack.com/messages/sig-node)
- 邮件列表(参考地址:https://groups.google.com/forum/#!forum/kubernetes-sig-node)
- SIG Node 会议(参考地址:https://www.kubernetes.dev/community/community-groups/sigs/node/#meetings)
- ←上一页(参考地址:https://kubernetes.io/zh-cn/blog/2026/09/08/kubernetes-v1-37-advancing-workload-aware-scheduling/)
- 下一页→(参考地址:https://kubernetes.io/zh-cn/blog/2026/10/05/scaling-kubernetes-workloads-with-node-swap/)
- 点赞
- 收藏
- 关注作者
评论(0)