最初由Epsagon的联合创始人兼首席技术官Ran Ribenzaft在Epsagon博客上发布

本文将讨论上面提到的一些框架,并将深入探讨OpenFaaS和Knative,以介绍它们的架构,主要组件和基本安装步骤。如果您对本主题感兴趣并计划使用开源平台开发无服务器应用程序,本文将使您更好地了解这些解决方案。

在过去几年中,无服务器架构迅速普及。此技术的主要优点是能够在不需要基础结构管理的情况下创建和运行应用程序。换句话说,在使用无服务器体系结构时,开发人员不再需要分配资源、扩展和维护服务器来运行应用程序或管理数据库和存储系统。他们的唯一责任是编写高质量的代码。

有许多用于构建无服务器框架的开源项目(Apache OpenWhisk,IronFunctions,Oracle的Fn,OpenFaaS,Kubeless,Knative,Project Riff等)。此外,由于开源平台提供了对IT创新的访问,许多开发人员对开源解决方案感兴趣。

OpenWhisk, Firecracker & Oracle FN

在深入研究OpenFaaS和Knative之前,让我们简要描述一下这三个平台。

Apache OpenWhisk是一个用于无服务器计算的开放式云平台,使用云计算资源作为服务。与其他开源项目(Fission,Kubeless,IronFunctions)相比,Apache OpenWhisk的特点是代码库大,功能高质量,贡献者数量众多。但是,该平台的过大工具(CouchDB,Kafka,Nginx,Redis和Zookeeper)给开发人员带来了困难。此外,该平台在安全性方面并不完美。

Firecracker是亚马逊推出的一种虚拟化技术。此技术以最小的开销为虚拟机提供,并允许创建和管理隔离的环境和服务。Firecracker 提供了称为微型虚拟机的轻量级虚拟机,它们使用基于硬件的虚拟化技术实现完全隔离,同时提供传统容器级别的性能和灵活性。给开发人员带来的不便之一是,这项技术的所有开发都是用 Rust 语言编写的。还使用了具有最少组件集的截断软件环境。为了节省内存,减少启动时间并提高环境中的安全性,启动了一个经过修改的Linux内核,从中排除了所有多余的东西。此外,功能和设备支持也减少了。该项目由 Amazon Web Services 开发,旨在提高 AWS Lambda 和 AWS Fargate 平台的性能和效率。

Oracle Fn 是一个开放服务器无服务器平台,为云系统提供了额外的抽象级别,以允许功能即服务 (FaaS)。与Oracle Fn中的其他开放平台一样,开发人员在各个函数级别实现逻辑。与现有的商业FaaS平台(如Amazon AWS Lambda,Google Cloud Functions和Microsoft Azure Functions)不同,Oracle的解决方案被定位为没有供应商锁定。用户可以选择任何云解决方案提供商来启动Fn基础架构,组合不同的云系统或在自己的设备上运行平台。

Kubeless 是一个基础架构,它支持在您的集群中部署无服务器函数,并使我们能够在 Python、Node.js 或 Ruby 代码中执行 HTTP 和事件开关。Kubeless是一个使用Kubernetes的核心功能构建的平台,例如部署,服务,配置卡(ConfigMaps)等。这节省了小尺寸的 Kubeless 基本代码,也意味着开发人员不必重放 Kubernetes 内核本身中已经存在的大部分计划逻辑代码。

Fission是一个开源平台,通过Kubernetes提供无服务器架构。Fission的一个优点是,它可以处理Kubernetes中自动扩展资源的大部分任务,从而将您从手动资源管理中解放出来。Fission的第二个优点是,您不受一个提供商的约束,并且可以从一个提供商自由移动到另一个提供商,前提是它们支持 Kubernetes 集群(以及您的应用程序可能具有的任何其他特定要求)。

使用OpenFaaS和Knative的主要好处

OpenFaaS和Knative是公开可用的免费开源环境,用于创建和托管无服务器功能。这些平台允许您:

  • 减少闲置资源。

  • 快速处理数据。

  • 与其他服务互连。

  • 通过对大量请求的密集处理来平衡负载。

但是,尽管平台和无服务器计算通常都具有优势,但开发人员必须在开始实现之前评估应用程序的逻辑。这意味着您必须首先将逻辑分解为单独的任务,并且只有这样才能编写任何代码。

