Nov 17, live webinar: ECS to EKS without freezing the roadmap for a quarter

Is WebAssembly Ready to Replace Containers on Kubernetes in 2026? My Verdict After WASI 0.3

WebAssembly will not replace containers on Kubernetes in 2026, but it is ready for a narrow slice of lightweight workloads. Here is the evidence: WASI 0.3, SpinKube, runwasi, wasmCloud, the Akamai-Fermyon deal, real cold start numbers, and where containers still win.

Romaric Philogene
CEO & Co-founder
NOV 14, 2026 · 14 MIN
Is WebAssembly Ready to Replace Containers on Kubernetes in 2026? My Verdict After WASI 0.3

Key points:

  • No, WebAssembly is not ready to replace containers for Kubernetes workloads in 2026. It is ready to run alongside them for a narrow slice: short-lived HTTP functions, event handlers, plugins and sandboxed untrusted code, where sub-millisecond startup and high density matter more than ecosystem breadth.
  • The standards finally caught up this year. WASI 0.3 shipped on 11 June 2026 with native async in the Component Model, and Wasmtime 46 runs it by default (wasi.dev). Wasm 3.0 added 64-bit memory, garbage collection and exception handling in September 2025 (webassembly.org).
  • The Kubernetes path is real but thin. SpinKube (CNCF Sandbox since January 2025) runs Spin apps through a containerd shim built on runwasi, and wasmCloud has been a CNCF Incubating project since November 2024. Both work on a standard cluster through a RuntimeClass.
  • The market signals are mixed. Akamai bought Fermyon in December 2025 to push Wasm functions to the edge, while Azure retired its AKS WASI node pools in May 2025 and Docker marked its Wasm workloads feature as deprecated. Wasm is consolidating around edge and serverless, away from general-purpose Kubernetes.
  • Cold start is the strongest argument, and the most misread one. Fermyon reports 0.5 ms cold starts against 100 to 500 ms for AWS Lambda (Akamai). That number matters for scale-to-zero functions. It does not matter for a warm API pod that has been running for three weeks.

Qovery · Infrastructure control plane
A control plane for platform teams and their coding agents
Learn more

In March 2019, Solomon Hykes, Docker's co-founder, wrote that if WebAssembly and WASI had existed in 2008, Docker would not have been needed. Seven years later, I still get asked the same question in almost every CTO conversation where Kubernetes comes up: "should we wait for Wasm instead of containerizing?"

My answer has not changed much, but the evidence has. 2026 is the year the standards became serious, and it is also the year the market made clear where Wasm is going. Here is my verdict, with the sources, so you can disagree with me on facts and not on vibes.

Is WebAssembly ready to replace containers on Kubernetes in 2026?

No. WebAssembly is ready to complement containers on Kubernetes for lightweight, stateless, short-lived workloads, and it is not ready to replace them for general-purpose services. The runtime and standards are production-grade for HTTP functions and plugins; the ecosystem of languages, libraries, debugging tools, GPU access and operational tooling is not yet there for everything else.

I would not containerize less in 2026 because of Wasm. I would add Wasm to a cluster for a specific workload where startup time or density is the bottleneck, and keep everything else in containers.

Kubernetes runs containers at a scale nothing else matches: the CNCF reports that 82% of container users now run Kubernetes in production, up from 66% in 2023 (CNCF, January 2026). Every observability agent, service mesh, policy engine and CI pipeline you use assumes an OCI container. Wasm on Kubernetes reuses some of that (the OCI registry, the scheduler, RuntimeClass) and has to rebuild the rest.

What actually changed for WebAssembly between 2024 and 2026?

Three things changed: the standards matured, the Kubernetes integration moved into the CNCF, and the commercial players consolidated. Together they turn Wasm from an experiment into a supported option for specific workloads, and they also narrow where it is going.

The standards: WASI 0.2, WASI 0.3 and Wasm 3.0

  • WASI 0.2 (January 2024) introduced the Component Model and WIT interfaces, so a component written in Rust can call one written in Go or Python through typed interfaces (wasi.dev).
  • Wasm 3.0 (17 September 2025) standardized 64-bit memory (raising the addressable limit beyond 4 GB), garbage collection, exception handling, tail calls and multiple memories (webassembly.org). GC makes Java, Kotlin, Dart and similar languages viable without shipping their own collector.
  • WASI 0.3 (11 June 2026) moved async into the Component Model with async func, stream<T> and future<T>, fixing composition problems where async wake-ups were lost between nested components. WASI 0.3.1 followed on 11 August 2026, and Wasmtime 46 and later run 0.3 components by default (wasi.dev).

