折腾Openwhisk - 本地ubuntu部署openwhisk

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

部署完毕,后面一点点深入折腾,碎觉!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,532评论 15 147
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,654评论 18 139
  • openstack kolla 入门 kolla 使命 快速开始 基础环境 安装前检查 安装依赖 版本要求 安装k...
    tor2阅读 4,364评论 0 0
  • 熊志军~【日精进打卡第346天】 4月26号卡 付达新商贸~众德营销 沈阳盛和塾道盛组/稻芽七组 【知~学习】 诵...
    熊志军阅读 184评论 0 0
  • 今天来无锡出差。昨晚约大学同学小鲍他没空,转约高中同学玲丽,一拍即合,准备晚上玩完后去她家睡。 中午到了无锡后,想...
    熊大大啊阅读 131评论 1 4