zoukankan      html  css  js  c++  java
  • 在openfaas面板上安装onemanager

    本文关键字:openfaas onemanager

    在前面《在云主机上手动安装腾讯PAI面板》《利用openfaas faasd在你的云主机上部署function serverless面板》中,我们介绍了二种虚拟主机/容器后端,它们都可以搭配nginx作为前端,形成webstack,和通用服务器应用栈,而且都支持多语言,支持devops部署。其中,前者用git作devops,后者用容器(faasd中用containerd),后者的devops更全面:要知道,现在的devops构建基本是用docker完成的,无容器不devops。况且,openfaas是对我《最小编程学习集与开发栈选型:1,语言选型与开发融合,2,云系统,云服务器,虚拟boot,语言运行时和应用容器,及平台融合,3,云APPSTACK云调试云DEVOPS及开发融合》中的2,3的整个暂代实现(替代目前还无法做到的统一语言,统一内核),它与我的cloverboot+黑群晖黑苹果等cloud os,组成了一个暂代可用的minstackos:一个企图将包括上面1,2,3的最小开发栈实现做入boot的方案。

    其实老早就接确过docker和k8s,swarm这种容器管理面板,但是一直没怎么深入使用(有这功夫为何不研究coreos?),一是对docker aufs不放心(二是docker本身虽然利用了内核功能,但是本体属于在应用级用虚拟化重新构建网络和文件系统,带来较高负担和延时),二是swarm,k8s这种比较重,直到接确云函数,再到这里的轻量级faasd,才发现基于容器的面板也可以很轻量(当然,pure k8s和云函化的容器面板还是有点不一样的)。二是云函数本身就关注用它运行功能,而不用涉及到存放数据,因此docker aufs这种可能导致文件系统污染的缺陷也就不足于当回事了。最后这种容器用于生产环境的缺陷慢慢也正在基本被彻底修复。

    faasd用的是containerd,但使用docker构建应用,注意这里的docker-ce只是离线构建openfaas/faasd用的docker镜像之用,并不会加大faasd的运行时,这里提到openfaasd用docker image as app meta(dockfile vs pai.yml),没错,openfaas用docker作devops。所以可以封装构建流程。而不仅仅像pai面板那样停留于用git拉取。

    下面,接上文《利用openfaas faasd在你的云主机上部署function serverless面板》,我们将onemanager移过来。----- 为什么不是fodi,fodi毕竟没有url,不利于运营。

    好了,不费话。

    调试与基础

    调试,前调试后调试,都是运维开发的必要过程,甚至是主要过程。因为它是搞清问题的必要实验过程。

    在faasd所在主机上apt-get install docker-ce,我在faasd所在主机是一台装上了deepin20a的云主机,因为这样结合teamviewer可以远程桌面(linux上远程桌面大部分都是位图截取算法的不要用。tv效率高,支持本地远程剪贴板交互,而且tv还有一个图形scp功能。deepin+1h2g开2g swap完全可以驾驭,开机只占1G内存)可以长时间保持在线,而不必总是用本地的ssh(十分易断),

    还有,faasd构建应用涉及到大量与docker.io的交互,这个在国内云主机网络环境下速度是很弱的,虽然有一些方案支持自建docker registry给faasd用,但是太折腾,不如在云主机上装v工具,然后命令行下export http/https_proxy。而且,dokcer-cli是支持应用级proxy的,

    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf
    编辑http-proxy.conf
    [Service]
    Environment="HTTP_PROXY=http://127.0.0.1:8888/"
    然后重启服务:
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    测试是否设置成功:
    systemctl show --property=Environment docker
    

    然后是登录docker login (registry name,对于官方dockerhub这里可省),按提示输入用户名和密码。

    当然市面上也有很多基于docker的免费或商用docker devops,如果上一步你选择了阿里开发中心的这些私有库,需要修改~/.docker/config.json到 /var/lib/faasd/.docker/config.json供接下来使用。

    解决这二个问题后。基本可以往下了:mkdir test && cd test && faas-cli new onemanagerforopenfaas --lang dockerfile

    vi ./onemanagerforopenfaas.yml 在image路径前加上你的dockerhub用户名,或者把它改成完整地址(带registry。比如国内的阿里云docker仓库,记住版本最好要写上,不能用latest???)注意官方dockerpush支持private镜像,但是pull时会提示denied,所以不要把这个镜像设为private。(如果你使用官方dockerhub,且是private仓库,那么也需要~/.docker/config.json到 /var/lib/faasd/.docker/config.json,否则接下来通过faas-cli调用docker pull的时候会提示认证失败,push没问题,默认gateway127.0.0.1:8080需要一次faas-cli login --password xxx,自定义gateway的方法:dockerfile中gateway改且faas-cli login --password xxx --gateway配合改)

    上面我们不用带语言的--lang php7(它是php72),是因为:虽然--lang dockerfile和--lang php7都会拉取一大堆template,但后者文件夹混乱。涉及到的修改需要在templates里进行,而前者涉及到的所有改动仅发生在一个文件夹,即生成的onemanagerforopenfaas这里。我们只需从template里复制一些关于php72的脚手架文件即可(index.php和functions文件夹)。不必修改template(也不要删掉,如果调用faas-cli xx -f ./xx.yml,它会再次自动下载)。

    但我们这里不复制index.php和functions,把onemanager复制到生成的onemanagerforopenfaas根目录下,我这样做是为了不涉及太多的文件夹结构,也方便接下来的onemanager source(我使用的om版本依然是20200607-1856.19),因为它本身并没有使用类似如下的文件夹结构:

    然后,对应修改onemanagerforopenfaas下的dockerfile(如果使用--lang php7要到template/php7下修改,十分混乱):

    # Import function
    WORKDIR /home/app
    COPY ./ ./
    WORKDIR /home/app
    

    dockerfile中有一处composer install由于被q也很费时。可修改dockerfile,禁掉composer install行,因为onemanager在vender中自带依赖,如果不禁掉,我们也可以在composer.json中自己手工添加下面chunks以提速(其实你也可以删掉composer.json,因为我们并没有使用到它):

    "repositories": {
        "packagist": {
            "type": "composer",
            "url": "https://packagist.phpcomposer.com"
        }
    }
    

    这样调试环境就建好了。调试过程就是修改源码(当然放在第二节中讲,这里是最主要的调试工作,这里仅关注流程),然后sudo faas-cli build -f ./onemanagerforopenfaas.yml && sudo faas-cli push -f ./onemanagerforopenfaas.yml && sudo faas-cli deploy -f ./onemanagerforopenfaas.yml。

    下面仅给出结果,不给出具体的调试过程,但是要知道下面得出的结果是这里的不断调试过程得到的,所以这里的流程必不可少。输出信息你可以在源码index.php中写echo,可以观察8080 invoke按钮出来的信息,或网页直接展示。也可以journalctl查看。

    源码修改:

    faas的那个web环境类似虚拟主机空间,所以主文件index.php中(这也是程序的入口),我们去掉for tencent的main_handler和for aliyun的handler,直接:

    <?php
    
    error_reporting(E_ALL & ~E_NOTICE);
    
    include 'vendor/autoload.php';
    include 'conststr.php';
    include 'common.php';
    include 'parsedown.php';
    
    
    include 'platform/Normal.php';
    $path = getpath();
    $_GET = getGET();
    
    $re = main($path);
    $sendHeaders = array();
    foreach ($re['headers'] as $headerName => $headerVal) {
            header($headerName . ': ' . $headerVal, true);
    }
    http_response_code($re['statusCode']);
    echo $re['body'];
    

    大部分需要调试的地方跟《利用onemanager配合公有云做站和nas(2):在tcb上装om并使它变身实用做站版》一文一样,属于环境参数和path获取不到。

    platform/normal.php中:

    function getpath()
    {
        $_SERVER['firstacceptlanguage'] = strtolower(splitfirst(splitfirst($_SERVER['HTTP_ACCEPT_LANGUAGE'],';')[0],',')[0]);
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
        $_SERVER['base_path'] = path_format(substr($_SERVER['SCRIPT_NAME'], 0, -10) . '/');
        $p = strpos($_SERVER["Http_Path"],'?');
        if ($p>0) $path = substr($_SERVER["Http_Path"], 0, $p);
        else $path = $_SERVER["Http_Path"];
        $path = path_format( substr($path, strlen($_SERVER['base_path'])) );
        return substr($path, 1);
        //    return spurlencode($path, '/');
                 
    }
    

    以上注意到,faas使用的php-cli index.php唤起的服务。php72的$_SERVER数组中,并没有request_uri,但是完全可以用base_path代替。否则index.php中获取到的$path永远为空。这是由不同的web环境导致的问题。

    另外一个需要修改的地方:

    function getConfig($str, $disktag = '')
    {
        global $InnerEnv;
        global $Base64Env;
        //include 'config.php';
        //$s = file_get_contents('config.php');
        $configs = ''
        ......
    }
    

    以上,我们把原本存在于config.php中的'{}'放到上面代替'',因为正常逻辑下程序不能获取到config.php,我们需要手动用《利用onemanager配合公有云做站和nas(2):在tcb上装om并使它变身实用做站版》获到的envVariables并把参数给它。这样getConfig('timezone')这样的调用才能发挥作用。具体为什么获取不到config.php。。我也没有深入调试。应该也是openfaas所属特殊web环境导致的问题。

    你可能还需要禁掉getGET()中的这段:

    if (!ConfigWriteable()) {
                $html .= getconstStr('MakesuerWriteable');
                $title = 'Error';
                return message($html, $title, 201);
            }
    

    还有common.php中一些涉及到html输出的也给禁掉,以适应特殊的openfaas web环境。


    突然想把git和docker弄成netdisk backend的静态仓库,不用做到git pull能git clone就好,因为它们的原理上,也是用curl来下载的。

    发现一个v使用终端代理命令只在当前窗口生效的问题,如果执行./xx.sh是不能生效的此时开全局也无用,方法是要把该命令也写一次到./xx.sh中。

    还有panel.sh缺少多租户环境的功能,对于openfaas是linkerd,我们知道,pai这种也是不支持多租户的,一次只能一个应用。多租对于个人用户也是有用的,那就是可以为每一个函数指定一个子域名并代理出去,目前openfaas使用/function/应用名的形式,可以寻求直接在主域上展示的方法。

    还有那个顽固的dail tcp failed faasd-provider问题,日后也需要寻求解决


    (此处不设回复,扫码到微信参与留言,或直接点击到原文)

  • 相关阅读:
    页面 笔记
    快速统计一个数二进制中1的个数
    [JAVA] String 拼接效率
    [JAVA] String常用方法
    [letcode] 832 Flipping an Image
    [java]冒泡排序
    SharedPreferences
    归并排序
    安全退出调用多个Activity的Application
    Activity生命周期
  • 原文地址:https://www.cnblogs.com/minlearn/p/13771573.html
Copyright © 2011-2022 走看看