为清楚起见,让我们分别考虑这些开源无服务器解决方案中的每一个。

如何使用 OpenFaaS 构建和部署无服务器函数

OpenFaaS的主要目标是使用Docker容器简化无服务器功能,允许您运行复杂而灵活的基础架构。

OpenFaas Design & Architecture

OpenFaaS 架构基于云原生标准,包括以下组件:API Gateway、Function Watchdog 以及容器编排器 Kubernetes、Docker Swarm、Prometheus 和 Docker。根据下面显示的架构,当开发人员使用OpenFaaS时,该过程从安装Docker开始,以网关API结束。

OpenFaaS 组件和流程

接口网关

通过 API 网关,提供到所有函数位置的路由,并通过 Prometheus 收集云原生指标。

客户端到函数路由

功能看门狗

Watchdog 组件集成到每个容器中以支持无服务器应用程序,并在用户和函数之间提供通用接口。

OpenFaaS 看门狗接口

Watchdog 的主要任务之一是组织在 API 网关上收到的 HTTP 请求并调用选定的应用程序。

普罗 米修斯

此组件允许您随时获取指标更改的动态,将它们与其他指标进行比较,转换它们,并以文本格式或图形形式查看它们,而无需离开Web界面的主页面。Prometheus 将收集的指标存储在 RAM 中,并在达到给定大小限制或经过一段时间后将其保存到磁盘。

Docker Swarm 和 Kubernetes

Docker Swarm和Kubernetes是编排的引擎。API 网关、函数监视器和 Prometheus 实例等组件在这些业务流程协调程序之上工作。建议使用Kubernetes来开发产品,而Docker Swarm则最好创建本地函数。

此外,所有开发的功能、微服务和产品都存储在 Docker 容器中,该容器是开发人员和系统管理员使用容器开发、部署和运行无服务器应用程序的主要 OpenFaaS 平台。

在 Docker 上安装 OpenFaaS 的要点

OpenFaaS API Gateway 依赖于所选 Docker 业务流程协调程序提供的内置函数。为此,API 网关连接到所选业务流程协调程序的相应插件,在 Prometheus 中记录各种函数指标,并根据通过 AlertManager 从 Prometheus 收到的警报扩展函数。

例如,假设您正在一台使用 Linux 操作系统的机器上工作,并希望使用 OpenFaaS 在 Docker 集群的一个节点上编写一个简单的函数。为此,您只需按照以下步骤操作:

  • 安装 Docker CE 17.05 或最新版本。

  • 运行 Docker:

$ docker run hello-world
  • 初始化 Docker Swarm:

$ docker swarm init
  • Clone OpenFaaS from Github:

git clone https://github.com/openfaas/faas && \  cd faas && \ ./deploy_stack.sh

  • 登录到 http://127.0.0.1:8080 的 UI 门户。

Docker 现在已准备就绪,在编写更多函数时不再需要安装它。

为构建功能准备 CLI OpenFaaS

要开发函数,您需要使用脚本安装最新版本的命令行。对于 brew,这将是 $ brew install faas-cli。对于 curl,您可以使用 $ curl -sL https://cli.get-faas.com/ |苏多 sh.

使用OpenFaas的不同程序语言

要使用 CLI 中的模板使用 OpenFaaS 创建和部署函数,您可以使用几乎任何编程语言编写处理程序。例如:

  • 创建新函数:

$ faas-cli new --lang prog language <<function name>>
  • 生成堆栈文件和文件夹:

$ git clone https://github.com/openfaas/faas \
 cd faas \
 git checkout 0.6.5 \
 ./deploy_stack.sh
  • 构建函数:

$ faas-cli build -f <<stack file>>
Deploy the function:
$ faas-cli deploy -f <<stack file>>

从 OpenFaaS UI 测试函数

您可以从 OpenFaas 用户界面以多种方式快速测试该函数,如下所示:

  • 转到 OpenFaaS UI:

http://127.0.0.1:8080/ui/

  • 使用卷曲:

$ curl -d "10" http://localhost:8080/function/fib
  • 使用用户界面

乍一看,一切似乎都很简单。但是,您仍然需要处理许多细微差别。如果您必须使用 Kubernetes,需要许多函数,或者需要向 FaaS 主代码库添加其他依赖项,则尤其如此。

GitHub上有一个完整的OpenFaas开发人员社区,您也可以在其中找到有用的信息。

