KinD

KinD 是在 Docker 内部运行的 Kubernetes 发行版,非常适合本地开发或集成测试。

快速开始

作为先决条件,我们第一步需要安装 KinD。为此,请参阅快速入门指南稳定版发布页面来安装最新版本的 KinD CLI。

如果已经安装了 KinD,我们可以直接从这里中的示例开始:

  1. # Create a "WASM in KinD" Cluster
  2. kind create cluster --image ghcr.io/liquid-reply/kind-crun-wasm:v1.23.0
  3. # Run the example
  4. kubectl run -it --rm --restart=Never wasi-demo --image=hydai/wasm-wasi-example:with-wasm-annotation --annotations="module.wasm.image/variant=compat" /wasi_example_main.wasm 50000000

在这个章节的剩余部分,我们会介绍如何去创建一个带有 wasmedge 的支持 KinD 的节点镜像。

编译 crun

KinD 使用 kindest/node 这个镜像作为控制平面和工作节点。该镜像包括作为 CRI 的 containerd 和作为 OCI 运行时的 runc。为了启用 WasmEdge 支持,我们将 runc 替换为 crun。

  1. FROM ubuntu:21.10 AS builder
  2. WORKDIR /data
  3. RUN DEBIAN_FRONTEND=noninteractive apt update \
  4. && DEBIAN_FRONTEND=noninteractive apt install -y curl make git gcc build-essential pkgconf libtool libsystemd-dev libprotobuf-c-dev libcap-dev libseccomp-dev libyajl-dev go-md2man libtool autoconf python3 automake \
  5. && curl https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- -p /usr/local \
  6. && git clone --single-branch --branch feat/handler_per_container https://github.com/liquid-reply/crun \
  7. && cd crun \
  8. && ./autogen.sh \
  9. && ./configure --with-wasmedge --enable-embedded-yajl\
  10. && make
  11. ...

现在我们在 /data/crun/crun 目录下有了一个新的可以支持 wasmedge 的 crun 二进制文件,我们可以在下一步中从这个容器中复制它。

替代 crun 和配置 containerd

runc 和 crun 都实现了 OCI 运行时规范,并且它们具有相同的 CLI 参数。因此我们可以用之前创建的 crun-wasmedge 二进制文件替换 runc 二进制文件。

由于 crun 使用了一些共享库,我们需要安装 libyajl、wasmedge 和 criu 来使 crun 工作。

现在我们已经有了一个使用 crun 而不是 runc 的 KinD。现在我们只需要将两个配置更改即可。第一个是在 /etc/containerd/config.toml 中,我们添加了可以传递给运行时的 pod_annotations

  1. [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  2. pod_annotations = ["*.wasm.*", "wasm.*", "module.wasm.image/*", "*.module.wasm.image", "module.wasm.image/variant.*"]

第二个是在 /etc/containerd/cri-base.json 中,我们删除了一个导致一些问题的 hook。

生成的 dockerfile 如下所示:

  1. ...
  2. FROM kindest/node:v1.23.0
  3. COPY config.toml /etc/containerd/config.toml
  4. COPY --from=builder /data/crun/crun /usr/local/sbin/runc
  5. COPY --from=builder /usr/local/lib/libwasmedge_c.so /usr/local/lib/libwasmedge_c.so
  6. RUN echo "Installing Packages ..." \
  7. && bash -c 'cat <<< $(jq "del(.hooks.createContainer)" /etc/containerd/cri-base.json) > /etc/containerd/cri-base.json' \
  8. && ldconfig

编译和测试

最终我们构建了一个新的 node-wasmedge 镜像。为了测试它,我们从该图像创建一个 kind 集群并运行简单的应用程序示例。

  1. $ docker build -t node-wasmedge .
  2. $ kind create cluster --image node-wasmedge
  3. # Now you can run the example to validate your cluster
  4. $ kubectl run -it --rm --restart=Never wasi-demo --image=hydai/wasm-wasi-example:with-wasm-annotation --annotations="module.wasm.image/variant=compat" /wasi_example_main.wasm 50000000