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
12. ...
现在我们在 /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. ...
3. FROM kindest/node:v1.23.0
5. COPY config.toml /etc/containerd/config.toml
6. COPY --from=builder /data/crun/crun /usr/local/sbin/runc
7. COPY --from=builder /usr/local/lib/libwasmedge_c.so /usr/local/lib/libwasmedge_c.so
9. RUN echo "Installing Packages ..." \
10. && bash -c 'cat <<< $(jq "del(.hooks.createContainer)" /etc/containerd/cri-base.json) > /etc/containerd/cri-base.json' \
11. && 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