There is still no WASI 1.0. The WASI project says 1.0 will follow full standardization once the WASI Subgroup and the WebAssembly Community and Working Groups agree on what that requires (wasi.dev). Put that in your risk register if you build on component interfaces today.

The Kubernetes integration: runwasi, SpinKube and wasmCloud

  • runwasi is a containerd sub-project that lets containerd run Wasm workloads directly or through the CRI plugin, so the kubelet can schedule them like pods (containerd/runwasi).
  • SpinKube combines the Spin Operator, the containerd Spin shim and a runtime class manager, and was accepted into the CNCF Sandbox on 21 January 2025 together with Spin itself (CNCF).
  • wasmCloud moved to CNCF Incubation in November 2024 (CNCF). Its 1.0 release brought WASI 0.2 components to production (wasmCloud 1.0 announcement).

The market: consolidation and retreat

  • Akamai acquired Fermyon in December 2025. Fermyon maintains Spin and SpinKube, and Akamai said it would keep supporting both, with the explicit goal of running Wasm functions on its edge network (Akamai).
  • Azure retired AKS WASI node pools. No new WASI node pools could be created from 5 May 2025, existing ones became unsupported, and Microsoft points users to SpinKube from the Azure Marketplace instead (Microsoft Learn).
  • Docker deprecated Wasm workloads in Docker Desktop. The documentation says the feature is no longer actively maintained and will be removed in a future release (Docker docs).

The serious money behind server-side Wasm is going to edge and function platforms, where startup time is the product. The general-purpose container runtimes are stepping back from it.

How does WebAssembly actually run on a Kubernetes cluster today?

WebAssembly runs on Kubernetes through a containerd shim and a RuntimeClass. You install a shim (for example the Spin shim built on runwasi) on the nodes, declare a RuntimeClass that points to it, and schedule pods or custom resources that reference that RuntimeClass. The Wasm module is pushed to an OCI registry like any image.

The path for SpinKube looks like this:

  1. A runtime class manager (or a node installer) adds the containerd-shim-spin binary and its containerd configuration to selected nodes (spinkube/containerd-shim-spin).
  2. You create a RuntimeClass that maps to that shim.
  3. The Spin Operator watches SpinApp custom resources and creates Deployments that use the RuntimeClass.
  4. The kubelet starts the "pod", and containerd hands it to the shim, which runs the Wasm component in-process with Wasmtime instead of starting a Linux container.
ApproachMaturity (CNCF)What it runsHow it plugs into KubernetesBest for
SpinKubeSandbox (Jan 2025)Spin apps (HTTP, Redis, cron triggers)Operator + containerd shim + RuntimeClassScale-to-zero HTTP functions on your cluster
wasmCloudIncubating (Nov 2024)WASI components and providersIts own host runtime, with a Kubernetes operatorDistributed component apps across clusters and edges
runwasi shims (generic)containerd sub-projectWasm modules via Wasmtime, WasmEdge or otherscontainerd shim + RuntimeClassBuilding your own Wasm runtime integration
Regular containersGraduated (Kubernetes, containerd)Anything LinuxDefault runtimeEverything else

The shim is a node-level change. On a managed node group, that means custom node configuration, a DaemonSet installer, or a node image you maintain. It is not hard, but it is one more thing to keep in sync with every node upgrade.

Are WebAssembly cold starts really sub-millisecond, and does it matter?

Yes, WebAssembly components start in well under a millisecond in vendor measurements, and it matters only for workloads that start often. Fermyon reports 0.5 ms cold starts for Spin, against 100 to 500 ms for AWS Lambda, and says a single node can run thousands of applications concurrently (Akamai). For a long-running API pod, startup time is irrelevant.

The three numbers measure different things, and most "Wasm vs Docker" posts mix them up.

  • The Wasm number is the time to instantiate a precompiled component in an already-running host process. The runtime is warm; only your code is new.
  • A container cold start on Kubernetes includes scheduling, image pull (often the largest part), sandbox and network setup, process start, language runtime boot and your readiness probe. Depending on image size and caching, that is anywhere from about a second to tens of seconds.
  • A Lambda cold start sits in between: a micro-VM, a language runtime and your init code.

Comparing them is fair only if your workload pays the cold start on the request path. Here is how I think about it:

