如何本身搭建本身的faas?

缘起

最近serverless和faas的文章不少,各大云厂商都在推广,看着人手痒痒,无奈业务开发没有使用云服务,而是使用了内部k8s集群。因此决定本身搭建faas。说来容易,说干就干!javascript

其实内部早就开始了,一直想写篇文章,无奈业务太忙,总算抽了点时间分享下。java

一句话需求

怎样实现将任意一个函数成为一个接口node

分析

不管是函数仍是接口本质上是想通的,都有输入输出。 接口的请求做为函数的输入,函数的输出做为接口的返回值,完美!chrome

函数运行

函数怎么运行呢?浏览器

还好nodejs自己实现了本身的VM,很开心的把代码丢给vm来运行,great!安全

打住!你觉得这就解决问题了吗?bash

node官方明确指出,请不要使用VM运行不信任的代码,你的同事的代码可信吗?来自大佬的发问。less

网上找了一圈发现这行代码,你的服务就挂掉了,这怎么能够?函数

new vm.Script('this.constructor.constructor("return process")().exit()')
复制代码

相信社区的力量是伟大的,又发现了VM2,如获至宝,正如他的官方slogan那样ui

vm2 is a sandbox that can run untrusted code with whitelisted Node's built-in modules. Securely!

大佬跑过来问,你相信他是安全就必定安全吗?跑到issue里面一看,而后一试,此次还好服务没挂,可是彷佛无响应

const {VM} = require('vm2');
new VM({timeout:1}).run(`
	function main(){
	while(1){}
}
复制代码

毕竟已经立了flag了,难道要食盐了吗?忍痛也要把它解掉。

沙盒安全

归根结底,沙盒不安全,即便是VM2,也不能确信他必定安全,怎么破?

ie浏览器常常崩溃,到了chrome就好不少了,为何呢?对,没错,就是多进程模型。

举个例子: 进程就像一套房子,线程是房间,房间着火房子没了, 多进程是多套房子,毁了一套还有地方住。

咱们最终的方案就是将用户不安全的代码隔离在子进程中。

VMBox是独立实现的管理函数运行的进程池,支持函数互相调用,而且完美的解决了死循环的问题。

若是对VMBox关心的同窗能够持续关注进展哦,后面会考虑将核心开源!

实践

目前内部实现的功能

相关文章
相关标签/搜索