折腾Openwhisk - 本地ubuntu部署openwhisk

in #cn7 years ago

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啦!

Sort:  

Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:
https://www.jianshu.com/p/8e3a77c28532

Congratulations @cheneydc! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

Click here to view your Board

Support SteemitBoard's project! Vote for its witness and get one more award!

Congratulations @cheneydc! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 2 years!

You can view your badges on your Steem Board and compare to others on the Steem Ranking

Vote for @Steemitboard as a witness to get one more award and increased upvotes!