Kubernetes v1.36 “Haru” Is Here: User Namespaces GA, Supply Chain Security, and What to Upgrade Now

Kubernetes v1.36, codenamed “Haru” (春 — spring, 晴れ — clear skies, 遥か — distant horizon), shipped on April 22, 2026. With 70 enhancements — 18 graduating to Stable, 25 entering Beta, and 25 arriving as Alpha — this is one of the most feature-rich releases in recent memory. The logo, inspired by Hokusai’s Thirty-six Views of Mount Fuji, reimagines the iconic Red Fuji print with the Kubernetes helm set into the sky.

Here’s what you need to know, and what you should upgrade for.

User Namespaces Are Finally GA

After six years of development and three KEPs, User Namespaces support in Kubernetes has reached General Availability. This is arguably the biggest security milestone in the project’s history.

The problem it solves is fundamental: a process running as root inside a container is also root on the host. If an attacker breaks out of the container through a kernel vulnerability or misconfigured mount, they have host-level access. User Namespaces fix this by mapping the container’s root user (UID 0) to an unprivileged user on the host.

The key enabler was ID-mapped mounts (introduced in Linux 5.12). Instead of recursively chowning every file in a volume — an expensive operation that killed startup performance for large volumes — the kernel remaps UIDs/GIDs at mount time in O(1). No file ownership changes on disk, instant and efficient.

Using it is dead simple. Set hostUsers: false in your Pod spec:

apiVersion: v1
kind: Pod
metadata:
  name: isolated-workload
spec:
  hostUsers: false
  containers:
  - name: app
    image: fedora:42
    securityContext:
      runAsUser: 0

No changes to container images, no complex configuration. When hostUsers: false is set, capabilities like CAP_NET_ADMIN become namespaced — they grant administrative power over container-local resources without affecting the host. This enables use cases that previously required fully privileged containers.

Fine-Grained Kubelet API Authorization Goes GA

This one is a big deal for security. The kubelet exposes an HTTPS API that gives access to pod listings, node metrics, container logs, and critically, the ability to execute commands inside running containers. Before v1.36, almost all kubelet API paths were mapped to a single nodes/proxy subresource — meaning any workload that needed to read metrics also had the ability to run commands in every container on the node.

Security researchers demonstrated in early 2026 that nodes/proxy GET alone (the minimal read-only permission) can be abused for remote code execution via WebSocket. The kubelet maps WebSocket GET to the RBAC get verb without checking for CREATE permission, allowing arbitrary command execution:

websocat --insecure   --header "Authorization: Bearer $TOKEN"   --protocol v4.channel.k8s.io   "wss://$NODE_IP:10250/exec/default/nginx/nginx?output=1&error=1&command=id"
# uid=0(root) gid=0(root) groups=0(root)

With fine-grained authorization, the kubelet now maps commonly-used API paths to dedicated subresources: /stats/*nodes/stats, /metrics/*nodes/metrics, /logs/*nodes/log, /podsnodes/pods. The dual-check approach (try fine-grained first, fall back to nodes/proxy) ensures backward compatibility while enabling least-privilege access control.

Action item: Audit your RBAC policies and replace broad nodes/proxy grants with the specific subresources your workloads actually need.

Deprecations and Removals You Need to Know

Ingress NGINX Is Retired

SIG Network and the Security Response Committee retired Ingress NGINX on March 24, 2026. No more releases, no bugfixes, no security patches. If you’re still running Ingress NGINX, you need to plan your migration now. The recommended path is Ingress2Gateway 1.0, which provides tooling to convert Ingress resources to Gateway API.

spec.externalIPs in Service Is Deprecated

The externalIPs field in Service spec is now deprecated, with full removal planned for v1.43. This field has been a security headache for years, enabling man-in-the-middle attacks (CVE-2020-8554). Replace it with LoadBalancer services, NodePort, or Gateway API.

gitRepo Volume Driver Is Permanently Disabled

The gitRepo volume type, deprecated since v1.11, is now permanently disabled. Using it could let an attacker run code as root on the node. Migrate to InitContainers with git clone or use CI/CD pipelines to populate volumes.

SELinux: Prepare for v1.37 Changes

The SELinuxMount feature gate graduates to GA in v1.36, and v1.37 is expected to enable it by default. This makes volume setup faster (O(1) mount-time relabeling instead of recursive traversal), but can break applications sharing volumes between privileged and unprivileged Pods on the same node. Audit your clusters now.

Notable Beta Features Worth Watching

DRA (Dynamic Resource Allocation) graduates core features to beta — partitionable devices, consumable capacity, device taints/tolerations, and ResourceClaim device status. This provides a production-ready alternative to the legacy device plugin system for AI and HPC workloads managing GPUs.

Memory QoS with cgroups v2 — smarter, tiered memory protection that reduces interference and thrashing for workloads sharing nodes. The kubelet programs memory.high and memory.min more intelligently, with new metrics to avoid livelocks.

Mutable container resources when Job is suspended — queue controllers can now adjust CPU, memory, and GPU requests/limits on suspended Jobs before unsuspending them, enabling dynamic resource fitting based on cluster capacity.

Constrained impersonation — tightens the impersonation mechanism into a least-privilege model where impersonators need separate permissions to impersonate and to act on behalf of the impersonated identity.

Statusz and Flagz endpoints — new /statusz and /flagz endpoints on all core components expose build info and effective configuration flags in real-time, accessible to the system:monitoring group.

What to Upgrade Now

Based on this release, here’s my prioritized upgrade checklist:

Immediately: Audit nodes/proxy RBAC grants. Replace with fine-grained subresources. This is a security fix, not just a nice-to-have.
This sprint: Enable hostUsers: false on non-privileged workloads. Test with your application images — most work without changes.
This quarter: Plan your migration away from Ingress NGINX. Start with Ingress2Gateway 1.0 for a gradual transition to Gateway API.
This quarter: Remove gitRepo volume references and replace spec.externalIPs usage with proper alternatives.
Before v1.37: If you run SELinux in enforcing mode, test the SELinuxMount feature gate on staging clusters.

Sources

Leave a Reply

Your email address will not be published. Required fields are marked *