DevOps & Platform Eng

Kubernetes 1.36: Pod Resource Managers Arrive (Alpha)

Kubernetes v1.36 is shaking up resource management with a new alpha feature: Pod-Level Resource Managers. This shift moves Kubernetes away from container-centric allocations towards a more flexible, pod-centric approach.

{# Always render the hero — falls back to the theme OG image when article.image_url is empty (e.g. after the audit's repair_hero_images cleared a blocked Unsplash hot-link). Without this fallback, evergreens with cleared image_url render no hero at all → the JSON-LD ImageObject loses its visual counterpart and LCP attrs go missing. #}
Kubernetes v1.36: Pods Get Smarter Resource Control — DevTools Feed

Key Takeaways

  • Kubernetes v1.36 introduces Pod-Level Resource Managers as an alpha feature, enabling pod-centric resource allocation.
  • This feature allows for hybrid resource models, dedicating exclusive NUMA-aligned resources to specific containers while others share a pod-level pool.
  • The new managers aim to improve resource efficiency and performance predictability for demanding workloads like ML training and low-latency databases.

Here’s the thing about Kubernetes: it’s a beast. And managing that beast, especially when you’re talking about performance-critical workloads — think ML training farms, ultra-low-latency trading systems, or databases that practically breathe — has always been a delicate dance. You want predictable performance, which often means carving out exclusive, NUMA-aligned resources for your main event. But pods aren’t just lonely single containers anymore. They’re ecosystems. They’ve got sidecars for logging, monitoring, service meshes, data ingress — the whole nine yards.

Historically, getting those pristine, exclusive resources for your primary application meant you had to go all-in. Every single container in the pod got a dedicated, whole-number CPU slice. Wasteful? Absolutely. Especially for a tiny metrics exporter that barely sips CPU. If you skipped that stringent allocation, you forfeited the pod’s precious Guaranteed Quality of Service (QoS) class, and with it, any hope of consistent, top-tier performance. A real Sophie’s Choice for anyone running demanding applications.

A New Hope: Pod-Level Managers Emerge

Kubernetes v1.36, however, is nudging the needle with the alpha introduction of Pod-Level Resource Managers. This isn’t just a tweak; it’s a fundamental architectural shift, extending the capabilities of the kubelet’s Topology, CPU, and Memory Managers. The big news? They now support pod-level resource specifications right in .spec.resources. We’re moving from a strictly per-container allocation model to a decidedly pod-centric one.

Enabling these new feature gates (PodLevelResourceManagers and PodLevelResources) allows the kubelet to orchestrate hybrid resource allocation models. This means you can finally get that NUMA alignment and exclusive resource allocation for your star performer without throwing CPU cores away on its less demanding companions. Flexibility meets efficiency, finally.

Real-World Scenarios: Where the Rubber Meets the NUMA

The beauty of this new approach shines in practical use cases, heavily dependent on how the Topology Manager is scoped. Take a latency-sensitive database pod, complete with a main container, a local metrics exporter, and a backup agent sidecar.

If you configure the Topology Manager with the pod scope, the kubelet performs a singular NUMA alignment based on the entire pod’s resource budget. The critical database container snags its exclusive CPU and memory slices from that specific NUMA node. What’s left over? It forms a pod shared pool. This is where your metrics exporter and backup agent reside. They share resources amongst themselves, yes, but crucially, they are isolated from the database’s dedicated slices and the rest of the node. This is huge: you can house auxiliary containers on the same NUMA node without wasting dedicated cores.

When configured with the pod Topology Manager scope, the kubelet performs a single NUMA alignment based on the entire pod’s budget. The database container gets its exclusive CPU and memory slices from that NUMA node. The remaining resources from the pod’s budget form a new pod shared pool.

Here’s how that might look in YAML:

apiVersion: v1
kind: Pod
metadata:
  name: tightly-coupled-database
spec:
  # Pod-level resources establish the overall budget and NUMA alignment size.
  resources:
    requests:
      cpu: "8"
      memory: "16Gi"
    limits:
      cpu: "8"
      memory: "16Gi"
  initContainers:
  - name: metrics-exporter
    image: metrics-exporter:v1
    restartPolicy: Always
  - name: backup-agent
    image: backup-agent:v1
    restartPolicy: Always
  containers:
  - name: database
    image: database:v1
    # This Guaranteed container gets an exclusive 6 CPU slice from the pod's budget.
    # The remaining 2 CPUs and 4Gi memory form the pod shared pool for the sidecars.
    resources:
      requests:
        cpu: "6"
        memory: "12Gi"
      limits:
        cpu: "6"
        memory: "12Gi"

Alternatively, consider an ML workload with infrastructure sidecars. Here, you’d likely lean into the container Topology Manager scope. The kubelet assesses each container individually. The ML training container, hungry for maximum performance, receives its exclusive, NUMA-aligned CPUs and memory. The service mesh sidecar? It doesn’t need that specialized treatment; it happily runs in the general node-wide shared pool. The total resource consumption is still capped by the overall pod limits, but you’re judiciously applying those exclusive, NUMA-aligned resources only where they’re truly needed.

apiVersion: v1
kind: Pod
metadata:
  name: ml-workload
spec:
  # Pod-level resources establish the overall budget constraint.
  resources:
    requests:
      cpu: "4"
      memory: "8Gi"
    limits:
      cpu: "4"
      memory: "8Gi"
  initContainers:
  - name: service-mesh-sidecar
    image: service-mesh:v1
    restartPolicy: Always
  containers:
  - name: ml-training
    image: ml-training:v1
    # Under the 'container' scope, this Guaranteed container receives exclusive,
    # NUMA-aligned resources, while the sidecar runs in the node's shared pool.
    resources:
      requests:
        cpu: "3"
        memory: "6Gi"
      limits:
        cpu: "3"
        memory: "6Gi"

CPU Quotas and the Art of Isolation

Isolation is key, and it’s handled differently for these mixed workloads. For containers that get exclusive CPU slices, the CPU CFS quota enforcement is disabled at the container level. This means they operate without the throttling typically imposed by the kernel’s Completely Fair Scheduler (CFS), ensuring they can burst and perform unimpeded.

For containers that don’t get exclusive CPU slices, they become part of a shared pool – either the pod-level shared pool or the node-wide shared pool. These containers do have CFS quota enforcement enabled. They share resources according to the CFS scheduling policy. It’s a nuanced system designed to prevent runaway processes from starving essential ones, while still providing dedicated lanes for high-stakes applications.

The Underlying Shift: From Containers to Pods

This move to pod-level resource management is more than just an optimization; it’s a philosophical shift within Kubernetes. For years, the fundamental unit of scheduling and resource allocation has been the container. This new feature acknowledges that modern applications are often distributed within a pod, and managing those distributed components as a cohesive unit is crucial for performance and efficiency. It’s about treating the pod less like a collection of independent processes and more like a single, albeit complex, application instance.

This opens up fascinating possibilities for how we design and deploy high-performance applications. Instead of meticulously calculating individual container resource needs and wrestling with QoS implications, we can now define a pod’s overall resource footprint and then intelligently delegate within that budget. It streamlines operations and, more importantly, allows for tighter resource utilization without performance penalties. This is a win for FinOps teams and for engineers chasing those elusive performance metrics.

What This Means for Developers and Operators

For developers, this means a more intuitive way to specify resource requirements for complex pods. You can clearly demarcate your performance-critical components and their supporting cast. For operators, it translates to more efficient node utilization and potentially better cost savings, as you’re no longer over-provisioning resources for sidecars just to maintain QoS for the main application. It’s a significant step towards making Kubernetes a more viable platform for the most demanding workloads.

Of course, it’s alpha. Expect rough edges, changes, and — naturally — more probing questions as it matures. But the direction is clear: Kubernetes is getting smarter about how it allocates the finite resources of the underlying hardware, and that’s a development worth watching.


🧬 Related Insights

Jordan Kim
Written by

Cloud and infrastructure correspondent. Covers Kubernetes, DevOps tooling, and platform engineering.

Worth sharing?

Get the best Developer Tools stories of the week in your inbox — no noise, no spam.

Originally reported by Kubernetes Blog

Stay in the loop

The week's most important stories from DevTools Feed, delivered once a week.