跳到主要内容

FaaS 快速开始

一、功能介绍​

Layotto支持加载并运行以 wasm 为载体的 Function,并支持Function之间互相调用以及访问基础设施,如Redis。

详细的设计文档可以参考:FaaS design

二、准备工作​

本机运行需要进行安装如下软件:

  1. Docker Desktop

    直接官网下载安装包安装即可。

  2. minikube

    按照官网操作即可。

  3. virtualbox

    直接官网下载安装包安装即可,mac下也可以使用 homebrew 进行安装。安装完以后如果启动失败,请参考The host-only adapter we just created is not visible

三、环境搭建​

A、安装&运行 Redis​

这里只是需要一个可以正常使用 Redis 即可,至于 Redis 安装在哪里没有特别限制,可以是虚拟机里,也可以是本机或者服务器,这里以安装在 mac 为例进行介绍。

> brew install redis
> redis-server /usr/local/etc/redis.conf

注:如果redis安装在本机器,Virtualbox内的虚拟机是无法访问到redis的, 需要把 redis.conf 中的 protected-mode 修改为 no.同时增加 bind * -::*, 让其监听所有接口。

B、以 virtualbox + containerd 模式启动 minikube​

> minikube start --driver=virtualbox --container-runtime=containerd

C、安装 Layotto​

> git clone https://github.com/mosn/layotto.git
> cd layotto
> make wasm-build
> minikube cp ./_output/linux/amd64/layotto /home/docker/layotto
> minikube cp ./demo/faas/config.json /home/docker/config.json
> minikube ssh
> sudo chmod +x layotto
> sudo mv layotto /usr/bin/

注1:需要把./demo/faas/config.json中的 redis 地址修改为实际地址(安装redis的宿主机ip),默认地址为:localhost:6379。

注2:需要把./demo/faas/config.json中的 wasm 文件的路径修改为/home/docker/function_1.wasm跟/home/docker/function_2.wasm, 两个wasm文件在后面会被自动注入。

注3:也可动态加载 WASM 文件,详情参见:WASM 动态注册

D、安装 containerd-shim-layotto-v2​

> git clone https://github.com/layotto/containerd-wasm.git
> cd containerd-wasm
> sh build.sh
> minikube cp containerd-shim-layotto-v2 /home/docker/containerd-shim-layotto-v2
> minikube ssh
> sudo chmod +x containerd-shim-layotto-v2
> sudo mv containerd-shim-layotto-v2 /usr/bin/

E、修改&重启 containerd​

增加 laytto 运行时的配置。

> minikube ssh
> sudo vi /etc/containerd/config.toml
[plugins.cri.containerd.runtimes.layotto]
runtime_type = "io.containerd.layotto.v2"

重启 containerd 让最新配置生效

sudo systemctl restart containerd

F、安装 wasmer(如果vm engine 使用 wasmer 则执行如下命令)​

> curl -L -O https://github.com/wasmerio/wasmer/releases/download/2.0.0/wasmer-linux-amd64.tar.gz
> tar zxvf wasmer-linux-amd64.tar.gz
> sudo cp lib/libwasmer.so /usr/lib/libwasmer.so

四、快速开始​

A、启动 Layotto​

> minikube ssh
> layotto start -c /home/docker/config.json

B、创建 Layotto 运行时​

> kubectl apply -f ./demo/faas/layotto-runtimeclass.yaml
runtimeclass.node.k8s.io/layotto created

C、创建 Function​

该操作会将function_1.wasm和function_2.wasm自动注入到Virtualbox虚拟机中。

> kubectl apply -f ./demo/faas/function-1.yaml
pod/function-1 created

> kubectl apply -f ./demo/faas/function-2.yaml
pod/function-2 created

D、写入库存数据到 Redis​

> redis-cli
127.0.0.1:6379> set book1 100
OK

E、发送请求​

> minikube ip
192.168.99.117

> curl -H 'id:id_1' '192.168.99.117:2045?name=book1'
There are 100 inventories for book1.

五、示例流程介绍​

img.png

  1. HTTP 请求 func1
  2. func1 通过 Runtime ABI 调用 func2
  3. func2 通过 Runtime ABI 调用 redis
  4. 依次返回结果

常见问题说明​

1.Virtualbox 启动失败,"The host-only adapter we just created is not visible":

参考:The host-only adapter we just created is not visible

2.启动Layotto时,redis连接失败,打印 "occurs an error: redis store: error connecting to redis at":

检查redis的配置,看是否redis配置错误造成的。

说明​

目前整套 FaaS 模型处于 POC 阶段,功能还不够完善,后续会在以下几个方向上进一步探索完善:

  1. 对函数运行时可使用的最大资源进行限制,如cpu,heap,stack等。
  2. 由不同 Layotto 加载运行的函数之间可以互相调用。
  3. 充分融入k8s生态,比如上报使用资源给k8s,让k8s进行更好的调度。
  4. 增加更多的 Runtime ABI。

如果你对 FaaS 感兴趣或者有任何疑问或者想法,欢迎在 issue 区留言,我们一起建设 FaaS !