雲原生的 WebAssembly 能取代 Docker 嗎?

WebAssembly 是一個可移植、體積小、加載快並且兼容 Web 的全新格式。由於 WebAssembly 具有很高的安全性,可移植性,效率和輕量級功能,因此它是應用程序安全沙箱方案的理想選擇。現如今 WebAssembly 已受到容器,功能計算以及物聯網和邊緣計算社區的廣泛關注。究竟 WebAssembly 是怎樣的一種技術,能否取代 Docker,就請閱讀本文。

本文是整理自 KubeSphere 2020 年度 meetup 中 Second State CEO Michael Yuan 的分享。

大家下午好,我是 Second State 的 CEO Michael Yuan,我們公司的主要研發在臺北和美國,然後在北京望京有個辦公室。今天非常開心來到 KubeSphere 2020 Meetup,我給大家分享的主題是雲原生的 WebAssembly 能取代 Docker 嗎?

背景

這是一個著名的 Twitter,是 Docker 的創始人 Solomon Hykes 在 2019 年 3 月份發佈的。他說如果2008年的時候,WASM(WebAssembly)和 WASI(WebAssembly System Interface, WASM系統接口)這兩個東西已經存在了的話,他就沒有必要創立 Docker了。他認爲 WebAssembly 是計算的未來。這條推特在社區裏造成很大影響,引發了很多人的的疑問。因爲很多人認爲,WebAssembly 可以在瀏覽器裏取代 JavaScript,是用來玩遊戲的。爲什麼突然成爲在服務端能夠取代 Docker 的東西呢?也就在這一年多後,包括我們公司在內,很多人在這裏面做了很多 research。

WebAssembly 在服務端的位置

在服務端,我們一般可以把容器、虛擬機或者說運行環境分成三個不同的抽象的層次。

1.在最底層是硬件的 Hypervisor VM,或者說像 AWS Firecracker,這種叫做 microVMs,能夠直接跟硬件打交道。

2.再上面一層叫做 Application containers,在這種 vm 上面你可以做像 Docker 這樣的 application container。application container 仍然是在操作系統這個層級,是需要把整個操作系統調進來的。

3.再上面一層叫做 High level language VMs ,這是從 Jvm 開始的。然後把 WebAssembly 在操作系統這個層級上面給抽象出來了。這是 WebAssembly 在服務端的位置。

如果 WebAssembly 能夠做成一個像 JVM 的 language VM,我們在今天也許能夠實現 Java 二十幾年前提出的夢想:在不同的操作系統上,在不同的硬件和軟件的平臺上,能夠給開發者提供一個安全並高抽象性的運行環境。

WebAssembly 和 Docker 的對比

WebAssembly 跟 Docker 之間到底是什麼關係,爲什麼說 WebAssembly 有可能會取代 Docker 呢?這裏列舉了 WebAssembly 相對於Docker 的一些優勢。

  1. 在冷啓動上,WebAssembly 比 Docker 快 100 倍

大家如果做 serverless 或者做容器服務,有一個詬病很多的問題就是冷啓動慢。AWS 有預留實例(reserve instance),如果要 keep hot,就違背了無服務器的初衷。用 serverless,我想要的是按毫秒付費,結果我現在先要把東西給 reserve 起來,變成了按天付費。WebAssembly 有一個很大的優勢,就是不用啓動整個操作系統,所以它在冷啓動的時候性能超過 docker 100倍。

  1. 在執行時間上,WebAssembly 比 Docker 快 10%-50%

WebAssembly 是一個非常簡單的虛擬機,沒有操作系統那套東西,所以它在運行時性能也比 Docker 快 10%-50%。

  1. WebAssembly 佔用的空間更小

WebAssembly 的應用一般在 1MB 以下,而 Docker 鏡像經常就能夠達到一兩百 MB。

  1. WebAssembly 有一個現代的安全模型

WebAssembly 安全策略是“Capability-based Security”,一種基於給定資源的安全性控制策略。們可以有針對性地爲每一個獨立的模塊實例提供不同的操作系統接口 / 資源權限。這些操作系統接口或資源權限可以在每個模塊進行實例化時被調用者主動指定

  1. WebAssembly 使軟件更具有可組合性

目前有一個 serverless 應用架構叫做 JAMStack,一個 JavaScript 應用後面可能會有 100 個甚至 1000 個 serverless 函數。我們需要把這些 serverless 函數組合在一起。如果我們用容器來做的話,其實是一件非常重的事。因爲要從網絡或者操作系統層次來做。但是使用 WebAssembly 可以通過“nanoprocess”,在有安全控制的情況下,將這些函數組合在一起。

  1. WebAssembly 無縫支持服務器應用程序框架

如 Node.js,比如 Python

以上就是 WebAssembly 的優勢所在。

WebAssembly 和 Rust

講到 WebAssembly,不能不講的就是 Rust。 Rust 已經連續 5 年在 Stack Overflow 上成爲開發者最受歡迎的語言,大有取代 C 語言的趨勢。

因爲 WebAssembly 與 LLVM 相接,所以前端可以支持 20 種語言,但是對有 runtime 的語言比如 Python 和 Java 不能很好地支持,對 C++、Rust 等語言支持較好。所以我們覺得 WebAssembly 和 Rust 是天生一對,就像 Java 和 JVM 一樣。

Rust 提高了開發者的效率和內存的安全。WebAssembly 提高了運行時的安全與跨平臺的執行。而且他們同時都是高性能的和輕量級的。

WebAssembly System Interface(WASI)

WASI 類似於 Java 的 JNI。WebAssembly 之前一直是一個瀏覽器裏的技術,今年要把它放到服務器端,如果要訪問文件系統、線程、命令、服務器上的標準庫等等,那麼就必須通過 WASI。

另外比如說 serverless 的一個主要應用場景是 AI 推理,那麼就需要在 WebAssembly 的 runtime 裏能夠用 GPU、ASIC、TensorFlow 等,這些都是通過 WASI 加入進來的。

WebAssembly 和 Kubernetes 結合

WebAssembly 在瀏覽器裏普及率高,但在服務器端普及率低,這是因爲在服務器端它的調度能力不強,缺乏 DevOps 的解決方案。目前是需要自身去管理進程,管理資源分配。所以能夠把 WebAssembly 和 Kubernetes 結合起來,是一個非常前沿的領域。

其中一種方法是把 WebAssembly 做成 OCI(open container interface) compliant,另一種方法是在 containerd 裏面寫 shim API。

現在有不同的人涉足這個領域,包括我們自己,但是目前還是一個比較早期的項目階段。也希望大家能夠關注這個項目,跟我們討論更好的做法。

上圖中的這個鏈接,是阿里雲做的,採用的第二種方法。

上文講到 Docker 的創始人發佈的推特在社區造成了很大影響,引發了很多 Docker 粉絲的不滿。爲了平息大家的怨言,他又發佈了一條推特。事實上一年半之後,我們發現情況完全不是這樣的,他應該把 Docker 這個字改成 Kubernetes。

WebAssembly 會取代 Docker 嗎?

即便 WebAssembly 能夠取代 Docker,也不會很快。Docker 有自己的生態,而且與 WebAssembly 不在同一個抽象的層級,所以不是一個新的 runtime 能夠很快就取代的。

但是 WebAssembly 在有些方面會有很大的應用,包括需要有高性能的和輕量級的,比如微服務、JAMStack、邊緣計算等。

以上是我的分享,歡迎大家一起交流!

本文由博客一文多發平臺 OpenWrite 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章