SuperEdge: 使用WebAssembly擴充套件邊緣計算場景

騰訊雲原生發表於2022-03-15

作者

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 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叢集

安裝 WasmEdge 執行環境

安裝 WasmEdge

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

curl -sSf https://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 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。這裡 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》。

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

相關文章