SuperEdge: 使用WebAssembly擴展邊緣計算場景

作者

SuperEdge 開發者團隊

概要

SuperEdge一個開源的分散式邊緣計算容器管理系統,用於管理多個雲邊區域中的計算資源和容器應用。 在當前架構中,這些資源和應用能夠作為一個 Kubernetes 原生的資源進行管理。

然而在某些情況下,邊緣設備通常需要一些更加輕量、性能更好的運行時。也需要減少以 GB 為單位的容器鏡像,將容器的啟動時間提升到到秒級甚至毫秒級,而基於虛擬機堆棧二進位指令格式的 WebAssembly 可以更好地處理這種情況。

WasmEdge 是一個輕量級、高性能和可擴展的 WebAssembly 運行時,適用於雲原生、邊緣和去中心化應用程式。它是當今發展最快的 Wasm 運行時,社區活躍度也相當的高。

運行簡圖

Superedge 最近支援了 Containerd,在邊緣節點我們將讓 Containerd 使用 crun 來支援 WasmEdge 運行時。也就是說,按照這些步驟後,你的邊緣節點可以同時支援 OCI 容器和 WASM 容器。

安裝 SuperEdge 邊緣 K8s 集群

  • 下載安裝包
arch=amd64 version=v0.7.0 && rm -rf edgeadm-linux-* && wget //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集群

安裝 WasmEdge 運行環境

安裝 WasmEdge

在邊緣節點上使用腳本便可很輕鬆安裝 WasmEdge,在邊緣節點執行如下腳本:

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

安裝 crun

crun 項目內置了 WasmEdge 支援,但是默認的 crun release 沒有把 wasmedge 模組編譯進去,目前需要手動從源程式碼構建支援 WasmEdge 的 crun 二進位。
首先,確保在您的 Ubuntu 20.04 上安裝了 crun 依賴項。對於其他 Linux 發行版請參閱 crun 的 README

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 //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。這裡 wasm 鏡像需要在鏡像的Manfest文件中增加一個"module.wasm.image/variant":"compat"的 Annotation 讓運行時區分出 wasm 和作業系統運行時,因此 docker build 功能是沒法滿足的,可以使用buildah來構建 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),也會持續為廣大開發者創造充滿想像力且無限可能的邊緣計算和調度平台。

關於我們

更多關於雲原生的案例和知識,可關注同名【騰訊雲原生】公眾號~

福利:

①公眾號後台回復【手冊】,可獲得《騰訊雲原生路線圖手冊》&《騰訊雲原生最佳實踐》~

②公眾號後台回復【系列】,可獲得《15個系列100+篇超實用雲原生原創乾貨合集》,包含Kubernetes 降本增效、K8s 性能優化實踐、最佳實踐等系列。

③公眾號後台回復【白皮書】,可獲得《騰訊雲容器安全白皮書》&《降本之源-雲原生成本管理白皮書v1.0》

④公眾號後台回復【光速入門】,可獲得騰訊雲專家5萬字精華教程,光速入門Prometheus和Grafana。

⑤公眾號後台回復【精選集】,可獲得騰訊24位騰訊雲專家精彩演講——4萬字《騰訊雲技術實踐精選集 2021》。

【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多乾貨!!