[转载] Kubernetes v1.37:Memory QoS 进阶到 Beta

举报
yd_266879620 发表于 2026/11/03 00:38:54 2026/11/03
【摘要】 Memory QoS 已在 Kubernetes v1.37 中进阶到 Beta,并默认启用。 在运行 cgroup v2 的 Linux 节点上,该特性使用内存控制器, 为内核提供更好的指引来处理容器内存。 它最早在 v1.22 中以 Alpha 形式引入,并在 v1.36 中扩展了分层内存预留。 本文介绍 v1.37 中的变更、进阶到 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 配置字段选择性启用特定行为:

  1. 设置 memoryThrottlingFactor(例如 0.9), 以对 Burstable 和 BestEffort 容器启用 memory.high 节流。 默认值为 null,表示不进行节流。
  2. 将 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/)
最后修改 September 29, 2026 at 11:43 AM PST: blog(zh-cn): add v1.37 Memory QoS Beta post (417e48f386)(参考地址:https://github.com/kubernetes/website/commit/417e48f3866d97a85fe4ee05cf7663ff92c5eaa8)
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。