云计算百科
云计算领域专业知识百科平台

在 Ubuntu 服务器上从源码构建与部署 Apache OpenWhisk 实战指南

  • 云原生
  • 后端
  • 微服务

【免费下载链接】openwhisk

Apache OpenWhisk is an open source serverless cloud platform

项目地址:
https://gitcode.com/gh_mirrors/op/openwhisk

点击查看 免费下载

Apache OpenWhisk 是一个开源的无服务器(serverless)云平台,支持以函数即服务(FaaS)的方式运行代码。本文以仓库中的 tools/ubuntu-setup/README.md 为骨架,结合仓库内实际的安装脚本、Ansible 部署配置与 CLI 文档,完整讲解如何在一台(或多台)Ubuntu 18.04 服务器上,从克隆源码开始,依次完成环境准备、数据存储选型、镜像构建、Ansible 部署、CLI 配置与首个 action 调用,并深入解读每一步背后的脚本实现,帮助你快速搭建一套可本地运行、可扩展为多机分布式部署的 OpenWhisk 环境。

读完本文,你将掌握:Ubuntu 主机上的依赖安装细节(JDK8、Python、Ansible、Docker)、CouchDB/Cloudant/MongoDB 数据存储的选择与配置方法、./gradlew distDocker 的构建流程、以 ansible-playbook 为核心的单机与多机部署方式,以及通过 wsk CLI 完成 API host 配置与 action 调用的完整链路。

前置条件与部署模式

官方文档明确说明,以下步骤在 Ubuntu 18.04 上验证可用。安装所需软件时,根据系统权限配置,你可能需要 sudo 或 root 权限。

部署存在两种典型模式:

  • 单机/单 VM 模式:所有命令直接在宿主机(host machine)上执行,OpenWhisk 的各组件以 Docker 容器形式运行在同一台机器上。
  • 多 VM 分布式模式:命令需要在与所有 VM 均可达网络连通的一台机器上执行,这台机器称为 bootstrapper(引导机)。它理想情况下是部署在 IaaS(基础设施即服务平台)中的一台 Ubuntu 18.04 VM;如果你的本地机器能够连通 IaaS 中的各 VM,也可以充当 bootstrapper。

注意:无论哪种模式,bootstrapper 机器需要能够通过 SSH 等方式管理所有目标主机,因为后续的 Ansible 部署将以它为中心向各 VM 下发任务。

一、获取源码与安装基础依赖

1.1 克隆 OpenWhisk 源码

如果尚未安装 git,先安装它,然后克隆仓库并进入源码根目录:

# Install git if it is not installed
sudo apt-get install git -y

# Clone openwhisk
git clone https://github.com/apache/openwhisk.git openwhisk

# Change current directory to openwhisk
cd openwhisk

1.2 一键安装依赖脚本

OpenWhisk 在 tools/ubuntu-setup 目录下提供了一组按序执行的安装脚本,all.sh 是总入口。运行:

# 使用 OpenJDK 8 作为默认 Java 环境
(cd tools/ubuntu-setup && ./all.sh)

如果你希望改用 Oracle JDK 8,则传入 oracle 参数:

# 安装全部依赖,同时安装 Oracle JDK 8
(cd tools/ubuntu-setup && ./all.sh oracle)

1.3 脚本内部做了什么:all.sh 的安装流程

从 tools/ubuntu-setup/all.sh 的源码看,all.sh 会依次调用 5 个子脚本,其顺序与职责如下:

顺序脚本职责
1 misc.sh 安装基础软件包(ntp、git、zip、unzip、tzdata、lsb-release、npm),并配置系统时区为 Etc/UTC、重启 ntp 服务
2 pip.sh 安装 python-pip 及 Python 依赖 argcomplete(用于 wskadmin 命令行补全)、couchdb
3 java8.sh 按参数安装 OpenJDK 8 或 Oracle JDK 8
4 ansible.sh 安装并固定 Ansible 2.5.2 及配套的 jinja2、docker、httplib2、requests 版本
5 docker.sh / docker-xenial.sh 按 Ubuntu 版本选择对应 Docker 安装脚本

