折腾Openwhisk - 本地ubuntu部署openwhis

作者: cheneydc | 来源:发表于2017-08-06 22:41 被阅读281次

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

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

    相关文章

      网友评论

        本文标题:折腾Openwhisk - 本地ubuntu部署openwhis

        本文链接:https://www.haomeiwen.com/subject/zcunlxtx.html