OpenWhisk简介
OpenWhisk 是一个开源、无服务(Serverless)的云平台,可以在运行时容器中通过执行扩展的代码响应各种事件,而无需关心相关的基础设施架构。OpenWhisk 是基于云的分布式事件驱动(event-based)的编程服务。OpenWhisk 提供一种编程模型——将事件处理程序注册到云服务中——以处理各种不同的服务,可以支持数千触发器和调用,可以对不同规模的事件进行响应。
OpenWhisk是由许多组件构建:
这些组件,让OpenWhisk成为了一款优秀的开源FaaS平台
OpenWhisk部署
实验机器操作系统:Ubuntu 18.04 Desktop系统。
使用 Apache 提供在 github 上的 incubator-openwhisk 进行安装,如果本机没有安装Git,需要先安装Git:
apt install git
接下来克隆 repo 到本地目录:
git clone https://github.com/apache/incubator-openwhisk.git openwhisk
克隆完成:
进入到OpenWhisk目录,并且执行脚本。Openwhisk 是由 Scala 开发,运行需要安装 Java 环境,下面的脚本实现了 java 环境的安装,以及其它的所需要的软件:
cd openwhisk && cd tools/ubuntu-setup && ./all.sh
对OpenWhisk进行配置,进行基础的配置OpenWhisk 使用 ansible 进行部署,环境变量定义在 ansible/environments/group_vars/all下面:
limits:
invocationsPerMinute: "{{ limit_invocations_per_minute | default(60) }}"
concurrentInvocations: "{{ limit_invocations_concurrent | default(30) }}"
concurrentInvocationsSystem: "{{ limit_invocations_concurrent_system | default(5000) }}"
firesPerMinute: "{{ limit_fires_per_minute | default(60) }}"
sequenceMaxLength: "{{ limit_sequence_max_length | default(50) }}"
上面的值定义了 OpenWhisk 在系统中的限制,分别为:
- invocationsPerMinute表示同一个 Namespace 每分钟的调用 action 数量,
- concurrentInvocations表示同一个 Namespace 的并发调用数量,
- concurrentInvocationsSystem表示系统中所有 Namespace 的并发调用数量,
- firesPerMinute表示同一 Namespace 中每分钟调用 trigger 的数量,
- sequenceMaxLength表示 Action 的最大序列长度。
如果需要修改上述的默认值,可以把修改后的值添加到文件 ansible/environments/local/group_vars/all的末尾。例如, Action 的最大序列长度为 100,可以将 sequenceMaxLength: 120 添加到文件的末尾。
接下来,为 OpenWhisk 配置一个持久存储的数据库,有CouchDB和Cloudant可选,以CouchDB为例,配置环境:
export OW_DB=CouchDB
export OW_DB_USERNAME=root
export OW_DB_PASSWORD=PASSWORD
export OW_DB_PROTOCOL=http
export OW_DB_HOST=172.17.0.1
export OW_DB_PORT=5984
在openwhisk/ansible目录下,运行脚本:
ansible-playbook -i environments/local/ setup.yml
接下来使用 CouchDB 部署 OpenWhisk,确保本地已经有了 db_local.ini 并配置完毕。在openwhisk/目录下执行部署命令:
./gradlew distDocker
如果部署过程中出现问题:
可能是没有安装npm导致的,可以执行:
apt install npm
稍等片刻,可以看到BUILD SUCCESSFUL:
接下来进入到openwhisk/ansible目录:
ansible-playbook -i environments/local/ couchdb.yml
ansible-playbook -i environments/local/ initdb.yml
ansible-playbook -i environments/local/ wipe.yml
ansible-playbook -i environments/local/ apigateway.yml
ansible-playbook -i environments/local/ openwhisk.yml
ansible-playbook -i environments/local/ postdeploy.yml
部署成功后,OpenWhisk 会在系统中启动几个 docker 容器。可以通过 docker ps
来查看,如下所示:
docker ps --format "{{.Image}} \t {{.Names }}"
开发者工具
OpenWhisk 提供了一个统一的命令行接口 wsk。生成的 wsk 在 openwhisk/bin 下。有两个属性需要配置:
- API host 部署 OpenWhisk 的主机名或 IP 地址
- Authorization key 用户名或密码用来授权操作 OpenWhisk 的 API。
设置 API host,在单机配置中的 IP 应该为 172.17.0.1。
./bin/wsk property set --apihost '172.17.0.1'
设置 key。
./bin/wsk property set --auth `cat ansible/files/auth.guest
OpenWhisk 将 CLI 的配置信息存储在~/.wskprops 中。这个文件的位置也可以通过环境变量 WSK_CONFIG_FILE 来指定。
可以验证CLI:
wsk action invoke /whisk.system/utils/echo –p message hello –result
{
"message": "hello"
}
体验测试
创建简单的动作 (action),代码如下:
# test.py
def main(args):
num = args.get("number", "30")
return {"fibonacci": F(int(num))}
def F(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return F(n - 1) + F(n - 2)
创建动作:
/bin/wsk action create myfunction ./test.py --insecure
触发动作:
./bin/wsk -i action invoke myfunction --result --blocking --param nember 20
得到结果:
至此,我们完成了OpenWhisk项目的部署以及体验测试。