all.sh 的核心逻辑(节选自 all.sh):

set -e
set -x
JAVA_SOURCE=${1:-"open"}
SOURCE="${BASH_SOURCE[0]}"
SCRIPTDIR="$( dirname "$SOURCE" )"

echo "*** installing basics"
/bin/bash "$SCRIPTDIR/misc.sh"

echo "*** installing python dependences"
/bin/bash "$SCRIPTDIR/pip.sh"

echo "*** installing java"
/bin/bash "$SCRIPTDIR/java8.sh" $JAVA_SOURCE

echo "*** installing ansible"
/bin/bash "$SCRIPTDIR/ansible.sh"

echo "*** installing docker"
u_release="$(lsb_release -rs)"
if [ "${u_release%%.*}" -lt "16" ]; then
/bin/bash "$SCRIPTDIR/docker.sh"
else
echo "— WARNING ————————————————-"
echo "Using EXPERIMENTAL Docker CE script on Xenial or later Ubuntu"
echo "— WARNING ————————————————-"
/bin/bash "$SCRIPTDIR/docker-xenial.sh"
fi

其中 JAVA_SOURCE=${1:-"open"} 正是 ./all.sh oracle 参数传递的入口。注意脚本末尾的注释警告:Docker 安装必须是最后一步——因为脚本内部会重启 docker 服务,若在 Docker 容器内做脚本有效性验证,重启操作可能与宿主的 Docker for Mac 控制实例通信并终止容器,因此之后不要再放置任何步骤。

1.4 关键子脚本细节

java8.sh:默认安装 OpenJDK 8(openjdk-8-jdk);在 Ubuntu trusty 上会先添加 ppa:jonathonf/openjdk PPA。传入 oracle 时则添加 ppa:webupd8team/java,并通过 debconf-set-selections 自动接受 Oracle 许可后安装 oracle-java8-installer。

misc.sh 安装 ntp git zip unzip tzdata lsb-release npm,并将系统时区固定为 Etc/UTC,重启 NTP 服务。时区的一致性对后续查看各系统容器日志很重要——OpenWhisk 系统容器默认时区即为 UTC(参见 ansible/README.md 中关于 docker_timezone 的说明)。

ansible.sh 会固定安装一组与 OpenWhisk 部署兼容的版本:

sudo pip install ansible==2.5.2
sudo pip install jinja2==2.9.6
sudo pip install docker==2.2.1 –ignore-installed –force-reinstall
sudo pip install httplib2==0.9.2 –ignore-installed –force-reinstall
sudo pip install requests==2.10.0 –ignore-installed –force-reinstall

注意:该脚本固定的是较老的 Ansible 2.5.2。仓库根目录的 ansible/README.md 对常规部署给出了更新的版本组合(ansible==4.1.0 与 jinja2==3.0.1),两者都可用于部署,选择时请以你的 OpenWhisk 源码版本对应的文档为准。

pip.sh 安装的 argcomplete 用于给 wskadmin 提供命令行 Tab 补全,bashprofile.sh 展示了如何把这些环境配置写入 ~/.bash_profile:

echo 'export PATH=$HOME/openwhisk/bin:$PATH' > "$HOME/.bash_profile"
echo 'eval "$(register-python-argcomplete wskadmin)"' >> "$HOME/.bash_profile"

二、选择并配置数据存储(Data Store)

构建和部署 OpenWhisk 之前,必须先配置底层数据存储。OpenWhisk 支持自管理的 CouchDB 实例,或云端的 Cloudant 服务;在较新版本中,也支持 MongoDB 作为实体存储后端。详细说明见仓库的 tools/db/README.md。

2.1 使用自管理 CouchDB

如果使用自己安装的 CouchDB,请记录其 host、port、username 与 password,并据此修改 openwhisk/ansible/db_local.ini。如果找不到 db_local.ini,请先按 ansible/README.md 的 Setup 小节 生成它。需要满足两点:

  • 用户名必须具有管理员权限;
  • CouchDB 实例必须可通过 http 或 https 访问(https 需要有效证书)。

