试用在Ubuntu 16.10上的OpenWhisk
根据题目要求,我在一台Ubuntu 16.10机器上运行了OpenWhisk,并记下了笔记。
首先
由于一些事情,我急需准备OpenWhisk的本地环境,所以搭建了一台Ubuntu机器。
由于没有多加考虑,我准备了一个虚拟机,所以版本是16.10(内核是4.8)。
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.10
DISTRIB_CODENAME=yakkety
DISTRIB_DESCRIPTION="Ubuntu 16.10"`
不过,该系统的要求尚不明确,只能在Ubuntu服务器上设置OpenWhisk,并且只有14.04.03版本的安装步骤示例。
当查看之前的OpenWhisk Advent Calendar并在网上搜索时,发现有一些帖子表明在16.04版本上无法安装。有点担心。。
嗯,最近我在神游的状态下,为了提升久违的问题判别能力,我决定继续下去。
这次我故意没有参考先前的困扰点,希望能够以无偏见的态度进行工作。
我实际尝试了一下
从一个空白的操作系统开始。
在引入之前的准备工作。
首先,作为礼仪,更新APT库索引并将包更新至最新状态。
$ sudo apt-get update
$ sudo apt-get upgrade
为了从Git仓库中获取OpenWhisk的源代码,需要使用git命令来进行操作。
$ sudo apt-get install git -y
另外,由于从Git代码库中获取源代码进行构建时,如果没有先安装以下库,将会在后续遇到问题,因此我们要提前安装它们。
$ sudo apt-get -y install gcc make build-essential libssl-dev libffi-dev python-dev
此外,在Ubuntu特有的环境设置过程中,会安装Python的pip。但是如果版本太旧会报错,因此需要提前手动安装并更新版本。(即使更新了,预处理中仍会出现警告…)
# pipを使えるようにして
$ sudo apt-get -y install python-pip
# バージョン確認し
$ pip --version
pip 8.1.2 from /usr/lib/python2.7/dist-packages (python 2.7)
# 古いので更新する
$ pip install --upgrade pip
Collecting pip
Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.3MB 883kB/s
Installing collected packages: pip
Successfully installed pip-8.1.2
You are using pip version 8.1.2, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
openwhisk@ubuntu:~$ pip --version
pip 9.0.1 from /home/openwhisk/.local/lib/python2.7/site-packages (python 2.7)
拿来OpenWhisk的代码
使用 git 克隆源代码到本地设备上。
$ git clone https://github.com/apache/incubator-openwhisk.git openwhisk
Cloning into 'openwhisk'...
remote: Counting objects: 20207, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 20207 (delta 0), reused 0 (delta 0), pack-reused 20204
Receiving objects: 100% (20207/20207), 51.27 MiB | 3.16 MiB/s, done.
Resolving deltas: 100% (11031/11031), done.
Checking connectivity... done.
完成后,请移动到目录并确认目录结构是否如下所示。
$ cd openwhisk
$ ls
CONTRIBUTING.md LICENSE.txt ansible common docs gradlew sdk tests
CREDITS.txt README.md bin core gradle gradlew.bat settings.gradle tools
更改Docker引入的设置
这是关键之一。查看源代码后,我们可以看到OpenWhisk的Ubuntu特定环境设置相关的bash脚本,明显是基于14.04进行编写的,所以需要进行修正。考虑到使用Docker,个人认为手动安装可能更好。
# バックアップを取って
$ cp -p tools/ubuntu-setup/docker.sh tools/ubuntu-setup/docker.sh.org
# dockerのセットアップスクリプトを編集し
$ vi tools/ubuntu-setup/docker.sh
# 差分を確認します
$ diff tools/ubuntu-setup/docker.sh tools/ubuntu-setup/docker.sh.org
7c7
< sudo sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-yakkety main > /etc/apt/sources.list.d/docker.list"
---
> sudo sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-trusty main > /etc/apt/sources.list.d/docker.list"
17c17
< sudo apt-get install -y --force-yes docker-engine
---
> sudo apt-get install -y --force-yes docker-engine=1.12.0-0~trusty
只需要将Trusty更改为Yakkety的16.10即可。此外,docker-engine的版本也很旧,因此暂时解除了版本限制。既然它在容器中运行,除非API周围发生了重大变化,否则OpenWhisk应该能正常工作!
Ubuntu的本地环境设置程序
根据文档的指示,在tools/ubuntu-setup目录下运行all.sh文件。
$ cd tools/ubuntu-setup && ./all.sh
*** installing basics
Etc/UTC
:
python version = 2.7.12+ (default, Sep 17 2016, 12:08:02) [GCC 6.2.0 20160914]
ansible-playbook 2.3.0.0
config file =
configured module search path = Default w/o overrides
python version = 2.7.12+ (default, Sep 17 2016, 12:08:02) [GCC 6.2.0 20160914]
25612 finished with status 0
install all with total errors number 0
是的,成功了!(确实在依赖关系方面重新执行了几次… 如果先前提到的东西在之前就已经输入了,应该就没有问题了。)
建筑
将OpenWhisk的家目录设置为当前目录,并运行gradlew命令。如果看到”BUILD SUCCESSFUL”,说明成功。在我的环境中,构建Docker镜像等操作大约需要30分钟。
$ sudo ./gradlew distDocker
Downloading https://services.gradle.org/distributions/gradle-3.5-bin.zip
:
BUILD SUCCESSFUL
Total time: 29 mins 9.802 secs
更改Docker主机的配置文件
这里是重点2。在上述的设置脚本中没有包含在Docker Host上公开远程API的配置。所以,如果继续进行,最终会发生以下类似的错误。
致命错误:[172.17.0.1]:失败!=> {“changed”: false, “content”: “”, “failed”: true, “msg”: “状态码不为[200]:请求失败:”, “redirected”: false, “status”: -1, “url”: “http://172.17.0.1:4243/info”}
因此,我們將修改dockerd的配置文件如下:
$ sudo vi /lib/systemd/system/docker.service
$ cat /lib/systemd/system/docker.service
:
# for containers run by docker
# 元々の設定をコメントして
#ExecStart=/usr/bin/dockerd -H fd://
# Remote APIをExposeするように設定
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -H fd://
ExecReload=/bin/kill -s HUP $MAINPID
完成设置后,请重新加载并重新启动dockerd。
# リロードして
$ sudo systemctl daemon-reload
# 再起動
$ sudo service docker restart
# 4243ポートをListenしているか確認して
$ sudo netstat -anp |grep 4243
tcp6 0 0 :::4243 :::* LISTEN 20101/dockerd
# 一応curlでAPIエンドポイントを突く
$ curl http://localhost:4243/version
{"Version":"17.05.0-ce","ApiVersion":"1.29","MinAPIVersion":"1.12","GitCommit":"89658be","GoVersion":"go1.7.5","Os":"linux","Arch":"amd64","KernelVersion":"4.8.0-26-generic","BuildTime":"2017-05-04T22:15:36.071254972+00:00"}
所有准备工作已经完成了,只剩下部署了。
部署
只要沿着这条路继续走,这里什么特别的事情都没有。只要Docker环境准备好了,就没有什么大不了的。
# configを生成し
$ ansible-playbook -i environments/local setup.yml
# prereqを流す
$ ansible-playbook -i environments/local prereq_build.yml
这里要注意一点。prereq_build一定会失败。
虽然”install headers for kernel 4.4.0-31″的处理是错误的原因,但是从根本上说,当前验证环境的内核级别是4.8,又旧,且似乎不涉及之后的处理,所以这次我们忽略了它。
# 今回はテストなので、デフォルトのままcouchdbを導入し
$ sudo ansible-playbook -i environments/local couchdb.yml
# DBを初期化し
$ sudo ansible-playbook -i environments/local initdb.yml
# wipeして
$ sudo ansible-playbook -i environments/local wipe.yml
# OpenWhisk環境をセットアップする
$ sudo ansible-playbook -i environments/local openwhisk.yml
:
PLAY RECAP ***************************************************************************************************************************************
172.17.0.1 : ok=51 changed=38 unreachable=0 failed=0
ansible : ok=6 changed=3 unreachable=0 failed=0
**********
===============================================================================
nginx : pull the nginx:1.11 image -------------------------------------- 15.30s
consul : wait until the Consul Server/Agent in this host is up and running --- 7.37s
kafka : wait until the Zookeeper in this host is up and running --------- 7.27s
invoker : wait until Invoker is up and running -------------------------- 5.81s
controller : wait until the Controller in this host is up and running --- 5.53s
kafka : wait until the kafka server started up -------------------------- 5.31s
kafka : create the active-ack and health topic -------------------------- 3.23s
consul : pull the consul:0.7.0 image ------------------------------------ 2.65s
kafka : pull the zookeeper:3.4 image ------------------------------------ 2.65s
kafka : pull the ches/kafka:0.10.0.1 image ------------------------------ 2.50s
routemgmt : install route management actions ---------------------------- 1.88s
kafka : create the invoker topics --------------------------------------- 1.53s
Gathering Facts --------------------------------------------------------- 1.38s
sdk : copy docker sdk to dockerSkeleton in scratch space ---------------- 0.99s
consul : (re)start consul server/agent ---------------------------------- 0.98s
consul : fill consul kv ------------------------------------------------- 0.91s
nginx : (re)start nginx ------------------------------------------------- 0.84s
nginx : copy cert files from local to remote in nginx config directory --- 0.77s
cli : run Docker -------------------------------------------------------- 0.72s
kafka : (re)start kafka ------------------------------------------------- 0.69s
在导入之后,只有这么多个Docker容器正在运行。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9df4c97bf79c nginx:1.11 "nginx -g 'daemon ..." 9 minutes ago Up 9 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8443->8443/tcp nginx
9e03206f5794 whisk/nodejs6action:latest "/bin/sh -c 'node ..." 9 minutes ago Up 9 minutes wsk0_6_warmJsContainer_20170527T073229905Z
b60dc5965062 whisk/nodejs6action:latest "/bin/sh -c 'node ..." 9 minutes ago Up 9 minutes wsk0_5_whisksysteminvokerHealthTestAction001_20170527T073229384Z
fafeba708cc7 whisk/nodejs6action:latest "/bin/sh -c 'node ..." 9 minutes ago Up 9 minutes wsk0_3_warmJsContainer_20170527T073227074Z
9b9715b45af4 whisk/nodejs6action:latest "/bin/sh -c 'node ..." 9 minutes ago Up 9 minutes wsk0_2_whisksysteminvokerHealthTestAction001_20170527T073226625Z
80a11f7cea5d whisk/nodejs6action:latest "/bin/sh -c 'node ..." 9 minutes ago Up 9 minutes wsk0_1_warmJsContainer_20170527T073226020Z
a6525c951142 whisk/invoker:latest "/bin/sh -c 'exec ..." 9 minutes ago Up 9 minutes 0.0.0.0:12001->8080/tcp invoker0
95b7983299af whisk/controller:latest "/bin/sh -c 'contr..." 9 minutes ago Up 9 minutes 0.0.0.0:10001->8080/tcp controller
9acd3d931a96 ches/kafka:0.10.0.1 "/start.sh" 9 minutes ago Up 9 minutes 7203/tcp, 0.0.0.0:9092->9092/tcp kafka
cb388cab0d5d zookeeper:3.4 "/docker-entrypoin..." 10 minutes ago Up 10 minutes 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp zookeeper
f7b6d10a3d0c gliderlabs/registrator "/bin/registrator ..." 10 minutes ago Up 10 minutes registrator
c9f79bd12215 consul:0.7.0 "docker-entrypoint..." 10 minutes ago Up 10 minutes 0.0.0.0:8300-8302->8300-8302/tcp, 0.0.0.0:8400->8400/tcp, 0.0.0.0:8301-8302->8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/udp, 8600/tcp consul
c674f20cf5fc couchdb:1.6 "tini -- /docker-e..." 11 minutes ago Up 11 minutes 0.0.0.0:5984->5984/tcp couchdb
不要忘记执行部署后的后续处理步骤。
$ sudo ansible-playbook -i environments/local postdeploy.yml
:
PLAY RECAP ******************************************************************************************************************************************************************
ansible : ok=10 changed=4 unreachable=0 failed=0
**********
===============================================================================
download the catalog repository to the catalog location if necessary ---- 2.36s
install the catalog from the catalog location --------------------------- 1.83s
Gathering Facts --------------------------------------------------------- 0.64s
write whisk.properties template to openwhisk_home ----------------------- 0.51s
Gathering Facts --------------------------------------------------------- 0.38s
ensure catalog_location directory exists -------------------------------- 0.25s
include ----------------------------------------------------------------- 0.05s
set_fact ---------------------------------------------------------------- 0.04s
set_fact ---------------------------------------------------------------- 0.04s
set_fact ---------------------------------------------------------------- 0.04s
没有任何错误。好的!
确认行动
只需要使用wsk命令进行操作确认。首先进行认证密钥的设置。
$ ./bin/wsk property set --auth $(cat ansible/files/auth.whisk.system) --apihost 172.17.0.1
ok: whisk auth set. Run 'wsk property get --auth' to see the new value.
ok: whisk API host set to 172.17.0.1
我会确认包裹。
$ ./bin/wsk package list --insecure
packages
/whisk.system/utils shared
/whisk.system/watson-translator shared
/whisk.system/watson-textToSpeech shared
/whisk.system/watson-speechToText shared
/whisk.system/weather shared
/whisk.system/slack shared
/whisk.system/samples shared
/whisk.system/combinators shared
/whisk.system/github shared
/whisk.system/websocket shared
/whisk.system/apimgmt private
/whisk.system/routemgmt private
然后,执行echo动作以进行测试。
$ bin/wsk action invoke /whisk.system/utils/echo -p message hello --result --insecure
{
"message": "hello"
}
好的,任务已经顺利完成了!
结束一切
我已确认可以在Ubuntu 16.10上安装。尽管忽略了一些错误。。
过去的文章中提到无法在16.04中引入,我认为可能是那时发布的源代码有问题。因为我没有进行比较,所以无从得知。我会进行各种验证,如果发现在16.10中无法运行的情况,我会更新文章的!!
我也想知道它是否在17.04版本中是一样的,但由于OpenWhisk的引入并不是主要目标,所以如果有机会的话,我可能会尝试一下,将其保留在考虑的级别。