OpenFaaS的优缺点

OpenFaaS简化了系统的构建。修复错误变得更加容易,并且向系统添加新功能比在整体式应用程序中要快得多。换句话说,OpenFaaS允许您随时随地以任何编程语言运行代码。

但是,存在缺点:

  • 对于某些编程语言来说,冷启动时间很长。

  • 容器启动时间取决于提供程序。

  • 该功能的生存期有限,这意味着并非所有系统都可以根据无服务器运行。(使用 OpenFaaS 时,计算容器无法在内存中长时间存储可执行的应用程序代码。该平台将自动创建并销毁它们,因此不可能出现无状态。

使用 Knative 部署和运行函数

Knative允许您开发和部署基于容器的服务器应用程序,您可以轻松地在云提供商之间移植。Knative是一个开源平台,刚刚开始流行,但今天的开发人员对此非常感兴趣。

Knative的架构和组件

Knative 架构由构建、事件和服务组件组成。

Knative Architecture and Components

建筑

Knative 的构建组件负责确保从源代码启动集群中的容器程序集。此组件基于现有的 Kubernetes 原语工作,并对其进行了扩展。

事件

Knative 的 Eventing 组件负责通用订阅、交付和事件管理,以及在松散耦合的架构组件之间创建通信。此外,此组件还允许您扩展服务器上的负载。

服务

Serve 组件的主要目标是支持无服务器应用程序和功能的部署、从头开始自动扩展、Istio 组件的路由和网络编程,以及已部署代码和配置的快照。Knative 使用 Kubernetes 作为业务流程协调器,Istio 执行查询路由和高级负载均衡的功能。

使用 Knative 的最简单函数示例

您可以使用多种方法在 Knative 上创建服务器应用程序。您的选择将取决于您在各种服务方面的技能和经验,包括 Istio、Gloo、Ambassador、Google,尤其是 Kubernetes Engine、IBM Cloud、Microsoft Azure Kubernetes Service、Minikube 和 Gardener。

只需为每个 Knative 组件选择安装文件即可。可在此处找到所需三个组件的主要安装文件的链接:

服务组件https://github.com/knative/serving/releases/download/v0.7.0/serving.yaml https://github.com/knative/serving/releases/download/v0.7.0/monitoring.yaml
建筑构件https://github.com/knative/build/releases/download/v0.7.0/build.yaml
事件组件https://github.com/knative/eventing/releases/download/v0.7.0/release.yaml https://github.com/knative/eventing/releases/download/v0.7.0/eventing.yaml

这些组件中的每一个都以一组对象为特征。有关这些组件的语法和安装的更多详细信息,可以在 Knative 自己的开发站点上找到。

Knative的优点和缺点

Knative有许多好处。与OpenFaaS一样,Knative允许您使用容器创建无服务器环境。这反过来又允许您获得基于事件的本地体系结构,其中没有公共云服务施加的限制。Knative 还允许您自动执行容器组装过程,从而提供自动缩放。因此,无服务器函数的容量基于预定义的阈值和事件处理机制。

此外,Knative还允许您在内部,云中或第三方数据中心中创建应用程序。这意味着您不受任何一个云提供商的约束。由于其操作基于Kubernetes和Istio,Knative具有更高的采用率和更大的采用潜力。

Knative的一个主要缺点是需要独立管理容器基础设施。简而言之,Knative并不针对最终用户。然而,正因为如此,更多商业管理的Knative产品正在变得可用,例如Google Kubernetes Engine和IBM Cloud Kubernetes Service的Managed Knative。

结论

尽管开源无服务器平台的数量不断增加,但OpenFaaS和Knative将继续在开发人员中普及。值得注意的是,这些平台不容易比较,因为它们是为不同的任务而设计的。

与OpenFaas不同,Knative不是一个成熟的无服务器平台,但它更适合作为创建,部署和管理无服务器工作负载的平台。但是,从配置和维护的角度来看,OpenFaas更简单。使用OpenFaas,无需像Knative那样单独安装所有组件,并且如果已经安装了所需的组件,则不必清除以前的设置和新开发的资源。

尽管如此,如上所述,OpenFaaS的一个显着缺点是容器启动时间取决于提供商,而Knative则不依赖于任何单个云解决方案提供商。根据两者的优缺点,组织也可以选择同时使用Knative和OpenFaaS来有效地实现不同的目标。