2.2 使用临时 CouchDB 容器(仅用于体验)

不想自建 CouchDB 时,可以让部署流程在容器中拉起一个临时 CouchDB。官方建议仅将其作为临时方案,因为:

  • 容器在两次创建之间不会持久化数据;
  • 每次 clean 或 teardown 之后都需要重新执行 ansible-playbook couchdb.yml;
  • 每次都需要重新初始化数据存储(ansible-playbook initdb.yml)。

详细步骤见 ansible/README.md。

2.3 使用 Cloudant

Cloudant 是基于云的数据库服务。可以通过 IBM Cloud 注册账户,并使用 cf 命令行创建实例:

# Create a Cloudant service
cf create-service cloudantNoSQLDB Shared cloudant-for-openwhisk

# Create Cloudant service keys
cf create-service-key cloudant-for-openwhisk openwhisk

# Get Cloudant username and password
cf service-key cloudant-for-openwhisk openwhisk

记录最后一条命令输出的 username 与 password,用于填写 db_local.ini。Cloudant 的固定参数为:

  • 协议始终是 HTTPS;
  • 端口始终是 443;
  • host 形如 <your cloudant user>.cloudant.com。

2.4 初始化数据库(授权密钥)

系统需要特定的授权密钥来安装标准资源(示例 action 等)并为运行测试提供 guest 访问,这些密钥称为 immortal keys:

  • 使用持久化存储(如 Cloudant)时,只需执行一次;
  • 使用临时 CouchDB 容器时,每次 teardown 后重新部署都要执行。

# Work out of your openwhisk directory
cd /your/path/to/openwhisk/ansible

# Initialize data store containing authorization keys
ansible-playbook initdb.yml

该 playbook 会创建所需的数据结构。即使不确定数据库是否已初始化也不必担心——对已准备好的数据库,playbook 不会重复执行任何操作。执行输出大致如下(以 CouchDB 为例):

PLAY [ansible] *****************************************************************

TASK [setup] *******************************************************************
Tuesday 14 June 2016 16:33:51 +0200 (0:00:00.017) 0:00:00.017 **********
ok: [ansible]

TASK [include] *****************************************************************
Tuesday 14 June 2016 16:33:51 +0200 (0:00:00.262) 0:00:00.280 **********
included: /your/path/to/openwhisk/ansible/tasks/initdb.yml for ansible

TASK [check if the immortal subjects db with CouchDB exists?] ******************
Tuesday 14 June 2016 16:33:51 +0200 (0:00:00.060) 0:00:00.340 **********
ok: [ansible]

TASK [create immortal subjects db with CouchDB] ********************************
Tuesday 14 June 2016 16:33:51 +0200 (0:00:00.329) 0:00:00.670 **********
ok: [ansible]

TASK [recreate the "full" index on the "auth" database] ************************
Tuesday 14 June 2016 16:33:52 +0200 (0:00:00.166) 0:00:00.837 **********
ok: [ansible]

TASK [recreate necessary "auth" keys] ******************************************
Tuesday 14 June 2016 16:33:52 +0200 (0:00:00.162) 0:00:01.000 **********
ok: [ansible] => (item=guest)
ok: [ansible] => (item=whisk.system)

PLAY RECAP *********************************************************************
ansible : ok=6 changed=0 unreachable=0 failed=0

可以看到,initdb 会创建 subjects 数据库并写入 guest 与 whisk.system 两个授权密钥,这与 ansible/files/auth.guest 中 guest 账户的密钥相对应。

2.5 数据库备份与 schema 迁移(生产环境建议)

tools/db/README.md 还提供了两个运维工具:

  • replicateDbs.py:基于 CouchDB 复制机制做快照复制与持续复制。标准参数为 –sourceDbUrl 与 –targetDbUrl;replicate 命令支持 –dbPrefix、–expires(按秒清理过期快照)与 –continuous;replay 命令则反向将快照回放到生产库。注意复制是异步的,脚本很快退出,但复制可能持续较长时间。
  • moveCodeToAttachment.py:为降低 controller 内存占用,将内联在 action 文档中的代码迁移为附件(attachments),使 controller 只需拉取 action 元数据而非完整代码。参数为 –dbUrl 与 –dbName。

