Serverless 工程实践|自建 Apache OpenWhisk 平台
作者 | 刘宇(江昱)
前言:OpenWhisk 是一个开源、无服务器的云平台,可以在运行时容器中通过执行扩展的代码响应各种事件,而无须用户关心相关的基础设施架构。
OpenWhisk 简介
OpenWhisk 是基于云的分布式事件驱动的编程服务。OpenWhisk 提供一种编程模型,将事件处理程序注册到云服务中,以处理各种不同的服务。其可以支持数千触发器和调用,可以对不同规模的事件进行响应。
OpenWhisk 是由许多组件构建的,这些组件让 OpenWhisk 成为一款优秀的开源 FaaS 平台。
Apache OpenWhisk 组件结构
OpenWhisk 部署
实验机器操作系统为 Ubuntu 18.04 Desktop。使用 GitHub 上所提供的 incubator-openwhisk 进行安装,如果本机没有安装 Git,需要先安装 Git:
apt install git
接下来克隆 repo 到本地目录:
git clone https://github.com/apache/incubator-openwhisk.git openwhisk
克隆完成之后,显示如图所示。
Apache OpenWhisk 项目 Clone
进入 OpenWhisk 目录,并且执行脚本。OpenWhisk 是由 Scala 开发的,运行需要安装 Java 环境。下面的脚本实现了 Java 环境的安装,以及其他的所需要的软件:
cd openwhisk && cd tools/ubuntu-setup && ./all.sh
Apache OpenWhisk 安装配置如图所示。
Apache 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 成功页面,如图所示。
Build 成功示例
接下来进入 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 地址的 API。
- Authorization key(用户名或密码)用来授权操作 OpenWhisk 的 API。
设置 API host,在单机配置中的 IP 应该为 172.17.0.1,如图所示。
./bin/wsk property set --apihost '172.17.0.1'
设置 API host
设置 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 项目的部署以及测试。
Serverless 工程实践|自建 Apache OpenWhisk 平台的更多相关文章
- Serverless 工程实践 | Serverless 应用优化与调试秘诀
作者|刘宇 前言:本文将以阿里云函数计算为例,提供了在线调试.本地调试等多种应用优化与调试方案. Serverless 应用调试秘诀 在应用开发过程中,或者应用开发完成,所执行结果不符合预期时,我 ...
- Serverless 工程实践 | 零基础上手 Knative 应用
作者|刘宇 前言:Knative 是一款基于 Kubernetes 的 Serverless 框架.其目标是制定云原生.跨平台的 Serverless 编排标准. Knative 介绍 Knative ...
- webpack 从入门到工程实践
from:https://www.jianshu.com/p/9349c30a6b3e?utm_campaign=maleskine&utm_content=note&utm_medi ...
- China .NET Conf 2019-.NET技术架构下的混沌工程实践
这个月的8号.9号,个人很荣幸参加了China.NET Conf 2019 , 中国.NET开发者峰会,同时分享了技术专题<.NET技术架构下的混沌工程实践>,给广大的.NET开发小伙伴介 ...
- 深入理解 ProtoBuf 原理与工程实践(概述)
ProtoBuf 作为一种跨平台.语言无关.可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储.随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代R ...
- 从工具、工具箱到数字化软件工厂——DevOps 设计理念与工程实践专场 | CIF 精彩看点
西方经典管理理论认为,组织效率可以归为劳动效率.组织效率和人的效率.美国管理学家泰勒所著的<科学管理原理>被德鲁克誉为"20 世纪最伟大的发明",劳动效率说认为分工提升 ...
- panguan(判官):一个自研的任务执行引擎的工程实践
来某厂接近半年了,几乎没写过C++代码,说实话还真的有点手生.最近刚好有一个需求,然而我感觉我也没有办法用C++以外的语言去实现它.于是还是花了几天时间用C++完成编码,这是一个简单的任务执行引擎,它 ...
- 公司简介 - CCDI悉地国际-工程实践专业服务的引领者
公司简介 - CCDI悉地国际-工程实践专业服务的引领者 关于悉地国际 CCDI悉地国际(以下简称"CCDI")创立于1994年,是在城市建设和开发领域从事综合专业 ...
- Linux开源模块迁移概述暨交叉编译跨平台移植总结--从《嵌入式Linux驱动模板简洁和工程实践》
本文摘录<嵌入式Linux驱动模板简洁和工程实践>一本书"开发和调试技术". Linux强大的是,有那么多的开源项目可以使用.通常非常需要可以通过寻找相关的源模块被定义 ...
随机推荐
- CodeForce-803B Distances to Zero(贪心DP)
Distances to Zero CodeForces - 803B 题意:给定一个数列 a0, a1, ..., an - 1.对于数列中的每一项都要求出与该项最近的0与该项的距离.保证数列中有至 ...
- 全流程指导Visual Studio Code+Markdown Nice+gitee+PicGo管理自己的技术博客文章
全流程指导Visual Studio Code+Markdown Nice+gitee+PicGo管理自己的技术博客 1.背景 我挺喜欢写博客,但每一次将博客转移到公众号或者知乎,总是需要调整格式,不 ...
- markdown写作系统
markdown 电脑本地使用typora,可保存为md文件直接上传到有道云笔记中 直接使用博客园做为图床,可以存为草稿,然后把复制连接 有道云笔记 粘贴博客园的图片连接
- linux 下 svn配置;以及多仓库配置
http://www.linuxidc.com/Linux/2016-01/127679.htm https://blog.csdn.net/mrwu9902/article/details/7869 ...
- 「含源码」关于NXP IMX8 Mini的图形开发指南(GPU)案例分享!
前言 Graphical Demo框架提供了对平台相关依赖的抽象.Graphical应用的通用封装,如模型加载.纹理加载.着色器编译等,以及其它一些通用的应用逻辑处理的封装,使得使用框架的开发人员(以 ...
- 测试用例 setup 和 和 teardown
前言 学过unittest的都知道里面用前置和后置setup呾teardown非常好用,在每次用例开始前呾结束后都去执行一次.当然迓有更高级一点的 setupClass 呾 teardownClass ...
- iOS 15 无法弹出授权弹框之解决方案---Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 15.0
2021年9月30日下午:我正愉快的期盼着即将到来的国庆假期,时不时刷新下appstoreconnect的网址,28号就提上去的包,今天还在审核中....由于这个版本刚升级的xcode系统和新出的iO ...
- vue+element UI 使用select元素动态的从后台获取到
VUE select元素动态的从后台获取到 <el-form-item label="选择店铺"> <el-select v-model="value& ...
- 踩坑系列《二》NewProxyResultSet.isClosed()Z is abstract 报错踩坑
在运行测试类的时候莫名其妙的报了个 NewProxyResultSet.isClosed()Z is abstract 这个错误,之前出现过这个错误,以为是版本出现了问题 就将版本 0.9.1.2 改 ...
- LOJ6356 四色灯(容斥+dp
纪念第一次所有的解析全写在代码里面 QWQ 这里就简单说几句了 首先一个灯有贡献,当且仅当他被按了\(4k\)次. 那么我们定义\(f(S)\)表示\([1,n]\)中有多少个数\(x\)是集合\(S ...