
Kubernetes v1.37 introduces Memory QoS as a Beta feature, providing cluster operators with granular control over container memory management. Learn how this update improves workload reliability and how to configure it for your environment.
Understanding the Shift to Beta
Cluster operators have long wrestled with erratic memory behaviorâunexpected OOM kills, noisyâneighbor contention, and costly manual tuning. In KubernetesâŻv1.37, Memory QoS graduates to **Beta** and is turned on automatically for every kubelet running on Linux nodes with cgroupâŻv2. This shift gives the kernel precise guidance on how to treat container memory without you having to flip a switch.
Why is the defaultâon model a gameâchanger? The feature gate is now safe outâofâtheâbox because the default kubelet configuration does **not** enable memory throttling or reservation. No memory.high, memory.min, or memory.low values are written unless you explicitly configure them. That means you can upgrade to v1.37 with confidenceâyour existing workloads keep running exactly as before, while the platform silently prepares for smarter memory management.
- Zeroâimpact upgrade: The default
memoryThrottlingFactorisnull, so containers arenât throttled unless you set a value. - Optâin control: Set
memoryThrottlingFactor(e.g.,âŻ0.9) to enablememory.highthrottling for Burstable and BestEffort pods. - Tiered reservation: Enable
memoryReservationPolicy: TieredReservationto protect Guaranteed pods withmemory.minand Burstable pods withmemory.low. - Consistent behavior: Existing kubelet configs preserve any custom values you already have, avoiding surprise changes.
- Futureâready: The Beta stage paves the way for a GA release, letting you shape the final feature with realâworld feedback.
Strategically, this means you can focus on delivering business value instead of firefighting memory spikes. Predictable resource allocation improves pod stability, reduces costly restarts, and frees your SRE team to work on higherâimpact initiatives. If you need throttling or tiered reservation, a few lines in the kubelet configuration unlock themâno complex scripts, no downtime. Embrace the Beta shift today and let Kubernetes handle memory the way it was designed to.
Safety First: The New Default Configuration
When you upgraded to KubernetesâŻv1.37 you probably noticed that the memoryThrottlingFactor field now defaults to null instead of the historic 0.9. This isnât a random tweakâitâs a deliberate safetyâfirst design that protects your existing workloads from unexpected throttling the moment the MemoryQoS feature gate flips to âonâ by default.
In earlier Alpha releases the default of 0.9 meant the kubelet automatically wrote a memory.high limit for Burstable and BestEffort containers. As soon as the feature gate was enabled, those containers could be throttled even though you never asked for it. The result? sudden latency spikes, failed batch jobs, and a scramble to debug âwhy did my pod stop working after the upgrade?â.
Setting the default to null changes that behavior entirely:
- No automatic throttling: The kubelet will only set
memory.highwhen you explicitly provide a factor between 0 and 1. - Full backward compatibility: Clusters that upgrade without touching their kubelet config continue to run exactly as beforeâno hidden policy changes, no surprise performance regressions.
- Preserves intentional settings: If your configuration already contains a
memoryThrottlingFactorvalue, that value is retained, so you keep the throttling behavior you deliberately enabled.
From a strategic standpoint, this change lets you adopt the powerful MemoryQoS capabilities on your own schedule. You can:
- Test safely: Deploy v1.37 in a staging environment, observe normal operation, then add
memoryThrottlingFactor: 0.9when youâre ready to enforce throttling. - Scale confidently: Upgrade production clusters without fearing a silent shift in resource limits that could affect SLAs.
- Maintain control: Explicit configuration remains the single source of truth, aligning with compliance and governance policies.
In short, the null default is the âsafety netâ that guarantees your workloads stay stable during the transition, while still giving you the flexibility to enable memory throttling when it truly adds value to your operations.
Configuring Memory Throttling and Reservation
When you upgrade to KubernetesâŻv1.37, Memory QoS is already enabled, but it wonât change your workloads unless you explicitly set memoryThrottlingFactor or memoryReservationPolicy. That defaultânull behavior protects you from accidental throttling, yet it also means you must take deliberate steps to reap the performance and stability gains that tiered reservation and throttling provide.
Why you should act now
- Predictable burst handling: Setting
memoryThrottlingFactor(e.g.,âŻ0.9) tells the kubelet to calculatememory.highfor Burstable and BestEffort pods, preventing runaway memory use without killing the container. - Hardâwired safety net: Enabling
memoryReservationPolicy: TieredReservationaddsmemory.minfor Guaranteed pods andmemory.lowfor Burstable pods, guaranteeing a baseline of RAM even under node pressure. - Zeroâdowntime upgrades: Because the default is null, you can roll out the configuration on a live cluster without triggering unexpected throttling.
Stepâbyâstep implementation
- Enable throttling only â add a single line to your
KubeletConfiguration:
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration memoryThrottlingFactor: 0.9
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration memoryThrottlingFactor: 0.9 memoryReservationPolicy: TieredReservation
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration memoryReservationPolicy: TieredReservation
Remember that memoryReservationPolicy applies nodeâwide; every pod inherits the tiered rules. If your environment mixes workloads that need hard reservation with those that should stay reclaimable, youâll need to choose the policy that best aligns with your overall reliability goals.
Strategic payoff
- Higher node utilization: Throttling curbs memory spikes, freeing capacity for other pods.
- Reduced OOM incidents: Tiered reservation guarantees a safety margin for critical services.
- Futureâproofing: As Memory QoS moves toward GA, having the configuration in place now positions you to adopt upcoming enhancements with minimal friction.
Navigating Node-Wide Limitations
When you run a mixedâworkload clusterâGuaranteed services that need hard memory reservation alongside Burstable or BestEffort jobs that should stay reclaimableâyouâve likely hit a roadblock: the memoryReservationPolicy in Kubernetes v1.37 applies to the entire node. This nodeâwide setting means every pod inherits the same reservation rules, and thereâs no native way to opt individual pods in or out.
- Uniform reservation forces a tradeâoff. Guaranteed pods receive
memory.min, while Burstable pods getmemory.low, even if they would benefit from a more flexible approach. - Hard reservation can starve neighbors. Pageâcache usage by a single pod is counted against its reservation, preventing the kernel from reclaiming that memory for other workloads.
- Operational complexity spikes. Teams must choose a single policy for the whole node, often leading to overâprovisioning or underâutilization.
Addressing this limitation isnât just a technical tweakâitâs a strategic lever for cost efficiency and reliability. Hereâs how forwardâthinking operators are turning the challenge into an advantage:
- Dedicated node pools. Segregate workloads by QoS class into separate node groups, each with its own
memoryReservationPolicy. This isolates hardâreservation needs without compromising reclaimable capacity elsewhere. - Hybrid kubelet configs. Deploy custom kubelet configurations per node pool, enabling TieredReservation only where it adds value and leaving it disabled for flexible workloads.
- Proactive monitoring. Use the new Memory QoS metrics to track reservation impact in real time, allowing you to fineâtune pool sizes before performance issues surface.
- Engage the community. Contribute to SIG Nodeâs ongoing work (see issue #140246) to accelerate perâpod reservation controls, positioning your organization as a thought leader.
By embracing these tactics, you gain:
- Predictable performance. Guaranteed services receive the memory protection they need.
- Higher node utilization. Burstable workloads stay reclaimable, squeezing more value from each VM.
- Reduced operational risk. Clear separation eliminates the âoneâsizeâfitsâallâ surprise during scaling events.
Donât let a nodeâwide policy dictate your architecture. Align your cluster design with business outcomes today, and stay ahead of the next Memory QoS GA release.
Operational Best Practices for Kubernetes Admins
Kubernetes administrators constantly wrestle with âstaleâ memory settings that linger after upgrades or configuration changes. In v1.37, MemoryQoS is now beta and enabled by default, but the kubelet no longer writes memory.high, memory.min, or memory.low unless you optâin. This safety net protects existing workloads, yet it also means you must actively manage stale memory protection to avoid unexpected throttling or reservation sideâeffects.
- Know the defaults: After upgrading, the kubelet resets stale protection to zero on cgroupâŻv2 nodes, so any lingering
memory.highvalues are cleared automatically. - Enable only what you need: Set
memoryThrottlingFactor(e.g., 0.9) to turn on throttling, or usememoryReservationPolicy: TieredReservationfor tiered protection. Leaving these fields unset keeps the cluster behavior unchanged. - Disable cleanly: To turn the feature off, set the feature gate
MemoryQoS: falseand remove any custommemoryThrottlingFactorormemoryReservationPolicyentries. The kubelet will then reset stale values at startup. - Monitor for GA: The next milestone is GA. Continuous monitoring of kubelet logs and cgroup metrics ensures you catch regressions before they impact production.
Strategically, treating MemoryQoS as a toggleable knob gives you granular control over resource guarantees without sacrificing the flexibility of mixed workloads. By auditing your current kubelet configuration, you can confirm that stale memory limits are either intentionally set or safely cleared. Pair this audit with proactive alerting on cgroup memory metrics, and youâll be ready to adopt any GAâlevel refinements the SIGâŻNode community releases.
Ready to optimize your cluster performance? Audit your current kubelet configurations and reach out to our engineering team for a Kubernetes performance assessment.
Looking for Custom Software, SaaS, or Dedicated Developers?
Appworks Technologies designs, builds, and scales production enterprise platforms, microservices, and multi-tenant SaaS products tailored to your business goals.
Editorial Policy & Research Methodology
Our findings are based on rigorous internal research, verified industry benchmarks, and direct technical implementation experience from our enterprise client projects. All statistics and technical claims are reviewed by senior engineers before publication to ensure accuracy, transparency, and helpfulness for our readers.