三、构建:./gradlew distDocker

进入源码根目录后,执行 Gradle 构建命令,生成 OpenWhisk 各组件的 Docker 镜像:

cd <home_openwhisk>
./gradlew distDocker

其中 <home_openwhisk> 即你的 OpenWhisk 源码根目录。distDocker 是仓库 gradle/docker.gradle 定义的核心构建任务,它会为 controller、invoker、scheduler 等核心组件构建并打上 latest 标签的镜像(构建时可通过 -PdockerImageTag=xxx 指定自定义镜像标签,后续 Ansible 用 -e docker_image_tag=xxx 引用)。

常见构建失败与解决办法:如果构建报错 Exception in thread "main" javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty,说明系统 CA 证书信任锚点异常,可执行:

sudo update-ca-certificates -f

再重新构建。

四、部署:基于 Ansible 的 openwhisk.yml 流程

4.1 部署入口

构建完成后,按 ansible/README.md 的说明,在单机或 VM 上完成部署与卸载。部署成功后,你的机器上会运行多个 Docker 容器,可用 docker ps 查看。

4.2 Setup:生成 hosts 与 db_local.ini

所有 Ansible 命令都必须在 ansible 目录下执行,因为 ansible.cfg 提供了通用设置。先设置环境变量:

ENVIRONMENT=local # 或 docker-machine / jenkins / vagrant

local 是默认环境,适用于 Ubuntu 与 Docker for Mac,可省略 -i 参数;较老的 Mac + Docker Machine 部署使用 -i environments/docker-machine。

Step 1 — 生成 hosts 文件(每个开发环境只需执行一次):

ansible-playbook -i environments/$ENVIRONMENT setup.yml

它会基于环境设置生成 hosts 配置(临时 CouchDB 实例的 hosts 文件会在 setup.yml 中自动生成)。默认配置不会运行多个核心组件实例;如需启用高可用(HA)模式,可附加 -e mode=HA,从而部署两个 Kafka 与两个 invoker 等。从 ansible/environments/local/hosts.j2.ini 模板可以看到,HA 模式下 controllers、kafkas、invokers、schedulers 组都会多出一台主机(如 controller1、kafka1、invoker1)。

Step 2 — 配置数据库:修改 ansible/db_local.ini 提供以下属性:

[db_creds]
db_provider=
db_username=
db_password=
db_protocol=
db_host=
db_port=

更方便的做法是用环境变量驱动 playbook 生成 db_local.ini:

export OW_DB=CouchDB
export OW_DB_USERNAME=<your couchdb user>
export OW_DB_PASSWORD=<your couchdb password>
export OW_DB_PROTOCOL=<your couchdb protocol>
export OW_DB_HOST=<your couchdb host>
export OW_DB_PORT=<your couchdb port>

ansible-playbook -i environments/$ENVIRONMENT setup.yml

使用 Cloudant 时的对应写法:

export OW_DB=Cloudant
export OW_DB_USERNAME=<your cloudant user>
export OW_DB_PASSWORD=<your cloudant password>
export OW_DB_PROTOCOL=https
export OW_DB_HOST=<your cloudant user>.cloudant.com
export OW_DB_PORT=443

ansible-playbook -i environments/$ENVIRONMENT setup.yml

小贴士:本地开发时,配置与日志目录默认存放在 /tmp(见 ansible/environments/local/group_vars/all 中 openwhisk_tmp_dir 的逻辑)。Linux 与 Mac 会在重启时清空 /tmp,导致 OpenWhisk 无法再次启动。为避免该问题,请在部署前导出 OPENWHISK_TMP_DIR 指向持久化目录。

Step 3(可选):非本地环境需要安装前置依赖:

ansible-playbook -i environments/$ENVIRONMENT prereq.yml

