查看原文
其他

SuperEdge: 使用WebAssembly扩展边缘计算场景

SuperEdge团队 腾讯云原生 2022-11-21

SuperEdge 开发者团队

概要

SuperEdge[1]一个开源的分布式边缘计算容器管理系统,用于管理多个云边区域中的计算资源和容器应用。  在当前架构中,这些资源和应用能够作为一个 Kubernetes 原生的资源进行管理。

然而在某些情况下,边缘设备通常需要一些更加轻量、性能更好的运行时。也需要减少以 GB 为单位的容器镜像,将容器的启动时间提升到到秒级甚至毫秒级,而基于虚拟机堆栈二进制指令格式的 WebAssembly 可以更好地处理这种情况。

WasmEdge[2] 是一个轻量级、高性能和可扩展的 WebAssembly 运行时,适用于云原生、边缘和去中心化应用程序。它是当今发展最快的 Wasm 运行时,社区活跃度也相当的高。

运行简图

Superedge 最近支持了 Containerd,在边缘节点我们将让 Containerd 使用 crun 来支持 WasmEdge 运行时。也就是说,按照这些步骤后,你的边缘节点可以同时支持 OCI 容器和 WASM 容器。

安装 SuperEdge 边缘 K8s 集群

  • 下载安装包
arch=amd64 version=v0.7.0 && rm -rf edgeadm-linux-* && wget https://superedge-1253687700.cos.ap-guangzhou.myqcloud.com/$version/$arch/edgeadm-linux-containerd-$arch-$version.tgz && tar -xzvf edgeadm-linux-* && cd edgeadm-linux-$arch-$version && ./edgeadm

注意选择机器架构对应的安装包,这个安装包默认带 Containerd 容器运行时。

  • 创建边缘集群
./edgeadm init --kubernetes-version=1.18.2 --image-repository superedge.tencentcloudcr.com/superedge --service-cidr=10.96.0.0/12 --pod-network-cidr=192.168.0.0/16 --install-pkg-path ./kube-linux-*.tar.gz --apiserver-cert-extra-sans=<Master Public IP> --apiserver-advertise-address=<Master Intranet IP> --enable-edge=true --runtime=containerd

注意带 --runtime=containerd 参数,表示使用 Containerd 容器运行时, --runtime=dockerd 表示使用 Docker容器运行时。

  • Join 边缘节点
./edgeadm join <Master Public/Intranet IP Or Domain>:Port --token xxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxx --install-pkg-path ./kube-linux-*.tar.gz --enable-edge=true --runtime=containerd

详细可查看 SuperEdge 官方文档一键安装原生的k8s集群和边缘K8s集群[3]。

安装 WasmEdge 运行环境

安装 WasmEdge

在边缘节点上使用脚本便可很轻松安装 WasmEdge,在边缘节点执行如下脚本:

curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash

安装 crun

crun[4] 项目内置了 WasmEdge 支持,但是默认的 crun release 没有把 wasmedge 模块编译进去,目前需要手动从源代码构建支持 WasmEdge 的 crun 二进制。首先,确保在您的 Ubuntu 20.04 上安装了 crun 依赖项。对于其他 Linux 发行版请参阅 crun 的 README[5]

sudo apt update
sudo apt install -y make git gcc build-essential pkgconf libtool \
    libsystemd-dev libprotobuf-c-dev libcap-dev libseccomp-dev libyajl-dev \
    go-md2man libtool autoconf python3 automake

接下来,编译和安装 crun:

git clone https://github.com/containers/crun
cd crun
./autogen.sh
./configure --with-wasmedge
make
sudo make install

配置 Containerd 使用 crun 运行时

这里我们给出需要配置 Containerd 文件  /etc/containerd/config.toml 原始配置和配置之后的差异,用户可以按对比进行修改。

cat > config.toml.diff << EOF
--- /etc/containerd/config.toml 2022-02-14 15:05:40.061562127 +0800
+++ /etc/containerd/config.toml.crun    2022-02-14 15:03:35.846052853 +0800
@@ -24,17 +24,23 @@
   max_concurrent_downloads = 10

   [plugins.cri.containerd]
-        default_runtime_name = "runc"
-    [plugins.cri.containerd.runtimes.runc]
+        default_runtime_name = "crun"
+    [plugins.cri.containerd.runtimes.crun]
       runtime_type = "io.containerd.runc.v2"
-      pod_annotations = []
+      pod_annotations = ["*.wasm.*""wasm.*""module.wasm.image/*""*.module.wasm.image""module.wasm.image/variant.*"]
       container_annotations = []
       privileged_without_host_devices = false
-      [plugins.cri.containerd.runtimes.runc.options]
-        BinaryName = "runc"
+      [plugins.cri.containerd.runtimes.crun.options]
+        BinaryName = "crun"
   # cni
   [plugins.cri.cni]
     bin_dir = "/opt/cni/bin"
     conf_dir = "/etc/cni/net.d"
     conf_template = ""

+  [plugins."io.containerd.runtime.v1.linux"]
+    no_shim = false
+    runtime = "crun"
+    runtime_root = ""
+    shim = "containerd-shim"
+    shim_debug = false
EOF

最后重启下 Containerd 容器运行时。

sudo patch -d/ -p0 < config.toml.diff
sudo systemctl restart containerd

创建 WASM 应用

我们将使用已经在 dockerhub 上的一个wasm示例镜像wasm-wasi-example[6]。这里 wasm 镜像需要在镜像的Manfest文件中增加一个"module.wasm.image/variant":"compat"的 Annotation 让运行时区分出 wasm 和操作系统运行时,因此 docker build 功能是没法满足的,可以使用buildah[7]来构建 wasm 镜像并 push 到任意 OCI 标准的镜像仓库中。

cat > wasmedge-app.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
  annotations:
    module.wasm.image/variant: compat
  labels:
    run: wasi-demo
  name: wasi-demo
spec:
  containers:
  - args:
    - /wasi_example_main.wasm
    - "50000000"
    image: hydai/wasm-wasi-example:with-wasm-annotation
    imagePullPolicy: IfNotPresent
    name: wasi-demo
  hostNetwork: true
  restartPolicy: Never
EOF

kubectl create -f wasmedge-app.yaml

可用 kubectl logs wasi-demo  看到这个程序输出如下内容:

Random number: -1643170076
Random bytes: [15, 223, ... 106, 51]
Printed from wasi: This is from a main function
This is from a main function
The env vars are as follows.
The args are as follows.
/wasi_example_main.wasm
50000000
File content is This is in a file

未来

随着更广泛的边缘设备接入,更多的边缘场景覆盖的要求,SuperEdge 在边缘计算运行时不仅支持传统的 docker 和 containerd 等,现在还可以支持各种 WebAssembly 运行时(WasmEdge),也会持续为广大开发者创造充满想象力且无限可能的边缘计算和调度平台。

参考资料

[1]

SuperEdge: 【https://github.com/superedge/superedge】

[2]

WasmEdge:https://github.com/WasmEdge/WasmEdge】

[3]

一键安装原生的k8s集群和边缘K8s集群: 【https://github.com/superedge/superedge/blob/main/docs/installation/install_edge_kubernetes_CN.md】

[4]

crun: https://github.com/containers/crun】

[5]

README: https://github.com/containers/crun#readme】

[6]

wasm-wasi-example: 【https://hub.docker.com/r/hydai/wasm-wasi-example】

[7]

buildah: https://wasmedge.org/book/en/kubernetes/demo/wasi.html】




  往期精选推荐  

点个“在看”每天学习最新技术

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存