使用 OpenFaaS 的无服务器 DevOps 简介

使用 OpenFaaS 的无服务器 DevOps 简介

原文:https://medium.com/hackernoon/an-introduction-to-serverless-devops-with-openfaas-b978ab0eb2b

DevOps 不仅仅是做 CI/CD。但是 CI/CD 管道在 DevOps 中有着重要的作用。最近我一直在 OpenFaaS 上投入时间,当我开始创建多个功能时,我想要一个易于使用和可访问的开发和交付流程,换句话说,一个 CI/CD 管道。

一天,当我与 Alex(OpenFaaS 的创造者)交谈时,他让我整理一份关于 open FAAS 的 CI/CD 的指南(使用 Github 和 Travis CI)。对我来说,这是一个完美的时机,因为我实际上正在考虑如何将我与其他项目一起应用的 CI/CD 管道集成到 OpenFaaS 无服务器管道中。下图显示了我得出的结论:

OpenFaaS CI/CD Pipeline

高层次的概述如下:

  • 推送至 GitHub
  • 流水线启动 构建函数映像 创建临时群环境 运行函数测试 如果测试通过则向注册表发布映像 如果测试通过则部署函数
  • 管道末端

对于那些想一头扎进去的人来说,资源库发布在这里。您可以在.travis.yml文件中查看管道的阶段和命令。

我从这里开始一步一步解释上下文。

在 Travis CI 构建中使用 Docker 和 Swarm

好吧,我不打算进入“如何使用特拉维斯 CI”的细节。有很多很好的文章解释这一点,官方文件也组织得很好。在我的用例中使用 Travis 的要点是:

  • 我们将使用 Docker 和 Swarm
  • 我们将使用 Node.js 进行测试

文档中所述,我们需要包括:

sudo: required

services:
  - docker

为了在构建中使用 docker。此外,我们希望能够使用docker-compose version 3.2来部署我们的 OpenFaaS 堆栈,但这在 Travis 的默认 docker 版本中是不可能的。同样,正如文档所说,你需要写:

before_install:
  - sudo apt-get update
  - sudo apt-get -y -o Dpkg::Options::="--force-confnew" install docker-ce

为了安装 docker 的新版本。如果你错过了这一部分,你会看到

unsupported Compose file version: 3.2

像这样的事情会失败的。

用 Swarm 创建临时测试环境

Open FaaS Temporary Testing Environment

如上图所示,我们需要一个 OpenFaaS 环境来全面测试功能(e2e 测试)。创建一个 Swarm 环境很容易,但是准备一个 OpenFaaS 环境需要一点调整才能正常工作。

为了准备我们的测试环境,我们需要:

  • 获取 OpenFaaS CLI 工具( faas-cli )
  • 初始化群集
  • 部署网关和功能

获取 OpenFaaS CLI 工具: OpenFaaS CLI 工具( faas-cli )使得使用 open FAAS 变得很容易,我们肯定会在管道中需要它。它就像调用这个命令一样简单:

curl -sSL [https://cli.openfaas.com](https://cli.openfaas.com) | sudo sh

初始化蜂群: 这是直截了当的。只需调用命令:

docker swarm init

部署网关和功能: 好了,这是比较棘手的部分。通常,部署 OpenFaaS 是非常容易的。我是真心的。如果你还没有,你一定要看看亚历克斯的“ FaaS 与愤怒——在 60 秒内从 0 到无服务器,在任何地方”。但是为 CI/CD 管道部署它会增加一些您通常不需要的顾虑。在测试运行之前,环境需要准备好。这意味着群服务需要准备好。为此,我编写了一个简单的 shell 脚本函数:

# This function checks if the service is in Running state
check_service_is_running() {
    local SERVICE_NAME=$1
    local STATE=$(docker service ps --format '{{json .CurrentState}}' $SERVICE_NAME)
    if [[ $STATE = \"Running* ]]; then
      echo 1
    else
      echo 0
    fi
}

它使用docker service ps来检查服务的状态。如果是Running,则返回1,否则返回0。除了这个功能,我们需要重试,直到服务准备好,所以我也添加了一个重试功能(它在内部调用check_service_is_running):

# This function waits for the service to become available.
# Retries for 10 times and 3 second interval (hard coded for now)
wait_for_service_to_start() {
    local n=1
    local max=10
    local delay=3local SERVICE_NAME=$1
    local SERVICE_IS_RUNNING=0
    while [  "$SERVICE_IS_RUNNING" -eq 0 ]; do
      if [[ $n -gt $max ]]; then
        echo "ERROR: Retried $(($n-1)) times but $SERVICE_NAME didn't start. Exiting" >&2
        exit 1
      fi
      SERVICE_IS_RUNNING=$(check_service_is_running $SERVICE_NAME)
      echo "Waiting for $SERVICE_NAME to start"
      n=$[$n+1]
      sleep $delay
    done
    echo "$SERVICE_NAME is Running"
}

现在,我们可以确保网关和功能按预期运行,我们可以使用以下命令设置环境:

# deploy the stack to swarm
./deploy_stack.sh# build the functions (assuming 4 cores)
faas-cli build --parallel 4 -f stack.yml# we can't deploy unless the gateway is ready so wait
wait_for_service_to_start func_gateway
# and then deploy
faas-cli deploy -f stack.yml# wait for functions to become ready for testing
wait_for_service_to_start echo

deploy_stack.sh只是简单地呼叫:

docker stack deploy func --compose-file docker-compose.yml

并在 Swarm 内部部署堆栈。我想在本地机器上重用这个 shell,因此它在一个外部文件中。faas-cli build创建功能映像,faas-cli deploy通过网关部署功能。通过这个调整,我们可以确保一个完全工作的 OpenFaaS 环境(您可以在 ci-setup.sh 文件中查看完整的脚本)。

测试功能

现在我们有了一个测试环境,针对它的测试非常简单。您可以选择自己喜欢的任何框架,但是对于本文,我选择了 Node.js 和 chakram 库。以下测试是对echo功能的示例测试。只是检查响应是否是我发送的文本:

const chakram = require('chakram');
const expect = chakram.expect;const ENDPOINT = "[http://localhost:8080/function/echo](http://localhost:8080/function/echo)";describe("FaaS echo function", () => {
    it("should respond with the data you passed", () => {
        // Arrange
        const expected = "echo test";// Act
        return chakram.post(ENDPOINT, expected, {json: false})
            .then(response => {
                // Assert
                expect(response).to.have.status(200);
                expect(response.body).to.contain(expected);
            });
    });
});

为了使用 Node.js 和缓存库,不要忘记在.travis.yml中添加以下几行:

language: node_js
node_js:
  - "8"cache: yarn

清理虫群

这可能是不必要的,但我喜欢对称,所以我决定清理群体环境:

docker swarm leave -f

发布和部署

在测试按预期通过之后,我们希望发布功能映像,并将它们部署到其他环境中(开发、阶段、生产等)。这很简单,travis ci 文档中也有记载:

after_success:
  - if [ "$TRAVIS_BRANCH" == "master" ]; then
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD";
    faas-cli push -f echo.yml
    fi

这意味着只有当测试成功并且在主分支上时,图像才会被推送。faas-cli push将函数推送到注册表。另一个有趣的部分是$DOCKER_USERNAME$DOCKER_PASSWORD环境变量。您可以通过 travis ci 管理控制台设置这些凭据。

travis ci dashboard

从设置中,您可以设置环境变量:

Setting Environment Variables

因此,你不必在.travis.yml里暴露你的身份。虽然上面的命令没有部署到任何环境中,但这只是触发一些 deploy webhook(或类似的东西)的问题。因此,无论您使用什么后端(Swarm、Kubernetes、黄牛等),您都将在这里执行某种触发命令。

运行管道!

一切准备就绪!现在让我们做一些编辑并触发管道。您应该会看到类似这样的内容:

您应该看到测试通过了,图像也发布了。自动化全流水线!****

包扎

在本帖中,我们为 OpenFaaS 创建了一个完整的 CI/CD 管道。可以把服务换成自己喜欢的,GitLab,Gogs,Jenkins,Circle CI,GoCD,Drone 等。(随你怎么说),你可以在云中或内部任何你喜欢的地方无缝地使用它们。不用说,能够完全控制管道是一个巨大的优势!

尽管如此,仍有一些我们可以改进的地方,包括:

  • 每次更新 docker 以在流水线的开始使用 docker-compose ver: 3.2需要一点时间。希望有某种方式来切换特拉维斯的 docker 版本
  • CI 每次都下载faas-cli。也许我们可以创建一个faas-cli容器,并在管道中重用它,利用图像缓存的优势。

如果你有任何想法,请随时与 me 分享!也会喜欢反馈!

延伸阅读:

  • 你可以在这里找到这篇文章项目的完整回购:【https://github.com/kenfdev/faas-echo】T5
  • 如果你还没有,你一定要看看 Alex 的“OpenFaaS:与 Alex Ellis 一起在 60 秒内从零到无服务器”:

如果你对 OpenFaaS 感兴趣,请给GitHub repo打一个 ** *以示支持!***


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除