SuperEdge 开发者团队
SuperEdge[1] 是 一个开源的分布式边缘计算容器管理系统,用于管理多个云边区域中的计算资源和容器应用。
在当前架构中,这些资源和应用能够作为一个 Kubernetes 原生的资源进行管理。
然而在某些情况下,边缘设备通常需要一些更加轻量、性能更好的运行时。也需要减少以 GB 为单位的容器镜像,将容器的启动时间提升到到秒级甚至毫秒级,而基于虚拟机堆栈二进制指令格式的 WebAssembly 可以更好地处理这种情况。
WasmEdge[2] 是一个轻量级、高性能和可扩展的 WebAssembly 运行时,适用于云原生、边缘和去中心化应用程序。它是当今发展最快的 Wasm 运行时,社区活跃度也相当的高。
Superedge 最近支持了 Containerd,在边缘节点我们将让 Containerd 使用 crun 来支持 WasmEdge 运行时。也就是说,按照这些步骤后,你的边缘节点可以同时支持 OCI 容器和 WASM 容器。
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容器运行时。
./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,在边缘节点执行如下脚本:
curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash
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 文件 /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
我们将使用已经在 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】
往期精选推荐
点个“在看”每天学习最新技术