本地环境的前置依赖已就绪,可跳过。执行时 TASK [prereq : check for pip] 显示失败是正常现象(未装 pip 时会先安装)。

4.3 基于 CouchDB 的完整部署命令序列

cd <openwhisk_home>
./gradlew distDocker
cd ansible
ansible-playbook -i environments/$ENVIRONMENT couchdb.yml
ansible-playbook -i environments/$ENVIRONMENT initdb.yml
ansible-playbook -i environments/$ENVIRONMENT wipe.yml
ansible-playbook -i environments/$ENVIRONMENT openwhisk.yml

# installs a catalog of public packages and actions
ansible-playbook -i environments/$ENVIRONMENT postdeploy.yml

# to use the API gateway
ansible-playbook -i environments/$ENVIRONMENT apigateway.yml
ansible-playbook -i environments/$ENVIRONMENT routemgmt.yml

各 playbook 要点:

  • couchdb.yml:部署 CouchDB(临时容器方案时每次 clean/teardown 后都要重跑);
  • initdb.yml:每次全新部署 CouchDB 时都要运行,用于初始化 subjects 数据库(已初始化过则自动跳过);
  • wipe.yml:仅应在全新部署时运行,否则会丢失已有 action 与 activation 数据;
  • postdeploy.yml:部署后安装公共包(catalog)与示例 action;
  • apigateway.yml / routemgmt.yml:启用 API 网关与路由管理;
  • 若只是重启操作系统后恢复服务,直接运行 ansible-playbook -i environments/$ENVIRONMENT openwhisk.yml 即可,不会清空数据存储。

限制说明:单台机器上无法运行多个 CouchDB 节点——CouchDB 依赖 Erlang EPMD 发现其他节点,多节点应分别部署在不同机器上,否则端口会冲突。

4.4 基于 Cloudant 的部署命令序列

cd <openwhisk_home>
./gradlew distDocker
cd ansible
ansible-playbook -i environments/$ENVIRONMENT initdb.yml
ansible-playbook -i environments/$ENVIRONMENT wipe.yml
ansible-playbook -i environments/$ENVIRONMENT apigateway.yml
ansible-playbook -i environments/$ENVIRONMENT openwhisk.yml

# installs a catalog of public packages and actions
ansible-playbook -i environments/$ENVIRONMENT postdeploy.yml

# to use the API gateway
ansible-playbook -i environments/$ENVIRONMENT apigateway.yml
ansible-playbook -i environments/$ENVIRONMENT routemgmt.yml

与 CouchDB 序列的关键差异:initdb 每个 Cloudant 数据库只需运行一次,且 initdb.yml 只初始化未初始化的库,其余规则与上一节一致。

4.5 基于 MongoDB 的部署命令序列

较新版本支持以 MongoDB 替代 CouchDB 存储实体。先部署 MongoDB 服务(仅测试开发用,生产建议使用外部 MongoDB 服务器;需先 pip install pymongo):

ansible-playbook -i environments/<environment> mongodb.yml -e mongodb_data_volume="/tmp/mongo-data"

然后执行:

cd <openwhisk_home>
./gradlew distDocker
cd ansible
ansible-playbook -i environments/<environment> initMongodb.yml -e mongodb_connect_string="mongodb://172.17.0.1:27017"
ansible-playbook -i environments/<environment> apigateway.yml -e mongodb_connect_string="mongodb://172.17.0.1:27017"
ansible-playbook -i environments/<environment> openwhisk.yml -e mongodb_connect_string="mongodb://172.17.0.1:27017" -e db_artifact_backend="MongoDB"

# installs a catalog of public packages and actions
ansible-playbook -i environments/<environment> postdeploy.yml

# to use the API gateway
ansible-playbook -i environments/<environment> apigateway.yml
ansible-playbook -i environments/<environment> routemgmt.yml

可用的 MongoDB 参数为:

mongodb:
connect_string: "{{ mongodb_connect_string }}"
database: "{{ mongodb_database | default('whisks') }}"
data_volume: "{{ mongodb_data_volume | default('mongo-data') }}"

