/containerd-wasm-shims

containerd shims for running WebAssembly workloads in Kubernetes

Primary LanguageRustApache License 2.0Apache-2.0

Containerd Wasm Shims

This project aims to provide containerd shim implementations that can run Wasm / WASI workloads using runwasi as a library. This means that by installing these shims onto Kubernetes nodes, we can add a runtime class to Kubernetes and schedule Wasm workloads on those nodes. Your Wasm pods and deployments can act just like container workloads!

runwasi is a project that aims to run WASI workloads managed by containerd.

Shims

This repo currently maintains four shims for Wasm application runtimes/frameworks:

  1. Lunatic - an Earlang-inspired runtime for fast, robust and scalable server-side Wasm application.
  2. Spin - a developer tool for building and running serverless Wasm applications.
  3. Slight - a wasmtime-based runtime for running Wasm applications that use SpiderLightning (aks WASI-Cloud-Core) capabilities
  4. Wasm Workers Server - a tool to develop and run serverless applications server on top of Wasm.

Below is a table of the shims and the the most recent versions of the shims that are supported by this project.

shim version v0.9 v0.8 v0.7 v0.5.1 v0.5.0
spin v1.4.1 v1.4.0 v1.3.0 v1.0.0 v0.9.0
slight v0.5.1 v0.5.0 v0.5.0 v0.4.0 v0.4.0
wws v1.5.0 v1.4.0 v1.2.0 / /
lunatic v0.13.2 / / / /

Compare to runwasi shims

As mentioned above, this project uses runwasi's containerd-shim-wasm to build shim implementations for higher level Wasm application runtimes/frameworks. The runwasi shims are more lower level that are intended to run WASI-compatible Wasm modules, instead of Wasm applicaitons that are built on top of a framework. If you are looking for Wasmtime, WasmEdge or Wasmer shims, please check out runwasi.

Quickstarts

Building the shims

To build the shims in this project, run make build.

Running the integration tests

To run the integration tests, run make integration-tests.

Cleaning up

To clean up, run make tests/clean.

Example Kubernetes Cluster Deployments

In the deployments directory you will find examples of deploying the shims to Kubernetes clusters and using them in example Kubernetes workloads.

Using a shim in Kubernetes

To use one of these containerd shims in Kubernetes, you must do the following:

  1. Install the shim binary somewhere on the path of your Kubernetes worker nodes. For example, copy containerd-shim-spin-v2 to /bin.
  2. Add the following to the containerd config.toml that maps the runtime type to the shim binary from step 1.
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.spin]
  runtime_type = "io.containerd.spin.v2"
  1. Apply a runtime class that contains a handler that matches the "spin" config runtime name from step 2.
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
  name: wasmtime-spin
handler: spin
  1. Deploy a Wasm workload to your cluster with the specified runtime class name matching the "wasmtime-spin" runtime class from step 3.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wasm-spin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wasm-spin
  template:
    metadata:
      labels:
        app: wasm-spin
    spec:
      runtimeClassName: wasmtime-spin
      containers:
        - name: spin-hello
          image: ghcr.io/deislabs/containerd-wasm-shims/examples/spin-rust-hello:latest
          command: ["/"]

Code of Conduct

This project has adopted the Microsoft Open Source Code of Conduct.

For more information see the Code of Conduct FAQ or contact opencode@microsoft.com with any additional questions or comments.