OpenWhisk是开源的Serverless平台,Github上的地址,虽然Github上有着部署的相关文档,但还是遇到了不少的问题,将安装过程及问题记录如下。
首先是将项目Clone到本地,进入OpenWhisk目录下
# 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
安装JDK8
(这里比较推荐自己安装并部署好环境变量,便于管理,JDK的安装部署网上有很多教程就不贴出来了)
在 /openwhisk路径下执行以下命令安装 Open JDK8
# Install all required software
(cd tools/ubuntu-setup && ./all.sh)
执行以下命令安装 Oracle JDK 8
# Install all required software
(cd tools/ubuntu-setup && ./all.sh oracle)
这里需要注意到一点是,这个命令不仅是安装JDK,其他需要的一些需要的软件它也会部署。
根据我的经历,这里它会默认安装python2和python3,并且默认的python环境是python2,当默认是python2时运行部署命令会出现下面的问题,可以用https://stackoverflow.com/questions/69502341/error-you-are-using-pip-version-8-1-1-however-version-21-2-4-is-available-you的解决方案去解决
更新:这里还是修改下python的默认为python3
root@amax7:/usr/local/bin# vi ~/.bashrc
root@amax7:/usr/local/bin# source ~/.bashrc
这里再运行python --version命令可以看到已经变为python3的版本了
(或者采用该博客的方法)
Build
cd <home_openwhisk>
./gradlew distDocker
再运行这行命令后首先遇到了下图的问题,显示我fetch不到一个压缩包,实际上我是可以直接打开的,在issue也有人遇到了相关的情况,包括一些博客也有提到,是Docker镜像的问题,但是我在服务器搭了梯子再运行上述命令还是失败了
解决方法主要参考这篇博客,通过更换Docker源的问题初步解决
有一点小插曲是,找不到到底是哪个Dockerfile出现了相应的命令,参考这篇文章解决了。
继续运行部署命令,遇到了如下的问题,在查询了诸多解决方法无果后重启服务器解决了,reboot大法好
CouchDB部署
CouchDB的部署主要参考了这篇文章
根据github的教程,通过dblocal.ini会配置以下的变量值
[db_creds]
db_provider=
db_username=
db_password=
db_protocol=
db_host=
db_port=
我在这里遇到的问题是我没有dblocal.ini这个文件,所以无法配置,根据文章的教程,可以先创建一个.sh文件,如下
mkdir /home/logconf 这里可以选择其他的文件,用于保存log,由于配置和日志默认保存路径为/tmp,机器重启时会被清空
vim wsk_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=172.17.0.1
export OW_DB_PORT=5984 这个端口最好不选 443,openwsk 最后启动的 nginx 占用 443,避免冲突
export OPENWHISK_TMP_DIR=/home/logconf
之后,开始进行ansible安装
source openwsk_env.sh
cd ansible
ansible-playbook -i environments/local setup.yml
执行完后再打开/openwhisk/ansible/dblocal.ini如下所示
(补充一下,wsk_env.sh
的OW_DB_HOST
的值最好改为172.17.0.1
,其他不变)
根据参考的文章,CouchDB配置部分就到此结束了,但是我在后面的部署中CouchDB还是遇到了一些问题,留待更新验证。
更新
当我再次运行,./gradlew distDocker 命令时遇到了如下的问题,检查发现是9100端口号被占用,用了这篇文章的解决方案,这里就不再赘述了
接着切换到ansible路径下依次运行如下命令(参照github)
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
但是再运行到openwhisk.yml时始终运行不成功,如下所示,Openwhisk Issue#4303 #4485
等issue均有提到,但是在尝试了多种方法后仍未解决。
后续是,重新部署了一遍Openwhisk,怀疑是ansible的安装出了问题,在之前的cd tools/ubuntu-setup && ./all.sh
后单独执行了相应文件夹下的ansible.sh
,得到了解决。
(从经历的很多次失败来说,ansible总会出现问题,导致我后面每次出错第一时间就会想重新执行ansible.sh)
接下来在所有的上述命令执行完后,执行docker ps
查看当前容器运行状态
参考阿里的一篇文章配置wsk的全局路径并进行测试
vim ~/.bashrc //配置环境变量
export PATH=$PATH:/home/amax11/openwhisk/bin //填自己的openwhisk bin路径
source ~/.bashrc //source下使文件生效
OpenWhisk 提供了一个统一的命令行接口 wsk。生成的 wsk 在 openwhisk/bin 下。其有两个属性需要配置。
API host 用于部署 OpenWhisk 的主机名或 IP 地址的 API。
Authorization key(用户名或密码)用来授权操作 OpenWhisk 的 API。
设置 API host,在单机配置中的 IP 应该为 172.17.0.1。
./bin/wsk property set --apihost '172.17.0.1'
./bin/wsk property set --auth `cat ansible/files/auth.guest`
创建测试文件sudo nano hello.js
/**
* Hello world as an OpenWhisk action.
*/
function main(params) {
var name = params.name || 'World';
return {payload: 'Hello, ' + name + '!'};
}
接着create action
wsk action create hello hello.js
查看输出结果
wsk action invoke hello --result
这里我遇到了一个问题,报错大概是这样
x509: cannot validate certificate for x.x.x.x because it doesn’t contain any IP SANs
查了资料发现只用将wsk XXX
改为wsk -i XXX
就恢复了正常。或者按照github上的问题链接进行修改
到此为止,部署测试部分就算结束了
一些问题记录
ansible相关的问题
当在命令行运行ansible
时有如下提示时:
The program 'ansible' is currently not installed. You can install it by typing:
apt install ansible
根据github教程
当运行ansible-playbook -i XXXXXX
相关的命令时出现如下错误时
Traceback (most recent call last):
File "/usr/lib/command-not-found", line 27, in <module>
from CommandNotFound.util import crash_guard
ModuleNotFoundError: No module named 'CommandNotFound'
参考博客
解决
执行 ./gradlew distDocker
时出现下面的错误
java.io.IOException: Cannot run program "node": error=2, No such file or director
通过执行apt install npm
解决
由于用的服务器重装了系统,分配了权限,可能会出现XXXPermission deniedXXX
之类的问题,加上sudo
执行。
版本问题
在执行all.sh
或者ansible.sh
时,很容易出现失败的现象,我将我的一部分库版本贴出
如果是出现
[ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/usr/local/lib/python3.8/dist packages/markupsafe/__init__.py)]
由于 markupsafe 弃用警告:“soft_unicode”已重命名为“soft_str”.旧名称将在 MarkupSafe 2.1 中删除.只能安装2.1下版本,比如pip install markupsafe==2.0.1
或者重装markupsafe,或者是setuptools,细节部分有些遗忘,直接用pip install xx=xx.xx.xx
更新即可,也可以用pip uninstall
后再次重装,如果出现卸载问题记得加上sudo,比如我就遇到了launchpadlib 1.10.13 requires testresources, which is not installed.
时,卸载不掉launchpadlib的情况。
其他的版本出现问题时一般有提示,也直接用pip install xx=xx.xx.xx
更新即可,具体的版本信息可以用上图做一定参考。
当运行 ansible-playbook -i setup.yml
时我遇到了
The conditional check 'nginx.ssl.cert == "openwhisk-server-cert.pem"'
failed. The error was: error while evaluating conditional (nginx.ssl.cert ==
"openwhisk-server-cert.pem"): 'ansible_distribution' is undefined The error
appears to have been in '/home/travis/build/odidev/openwhisk/ansible/setup.yml':
line 61, column 5, but may be elsewhere in the file depending on the exact
syntax problem. The offending line appears to be: # Generate nginx
certificates - name: gen untrusted server certificate for host ^ here
一般是ansible版本问题,参照上图更新即可