WebAssembly 是一個可移植、體積小、加載快而且兼容 Web 的全新格式。因爲 WebAssembly 具備很高的安全性,可移植性,效率和輕量級功能,所以它是應用程序安全沙箱方案的理想選擇。現現在 WebAssembly 已受到容器,功能計算以及物聯網和邊緣計算社區的普遍關注。究竟 WebAssembly 是怎樣的一種技術,可否取代 Docker,就請閱讀本文。前端
本文是整理自 KubeSphere 2020 年度 meetup 中 Second State CEO Michael Yuan 的分享。docker
你們下午好,我是 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。瀏覽器
在服務端,咱們通常能夠把容器、虛擬機或者說運行環境分紅三個不一樣的抽象的層次。安全
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 二十幾年前提出的夢想:在不一樣的操做系統上,在不一樣的硬件和軟件的平臺上,可以給開發者提供一個安全並高抽象性的運行環境。app
WebAssembly 跟 Docker 之間究竟是什麼關係,爲何說 WebAssembly 有可能會取代 Docker 呢?這裏列舉了 WebAssembly 相對於Docker 的一些優點。框架
你們若是作 serverless 或者作容器服務,有一個詬病不少的問題就是冷啓動慢。AWS 有預留實例(reserve instance),若是要 keep hot,就違背了無服務器的初衷。用 serverless,我想要的是按毫秒付費,結果我如今先要把東西給 reserve 起來,變成了按天付費。WebAssembly 有一個很大的優點,就是不用啓動整個操做系統,因此它在冷啓動的時候性能超過 docker 100倍。
WebAssembly 是一個很是簡單的虛擬機,沒有操做系統那套東西,因此它在運行時性能也比 Docker 快 10%-50%。
WebAssembly 的應用通常在 1MB 如下,而 Docker 鏡像常常就可以達到一兩百 MB。
WebAssembly 安全策略是「Capability-based Security」,一種基於給定資源的安全性控制策略。們能夠有針對性地爲每個獨立的模塊實例提供不一樣的操做系統接口 / 資源權限。這些操做系統接口或資源權限能夠在每一個模塊進行實例化時被調用者主動指定
目前有一個 serverless 應用架構叫作 JAMStack,一個 JavaScript 應用後面可能會有 100 個甚至 1000 個 serverless 函數。咱們須要把這些 serverless 函數組合在一塊兒。若是咱們用容器來作的話,實際上是一件很是重的事。由於要從網絡或者操做系統層次來作。可是使用 WebAssembly 能夠經過「nanoprocess」,在有安全控制的狀況下,將這些函數組合在一塊兒。
如 Node.js,好比 Python
以上就是 WebAssembly 的優點所在。
講到 WebAssembly,不能不講的就是 Rust。 Rust 已經連續 5 年在 Stack Overflow 上成爲開發者最受歡迎的語言,大有取代 C 語言的趨勢。
由於 WebAssembly 與 LLVM 相接,因此前端能夠支持 20 種語言,可是對有 runtime 的語言好比 Python 和 Java 不能很好地支持,對 C++、Rust 等語言支持較好。因此咱們以爲 WebAssembly 和 Rust 是天生一對,就像 Java 和 JVM 同樣。
Rust 提升了開發者的效率和內存的安全。WebAssembly 提升了運行時的安全與跨平臺的執行。並且他們同時都是高性能的和輕量級的。
WASI 相似於 Java 的 JNI。WebAssembly 以前一直是一個瀏覽器裏的技術,今年要把它放到服務器端,若是要訪問文件系統、線程、命令、服務器上的標準庫等等,那麼就必須經過 WASI。
另外好比說 serverless 的一個主要應用場景是 AI 推理,那麼就須要在 WebAssembly 的 runtime 裏可以用 GPU、ASIC、TensorFlow 等,這些都是經過 WASI 加入進來的。
WebAssembly 在瀏覽器裏普及率高,但在服務器端普及率低,這是由於在服務器端它的調度能力不強,缺少 DevOps 的解決方案。目前是須要自身去管理進程,管理資源分配。因此可以把 WebAssembly 和 Kubernetes 結合起來,是一個很是前沿的領域。
其中一種方法是把 WebAssembly 作成 OCI(open container interface) compliant,另外一種方法是在 containerd 裏面寫 shim API。
如今有不一樣的人涉足這個領域,包括咱們本身,可是目前仍是一個比較早期的項目階段。也但願你們可以關注這個項目,跟咱們討論更好的作法。
上圖中的這個連接,是阿里雲作的,採用的第二種方法。
上文講到 Docker 的創始人發佈的推特在社區形成了很大影響,引起了不少 Docker 粉絲的不滿。爲了平息你們的怨言,他又發佈了一條推特。事實上一年半以後,咱們發現狀況徹底不是這樣的,他應該把 Docker 這個字改爲 Kubernetes。
即使 WebAssembly 可以取代 Docker,也不會很快。Docker 有本身的生態,並且與 WebAssembly 不在同一個抽象的層級,因此不是一個新的 runtime 可以很快就取代的。
可是 WebAssembly 在有些方面會有很大的應用,包括須要有高性能的和輕量級的,好比微服務、JAMStack、邊緣計算等。
以上是個人分享,歡迎你們一塊兒交流!
本文由博客一文多發平臺 OpenWrite 發佈!