FaaS已经不算陌生的概念了,AWS的lamda以后,其他各个厂商也都争相推出自己的函数计算服务,微软,阿里,腾讯等,IBM也有自己的函数即服务,并且已经开源,项目:Openwhisk(以下简称OW),挺适合个人折腾一下,官网走你-> http://openwhisk.incubator.apache.org/
函数即服务作为无服务器的最直接的体现,可以说是真正云环境下的开发模式,配合云端的存储,如S3等服务,将来还是有很好的发展空间的,目前看来FaaS似乎超前,客户还都在向云端过渡,不过云的高可用、可伸缩等特性被大家所接受以后,无服务器的应用会过度的更加顺利迅速。
这篇文章作为折腾的开头,所以先看看怎样来在本地部署一套OW。
一 部署准备
官方ubuntu的部署文档:->走你!
我在本地使用vmware起了一台虚拟机作为部署环境:
- OS: ubuntu 14.04.5
我的具体配置作为参考: - CPU:2
- 内存: 4G
- 磁盘:80G
为了保证ubuntu安装依赖软件包时的速度得到保证,我直接将apt的源以及pip的软件源替换成了阿里的。
1. 下载项目源码
从github克隆项目源码到本地环境(由于本地环境,我在这这里直接使用的root用户,如果本地没有git需要先进行安装):
# cd ~
# git clone https://github.com/apache/incubator-openwhisk.git
OW的部署在项目中已经有了非常完善的工具链支持,真个的部署过程可以理解为ansible + docker,有了容器的支持,明显感觉到部署会轻松得啦……不像当年弄Openstack,累的要死部署完了,发现一堆坑,OW的部署需要先将各个组件进行构建,这里使用的gradle作为构建工具,然后通过ansible将各个容器化的组件进行部署,所以环境中需要有docker容器、ansible、pip、scala(一种函数式编程语言)等依赖,不过这些内容已经在项目中提供了相应的脚本进行安装:
# cd /root/incubator-openwhisk/tools/ubuntu-setup
# ./all.sh
以上执行all.sh
脚本会在本地进行依赖环境的安装,具体安装了哪些呢,可以看一下all.sh
的内容:
#!/bin/bash
set -e
set -x
SOURCE="${BASH_SOURCE[0]}"
SCRIPTDIR="$( dirname "$SOURCE" )"
#echo "*** installing basics"
#"$SCRIPTDIR/misc.sh"
echo "*** installing python dependences"
"$SCRIPTDIR/pip.sh"
echo "*** installing java"
"$SCRIPTDIR/java8.sh"
echo "*** install scala"
"$SCRIPTDIR/scala.sh"
echo "*** installing docker"
"$SCRIPTDIR/docker.sh"
echo "*** installing ansible"
"$SCRIPTDIR/ansible.sh"
这个脚本简直是一览无遗啊,实际上脚本里分别对pip,java,scala,docker,ansible调用了各自的安装脚本。
执行结束后,基本的依赖环境就已经安装完成了,下面进行构建部分。
二 构建
OW的构建工作主要是build出各个组件的docker镜像,各个组件的Dockerfile在core
目录下:
# ls /root/incubator-openwhisk/core
actionProxy javaAction php7.1Action routemgmt
controller nodejs6Action python2Action swift3.1.1Action
invoker nodejsActionBase pythonAction swift3Action
这些组件有什么用以后再说,这次的主要目的是先搞起来~
1. 构建准备
为了使构建过程更加顺利,可以先做一些准备工作,比如:
gradle
构建过程中容器会拉取gradle的安装包,不过我的网络比较慢,只好迅雷弄下来,在本地搭了个建议的文件服务器进,然后将gradle的地址换成本地的地址即可:
# git diff gradle/wrapper/gradle-wrapper.properties
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip
+#distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip
+distributionUrl=http\://192.168.1.129:8080/gradle-3.5-bin.zip
docker
除了gradle的相关内容,由于使用的是docker,所以构建过程中会进行拉取一些镜像,但是从docker hub拉取速度太慢,所以我使用了daocloud的加速器,具体配置的话跳过去看吧!
容器内部源
容器内部构建时会进行安装软件包,如swift3Action
构建的base镜像时Ubuntu,这里在swift3Action
中添加了aliyun的软件源:
# cd /root/incubator-openwhisk/core/swift3Action
# cat sources.list
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
# git diff Dockerfile
diff --git a/core/swift3Action/Dockerfile b/core/swift3Action/Dockerfile
index aa766d4..2b9aff3 100644
--- a/core/swift3Action/Dockerfile
+++ b/core/swift3Action/Dockerfile
@@ -4,6 +4,8 @@ FROM buildpack-deps:trusty
ENV DEBIAN_FRONTEND noninteractive
+COPY sources.list /etc/apt/sources.list
+
另外如pythonAction
等几个镜像的base镜像alpine
,这里用ustc的源进行了替换:
# cd /root/incubator-openwhisk/core/pythonAction
# git diff Dockerfile
diff --git a/core/pythonAction/Dockerfile b/core/pythonAction/Dockerfile
index 8355fe2..3645381 100644
--- a/core/pythonAction/Dockerfile
+++ b/core/pythonAction/Dockerfile
@@ -1,6 +1,8 @@
# Dockerfile for python actions, overrides and extends ActionRunner from actionProxy
FROM dockerskeleton
+RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
+
RUN apk add --no-cache \
bzip2-dev \
gcc \
2. 开始构建
下面开始执行构建,使用项目中的gradlew即可:
# cd /root/incubator-openwhisk
# ./gradlew distDocker
最后提示BUILD SUCCESSFUL
表示构建成功。
三 部署
部署的部分主要通过ansible
完成,大部分动作在/root/incubator-openwhisk/ansible
目录下。
1. 数据库配置
OW需要数据库的支持,官方给出了两种数据库的配置:CouchDB和Cloudant,这里我使用的CouchDB,首先指定安装数据库的必要的环境变量:
# cd ~
# vim env.sh
export OW_DB=CouchDB
export OW_DB_USERNAME=openwhisk
export OW_DB_PASSWORD=openwhisk
export OW_DB_PROTOCOL=http
export OW_DB_HOST=192.168.222.140
export OW_DB_PORT=5984
# source env.sh
这几个变量见名知意,无需多言,不过OW_DB_PORT
需要说一下,官方文档默认写的是443,这个端口会映射到数据库的容器内部的数据库服务端口上(CouchDB是5984),但是OW最后需要启动nginx容器,nginx也会使用443端口,如果这里配置了443,nginx会启动失败,所以这里讲OW_DB_PORT替换为5984。
生成数据库配置文件:
# cd /root/incubator-openwhisk/ansible
ansible-playbook -i environments/<environment> setup.yml
OW项目中把部署在不同平台的几种方式用不同的配置文件放在environments
目录下,通过ansible-playbook的-i
参数是选择,作为Inventory配置,通过配置可以理解整个部署架构是什么样的,这个也以后再说啦~我是在本地环境执行的,所以最终执行的命令是:
ansible-playbook -i environments/local setup.yml
执行结束后,会在ansible
目录下生成db_local.ini的配置文件:
# cat db_local.ini
[db_creds]
db_provider=CouchDB
db_username=openwhisk
db_password=openwhisk
db_protocol=http
db_host=192.168.222.140
db_port=5984
2. 部署环境
实际上部署环境的部分就没有什么操作的了,只是通过ansible将各个组件的容器start即可:
# cd /root/incubator-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
以上ansible命令没有执行出错的话,那么OW就已经在本地环境运行啦,查看一下当前启的容器:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9766bd2da6c5 nginx:1.11 "nginx -g 'daemon off" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8443->8443/tcp nginx
af0445f13617 whisk/nodejs6action:latest "/bin/sh -c 'node --e" 2 hours ago Up 2 hours wsk0_4_prewarm_nodejs6
c1c1872f7dc3 whisk/nodejs6action:latest "/bin/sh -c 'node --e" 2 hours ago Up 2 hours wsk0_3_prewarm_nodejs6
e8582bcb18ca whisk/invoker:latest "/bin/sh -c 'exec /in" 2 hours ago Up 2 hours 0.0.0.0:12001->8080/tcp invoker0
c09edab4cdbe whisk/controller:latest "/bin/sh -c 'controll" 2 hours ago Up 2 hours 0.0.0.0:10001->8080/tcp controller0
e04db1020699 ches/kafka:0.10.2.1 "/start.sh" 2 hours ago Up 2 hours 7203/tcp, 0.0.0.0:9092->9092/tcp kafka
b0e3452abebf zookeeper:3.4 "/docker-entrypoint.s" 2 hours ago Up 2 hours 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp zookeeper
6fde9341569f openwhisk/apigateway:0.8.2 "/usr/local/bin/dumb-" 2 hours ago Up 2 hours 80/tcp, 8423/tcp, 0.0.0.0:9000->9000/tcp, 0.0.0.0:9001->8080/tcp apigateway
b09e1f7759a8 redis:3.2 "docker-entrypoint.sh" 2 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp redis
71b161eda21c couchdb:1.6 "tini -- /docker-entr" 2 hours ago Up 2 hours 0.0.0.0:5984->5984/tcp couchdb
以上的这些就是刚刚构建完毕并且启动的东西啦!
四 验证
部署结束了我们看看环境是否正常呢~验证的话用到OW的CLI工具wsk
,放在了项目的bin
目录下,为了方便使用将它添加到环境变量PATH中:
# vim ~/.bashrc
...
export PATH=$PATH:/root/incubator-openwhisk/bin
# source ~/.bashrc
首先看看wsk命令是否正常:
# wsk
____ ___ _ _ _ _ _
/\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __
/\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ /
/ \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ <
\ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\
\___\/ tm |_|
Usage:
wsk [command]
...
看到这样的Usage信息就ok了,然后做一些配置:
# cd /root/incubator-openwhisk
# wsk property set --apihost http://172.17.0.1:10001
ok: whisk API host set to http://172.17.0.1:10001
# wsk property set --auth `cat ./ansible/files/auth.guest`
ok: whisk auth set. Run 'wsk property get --auth' to see the new value.
分别通过wsk设定了我们刚部署的环境的APIhost(地址是docker0网卡的地址,10001端口实际就是OW的controller服务的端口),以及认证。
下面我们创建一个action,来输出“hello”这样一个信息,验证OW的环境是否正常:
# wsk action invoke /whisk.system/utils/echo -p message hello --result
{
"message": "hello"
}
能看到以上结果说明环境真的OK啦!
部署完毕,后面一点点深入折腾,碎觉!
网友评论