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 发布!