4.6 使用 ElasticSearch 存储 activations

你可以用 ElasticSearch(ES)单独存储 activation 记录,其余实体仍存于 CouchDB。仓库提供 elasticsearch.yml 用于搭建测试/开发用的简单 ES 集群。自定义 ES 参数示例:

elastic_protocol="http"
elastic_index_pattern="openwhisk-%s" // 会与 namespace 名组合,不同 namespace 使用不同 index
elastic_base_volume="esdata" // 存放 ES 数据的 docker volume 名称
elastic_cluster_name="openwhisk"
elastic_java_opts="-Xms1g -Xmx1g"
elastic_loglevel="INFO"
elastic_username="admin"
elastic_password="admin"
elasticsearch_connect_string="x.x.x.x:9200,y.y.y.y:9200" // 若使用外部 ES 集群则填写

部署序列:

cd <openwhisk_home>
./gradlew distDocker
cd ansible
# couchdb 仍然用于存储 subjects 与 actions
ansible-playbook -i environments/$ENVIRONMENT couchdb.yml
ansible-playbook -i environments/$ENVIRONMENT initdb.yml
ansible-playbook -i environments/$ENVIRONMENT wipe.yml
# 部署一个简单的 ES 集群,使用外部 ES 集群时可跳过
ansible-playbook -i environments/$ENVIRONMENT elasticsearch.yml
ansible-playbook -i environments/$ENVIRONMENT openwhisk.yml -e db_activation_backend=ElasticSearch

# installs a catalog of public packages and actions
ansible-playbook -i environments/$ENVIRONMENT postdeploy.yml

# to use the API gateway
ansible-playbook -i environments/$ENVIRONMENT apigateway.yml
ansible-playbook -i environments/$ENVIRONMENT routemgmt.yml

4.7 单组件热替换、清理与卸载

  • 热替换单个组件:例如重新构建 invoker 镜像后只重部署 invoker:

    cd <openwhisk_home>
    ./gradlew :core:invoker:distDocker -PdockerImageTag=myNewInvoker

    cd ansible
    ansible-playbook -i environments/$ENVIRONMENT invoker.yml -e docker_image_tag=myNewInvoker

    省略镜像标签参数时默认使用 latest。若只清理 controller:

    cd ansible
    ansible-playbook -i environments/$ENVIRONMENT controller.yml -e mode=clean

    注意:在分布式环境中,某些组件(如 invoker)存在于多台机器上,运行其 playbook 会在该组件 playbook 指向的所有主机上执行。

  • 清理整个部署:

    ansible-playbook -i environments/$ENVIRONMENT openwhisk.yml -e mode=clean

  • 移除目标环境的所有前置依赖(通常不必要):

    ansible-playbook -i environments/$ENVIRONMENT prereq.yml -e mode=clean

  • 精简模式(Lean):不部署 Kafka、Zookeeper 及独立 invoker 时,把 openwhisk.yml 替换为:

    ansible-playbook -i environments/$ENVIRONMENT openwhisk.yml -e lean=true

4.8 部署后的系统限制(limits)

系统默认的节流(throttling)限制配置在 ansible/group_vars/all 中,可按环境覆盖:

limits:
invocationsPerMinute: "{{ limit_invocations_per_minute | default(60) }}"
concurrentInvocations: "{{ limit_invocations_concurrent | default(30) }}"
firesPerMinute: "{{ limit_fires_per_minute | default(60) }}"
sequenceMaxLength: "{{ limit_sequence_max_length | default(50) }}"

含义分别为:每个 namespace 每分钟允许的 action 调用次数、允许的最大并发调用数、每分钟允许的 trigger 触发次数、sequence action 的最大长度。

4.9 常见故障排查

  • setuptools 版本不匹配:出现 ERROR! Unexpected Exception: … Requirement.parse('setuptools>=11.3')) 时升级 setuptools:

    pip install –upgrade setuptools –user python

  • 路径含空格:Ansible 2.1.0.0 及更早版本不支持路径中的空格,报错 fatal: [ansible]: FAILED! => {"failed": true, "msg": "need more than 1 value to unpack"} 时,请把源码树放到不含空格的路径下。

  • 容器时区:所有系统容器默认时区为 UTC,可通过 ansible/group_vars/all 全局配置,或运行 playbook 时附加 -e docker_timezone=xxx 覆盖。

