本期推荐的EasyFaaS是一个依赖轻、适配性强、资源占用少、无状态且高性能的函数计算服务引擎。
简介特点
- 依赖轻:EasyFaaS只依赖Linux内核,不强制依赖Docker、Kubernetes等外部服务
- 适配性强:EasyFaaS可以运行在多种系统环境,包括Docker、Kubernetes及裸机等
- 资源占用少:模块少,服务系统模块占用更小
- 无状态:每个EasyFaaS Pod本身无状态且内部自治
- 高性能:调度链路更短,更小的系统开销和更优的性能
适用于
- 边缘计算-Edge
- 物联网-IoT
- CICD
- 私有化
- CDN
快速开始
基于Linux(内核4.0+)、提前安装docker, 提供两种方式供开发者快速开始:
- 方式一:使用all-in-one方式运行
- 方式二:使用docker-compose运行
- 方式三:编译打包部署
方式一:使用all-in-one方式运行
编译
编译全部模块 备注:如果您是在linux环境或者不需要对单个模块进行编译,只需要运行1.1的命令即可
$ make
为其它平台交叉编译:
$ KUN_BUILD_PLATFORMS="linux/amd64" make
只编译某一个模块:
$ make WHAT=./pkg/controller
打包
$ scripts/build-image.sh -h
Usage: scripts/build-image.sh [OPTIONS]
-h --help 帮助
-m= --module= 模块名称
-i= --image= 镜像名称
-t= --tag= 镜像标签
-e= --env= 部署环境(镜像仓库配置)
打包all-in-one镜像,其中会包含controller组件、 funclet组件、 stubs组件。需要注意的runtime目前不开源,直接拉取镜像即可,执行脚本打包:
$ scripts/build-image.sh -m=one -i=easyfaas -t=dev
如果您需要发布打包好的镜像,需要指定REGISTRY,如:
$REGISTRY=registry.baidubce.com/<your_namespace>/ ./scripts/build-image.sh -m=one -i=easyfaas -t=dev
上传镜像
如果在本机,否则需要上传镜像
docker push [OPTIONS] NAME[:TAG]
如:
docker push registry.baidubce.com/<your_namespace>/<your_image_name>:<your_image_tag>
启动服务
export faasPath=/<your_path_prefix>/easyfaas/faas
#runner-runtime请直接下载镜像
docker run -td -e WITHRUNNER=1 -e WITHNODEJS10=1 -e WITHNODEJS12=1 -e WITHPYTHON3=1 --name runner-runtime -v ${faasPath}/runtime:/var/faas/runtime -v ${faasPath}/runner:/var/faas/runner registry.baidubce.com/easyfaas-public/runner-runtime:demo1.0
# 启动all-in-one服务
docker run -td --privileged -v ${faasPath}/runner:/var/faas/runner -v ${faasPath}/runtime:/var/faas/runtime -v ${faasPath}/data:/var/faas/runner-data --name easyfaas registry.baidubce.com/easyfaas-public/all-in-one:demo1.0
操作运行
安装运行完成后,执行如下命令进入到容器内:
$ docker exec -it easyfaas bash
方式二:使用docker-compose在本地运行easyfaas服务
确保本地Docker服务正常运行,因easyfaas服务底层依赖cgroup/loop设备等linux底层特性建议优先使用Linux系统。
easyfaas组件镜像
如总体架构图所述,easyfaas由4个组件构成,分别是 controller组件, funclet组件, runner-runtime组件,以及stubs模块构建的本地代码仓库组件func-registry。
您可以直接使用easyfaas发布的公共镜像,如果您本机无法访问公网, 可在能访问外网环境的服务器上下载并存储镜像文件到tar文件中,再将tar文件load至无公网的服务器。
运行easyfaas服务
主要配置在./scripts/docker-compose/compose-local/.env 文件,其中
- CONTROLLER_EXPORT_PORT: controller组件暴露的服务端口
- REGISTRY_EXPORT_PORT: mock本地函数代码仓库服务组件的服务端口
- FUNCTION_DATA_DIR: 本地函数代码目录
- easyfaas_REPO: 镜像仓库repo
- CONTROLLER_TAG: controller组件镜像tag, 完整镜像ID为{easyfaas_REPO}/controller:{{easyfaas_REPO}/controller:{CONTROLLER_TAG}
- FUNCLET_TAG: funclet组件镜像tag, 完整镜像ID为{easyfaas_REPO}/mini-funclet:{{easyfaas_REPO}/mini-funclet:{CONTROLLER_TAG}
- RUNTIME_TAG: runner-runtime组件镜像tag, 完整镜像ID为{easyfaas_REPO}/runner-runtime:{{easyfaas_REPO}/runner-runtime:{CONTROLLER_TAG}
- REGISTRY_TAG: 本地mock函数仓库组件tag, 完整镜像ID为{easyfaas_REPO}//func-registry:{{easyfaas_REPO}//func-registry:{CONTROLLER_TAG}
# env文件配置 示例
$ cat ./scripts/docker-compose/compose-local/.env
CONTROLLER_EXPORT_PORT=8899
REGISTRY_EXPORT_PORT=8002
FUNCTION_DATA_DIR=/tmp/funcData
easyfaas_REPO=registry.baidubce.com/easyfaas-public
CONTROLLER_TAG=demo1.0
FUNCLET_TAG=demo1.0
RUNTIME_TAG=demo1.0
REGISTRY_TAG=demo1.0
启动服务
运行如下命令启动服务,并运行docker ps查看组件是否正确运行: 其中controller组件容器,funclet组件容器及func-registry组件容器为常驻容器, 查看容器是否正常运行
# 启动服务
$ cd ./scripts/docker-compose/compose-local/
$ sh app_control.sh start
# 检查服务
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bec1b3fd3e4 controller:demo1.0 "./controller --maxproc…" 3 days ago Up 3 days minikun_minikun_1
8b6b1f6d2b1d mini-funclet:demo1.0 "./funclet --logtost…" 3 days ago Up 3 days minikun_funclet_1
5082b7249d28 func-registry:demo1.0 "/stubs --port=8002 …" 3 days ago Up 3 days minikun_registry_1
$ 查看服务是否正常运行
核心功能
技术架构
核心模块说明
controller
负责流量调度及容器池状态管理。
- 实现容器调度功能。
- 支持配置函数级别的并发。
- 支持容器状态管理,按策略调度容器状态。
- 支持健康检查,可以根据runtime的状态决定cooldown/reborn。
funclet
负责管理用户工作容器,包括基础容器资源及函数运行资源。
- 容器管理:实现容器的init/warmup/reset流程。
- 网络管理:实现容器网络相关功能,合理管理网络资源。
- 挂载管理:实现用户容器的动态挂载,并定期回收用户容器的挂载目录。
- 进程管理:需妥善管理用户容器产生的子进程,处理异常退出的子进程。
- 资源容量管理:实现用户工作容器的内存资源动态调整。
runner-runtime
runner负责管理用户函数运行时,runtime支持各开发语言运行时,目前该组件当前仅提供容器镜像