试用在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的引入并不是主要目标,所以如果有机会的话,我可能会尝试一下,将其保留在考虑的级别。

广告
将在 10 秒后关闭
bannerAds