五、配置 wsk CLI 并验证部署

5.1 配置 API host 与授权密钥

部署完成后,OpenWhisk CLI(wsk)位于 openwhisk/bin/ 下(其他平台的可执行文件在 bin/mac/、bin/linux/、bin/windows/)。配置 CLI 需要两个属性:API host 与授权密钥。API host 可从部署生成的 whisk.properties 的 edge.host 属性获取;本地部署时,它通常是 172.17.0.1,即 ansible/environments/local/hosts.j2.ini 中 [edge] 组的 IP(对应 docker0 网桥地址,docs/cli.md 亦明确 API host 应为 edge host 的 IP)。

# 从 openwhisk 目录运行,设置 API host
./bin/wsk property set –apihost <openwhisk_baseurl>

# 本地部署带自签名 SSL 证书时,可附加 –insecure 跳过证书校验

# 配置 guest 账户授权密钥
./bin/wsk property set –auth `cat ansible/files/auth.guest`

CLI 属性默认保存在 ~/.wskprops,可用环境变量 WSK_CONFIG_FILE 改变其位置。.wskprops 中的关键键为 APIHOST(API host)与 AUTH(授权密钥)。可选键还包括 APIGW_ACCESS_TOKEN(独立托管的 API Gateway 服务的授权令牌)与 APIGW_TENANT_ID(API 端点归属的租户标识)。

提示:命令行补全需要 bash 4.1 及以上版本,docs/cli.md 对 Mac 用户给出了 brew install bash 的升级建议。

5.2 调用第一个 action 验证全链路

配置完成后,调用内置的 echo action 验证整条部署链路:

bin/wsk action invoke /whisk.system/utils/echo -p message hello –result
{
"message": "hello"
}

该命令向 /whisk.system/utils/echo 发送带参数 message=hello 的调用请求,–result 表示只输出 action 的返回结果。能正常得到 {"message": "hello"},即说明:源码构建成功、镜像已部署、controller 与 invoker 正常协作、action 执行链路(通过 Kafka 消息队列分发到容器池)完全打通。更多 CLI 用法可参考 docs/cli.md 与 docs/samples.md。

六、从单机到多机分布式部署的要点

本文的安装命令默认面向单机/单 VM 部署;若要做多 VM 分布式部署:

  • 在 bootstrapper(建议是 IaaS 中的 Ubuntu 18.04 VM)上执行 tools/ubuntu-setup 的全部安装脚本;
  • 通过 setup.yml 生成面向多机的 hosts 清单(对应 ansible/environments 下的各环境模板,如 docker-machine、jenkins、vagrant,结构可参考 ansible/environments/local/hosts.j2.ini);
  • 在 group_vars 中按目标环境覆盖 db 凭据、limits、时区等参数;
  • 各组件 playbook 会按 hosts 分组把 controller、invoker、kafka、zookeeper 等分别部署到对应机器。
  • 组件角色的划分与部署细节可继续阅读 ansible/README.md、docs/deploy.md 以及 docs/modules.md,其中 docs/modules.md 从架构层面说明了各模块(controller、invoker、scheduler 等)的职责与相互协作关系。

    赞

    分享

    • 云原生
    • 后端
    • 微服务

    【免费下载链接】openwhisk

    Apache OpenWhisk is an open source serverless cloud platform

    项目地址:
    https://gitcode.com/gh_mirrors/op/openwhisk

    点击查看 免费下载

    上一篇:
    终极指南:如何用import_3dm插件实现Rhino到Blender的无缝数据转换

    下一篇:
    鸣潮游戏智能自动化工具完整使用指南:从零开始实现后台自动战斗

    创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 在 Ubuntu 服务器上从源码构建与部署 Apache OpenWhisk 实战指南
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!