Workload patternWho pays the cold startDoes Wasm startup help?
API that runs 24/7 with 3 replicasNobody, pods are warmNo
Scale-to-zero HTTP function, bursty trafficThe first user after idleYes, a lot
Per-tenant or per-request isolated codeEvery requestYes, this is the killer case
Batch job that runs for 40 minutesThe job, onceNo
Preview environment per pull requestThe developer, once per deployMarginally

Density is the second argument. A Wasm component does not carry a Linux userland, so its artifact and memory footprint are much smaller than a typical container image. Running thousands of small functions on one node is realistic in Wasm and unrealistic with one container per function. If your bill is dominated by many tiny, mostly idle services, that matters.

Run containers today, keep your options open.
Qovery deploys your containers, Helm charts and Terraform modules on Kubernetes in your own AWS, GCP, Azure or Scaleway account, or your existing cluster, without a dedicated DevOps team.

Which Kubernetes workloads should run as WebAssembly in 2026?

Run as WebAssembly the workloads that are stateless, short-lived, CPU-light and either bursty or untrusted. Everything that needs a full Linux environment, a GPU, a large dependency tree or a long-lived connection pool stays in a container.

The good fits I see:

  • Scale-to-zero HTTP endpoints such as webhooks, form handlers, image resizing and lightweight API glue, where idle cost and first-request latency both matter.
  • Plugins and extension points in your own product, where customers upload logic and you need strong isolation with low overhead. The Wasm sandbox has no ambient access to the file system or network unless you grant it.
  • Sandboxed code from AI agents. Agents generate code that you should not trust by default. A capability-based Wasm sandbox is a reasonable boundary for small, pure functions; for full shells and package installs, you still want VM-level isolation, which we compared in our post on AWS Nitro Sandboxes versus Daytona and E2B and our guide to isolating agent sessions from production.
  • Edge and multi-region functions that also run on a CDN, where the same component runs on your cluster and on an edge platform.

The poor fits:

  • Databases, queues and caches. PostgreSQL, Redis and Kafka are native Linux processes with decades of tuning. Nobody should run them in Wasm.
  • GPU inference and training. The wasi-nn proposal exists, but the CUDA ecosystem, drivers and device plugins live in containers.
  • Large Python, Java or Node.js services with native extensions. Language support has improved with Wasm GC and componentize tooling, but native wheels, JNI and Node add-ons are where ports break.
  • Anything you debug with a shell. kubectl exec into a Wasm workload does not give you a familiar Linux environment, and your APM agent probably does not support it.

What still blocks WebAssembly from replacing containers?

Four things block WebAssembly from replacing containers: language and library compatibility, operational tooling, standards that are still 0.x, and a shrinking set of general-purpose vendors. None of them is a hard technical wall. Together, they make Wasm a specialist tool for at least another few years.

DimensionContainers on Kubernetes (2026)WebAssembly on Kubernetes (2026)
Language supportAny language, any native dependencyRust, Go, JS, Python and C# work well for components; native extensions often break
Cold startAbout a second to tens of seconds including image pullSub-millisecond instantiation in vendor benchmarks
Artifact sizeTens to hundreds of MB typicalTypically KB to a few MB
IsolationLinux namespaces and cgroups (VMs for strong isolation)Capability-based sandbox, deny by default
StandardsOCI, CRI: stableWASI 0.3, no 1.0 yet
GPU and acceleratorsMature device pluginsExperimental (wasi-nn)
ObservabilityEvery APM, eBPF and logging toolPartial; OpenTelemetry support depends on the framework
Managed cloud supportEKS, GKE, AKS, Kapsule, all of themAKS WASI node pools retired; install SpinKube yourself
TalentEvery DevOps engineerA small specialist community

The talent row is the one CTOs underestimate. I have interviewed more than 200 CTOs, and the scarcest resource in most of those companies is people who can operate Kubernetes in production. Adding a second runtime model with its own failure modes, on top of the one you already struggle to staff, is a real cost.

So what should a platform team actually do in 2026?

Keep containers as your default unit of deployment, and introduce WebAssembly only where you can name the bottleneck it removes. If you cannot point at a workload where cold start, density or sandboxing is the problem, you do not need Wasm yet.

Here is the decision table I use:

If your problem is...Do this in 2026
Slow deployments and slow pod startupFix images first: smaller base images, layer caching, image pre-pulling. Wasm is overkill.
Paying for idle servicesTry scale-to-zero on containers (KEDA, Knative) before rewriting into Wasm
Thousands of tiny per-tenant functionsPilot SpinKube or wasmCloud on a dedicated node pool
Running untrusted customer or agent codeWasm for small pure functions; micro-VMs for full environments
Functions at the edge and in your clusterSpin or wasmCloud, with the same component deployed to both
"We want to be future-proof"Containerize now; components can be added next to containers later without a rewrite of the rest

A one-week pilot:

  1. Pick one stateless HTTP endpoint with bursty traffic.
  2. Create a dedicated node pool and install SpinKube on it, so the shim never touches your main nodes.
  3. Port the handler to Spin in Rust, Go or TypeScript and push it to your existing OCI registry.
  4. Measure p50 and p99 latency after idle, memory per instance and node density against the container version.
  5. Decide with numbers. If the gain is marginal, delete the node pool and move on.

For the cases where you are moving away from a Wasm-based platform, not toward one, we wrote a step-by-step guide to migrating a Cloudflare Workers app to Kubernetes. The pattern is the same: the function logic ports easily; state and bindings are the real work.

Where does Qovery fit if you run containers and WebAssembly side by side?

Qovery runs your containers, Helm charts and Terraform modules on Kubernetes in your own AWS, GCP, Azure or Scaleway account, or on any existing cluster (EKS, GKE, AKS, Kapsule, k3s, on-premise) attached with the Qovery Operator. Qovery is not a PaaS and never hosts your applications; the cluster and the data stay in your account.

For a team that wants to pilot Wasm without a dedicated DevOps engineer, the split is straightforward:

  • Containers stay on Qovery's standard path: git-push deployments, a preview environment per pull request, environment cloning, RBAC, audit logs and cost visibility.
  • SpinKube's operator is distributed as Helm charts and Kubernetes manifests, so on a cluster you control you can install it like any other cluster component, for example as a Helm service. The node-level shim and RuntimeClass remain your responsibility, which is why I recommend a dedicated node pool for the pilot.
  • Qovery does not run Wasm components natively today. If Wasm workloads become a real share of what our customers run, the runtime class is the integration point, and that is how we would look at it.
Frequently asked questions
Is WebAssembly ready to replace containers for lightweight Kubernetes workloads in 2026?

WebAssembly is ready to run some lightweight Kubernetes workloads in 2026, but not to replace containers. It works well for stateless HTTP functions, event handlers, plugins and sandboxed code through SpinKube or wasmCloud. Containers remain the better choice for databases, GPU workloads, large services with native dependencies, and anything that needs mature observability.

What is the difference between WASI 0.2 and WASI 0.3?

WASI 0.2, released in January 2024, introduced the Component Model and typed WIT interfaces for cross-language components. WASI 0.3, released on 11 June 2026, adds native async to the Component Model with async func, stream<T> and future<T>, replacing the earlier wasi:io polling approach. Wasmtime 46 and later run WASI 0.3 components by default.

How do you run WebAssembly on Kubernetes?

You run WebAssembly on Kubernetes by installing a containerd shim on the nodes, such as the Spin shim built on runwasi, and declaring a RuntimeClass that points to it. Pods or SpinApp custom resources that reference the RuntimeClass are then executed as Wasm instead of Linux containers. SpinKube packages the operator, shim and runtime class manager together.

Are WebAssembly cold starts faster than containers?

Yes. Fermyon reports 0.5 ms cold starts for Spin components, compared with 100 to 500 ms for AWS Lambda, while a container cold start on Kubernetes including image pull usually takes from about a second to tens of seconds. The difference only matters for workloads that scale to zero or start per request; warm, long-running pods do not pay it.

Is Fermyon still supporting SpinKube after the Akamai acquisition?

Yes, according to Akamai. When it announced the acquisition of Fermyon in December 2025, Akamai said it would continue supporting the Spin and SpinKube CNCF projects and Fermyon's Bytecode Alliance membership. Akamai's strategic focus is running Wasm functions on its edge network, so expect the most investment there.

Should we wait for WebAssembly instead of containerizing our apps?

No. Containerize now, because containers run on every managed Kubernetes service and every tool your team already uses, and WASI has not reached 1.0. You can add WebAssembly components next to your containers later for specific workloads, without redoing the containerization work.

Romaric Philogene
About the author
Romaric Philogene

Romaric founded Qovery to make Kubernetes accessible to every engineering team. He writes about platform strategy, developer experience, and the future of cloud infrastructure.

Next step

Run containers today, keep your options open.

Qovery deploys your containers, Helm charts and Terraform modules on Kubernetes in your own AWS, GCP, Azure or Scaleway account, or your existing cluster, without a dedicated DevOps team.