翻译自:Serverless Open-Source Frameworks: OpenFaaS, Knative, & more
本文将讨论上面提及的一些框架,并且深入 OpenFaaS 和 Knative 去介绍他们的架构、主要的组件以及基本安装步骤。如果你对这个主题感兴趣,并且计划使用开源平台开发 serverless 应用,本文将让你更好的理解这些解决方案。
过去几年里,serverless 已经迅速流行起来。这个技术的主要优势是能够创建和运行应用程序,但不需要基础架构管理。换句话说,当使用 serverless 架构时,开发者不再需要分配资源、扩展或维护服务器就可以运行应用,或者管理数据库和存储系统。他们唯一的职责就是去写高质量的代码。
有很多建立 serverless 框架的开源项目(Apache OpenWhisk, IronFunctions, Fn from Oracle, OpenFaaS, Kubeless, Knative, Project Riff 等)。此外,由于开源平台提供了 IT 创新的途径,很多开发者对开源解决方案产生兴趣。
OpenWhisk, Firecracker & Oracle FN
深入研究 OpenFaaS 和 Knative 之前,让我们简单的介绍下这三个平台。
Apache OpenWhisk 是用于 serverless 计算的开放云计算平台,它把云计算资源作为服务。与其他开源项目(Fission, Kubeless, IronFunctions)对比,Apache OpenWhisk 有如下特征:庞大的代码库、高质量特性和大量贡献者。然而,该平台过于庞大的工具(CouchDB, Kafka, Nginx, Redis 和 Zookeeper)为开发者带来了困难。此外,该平台在安全性方面不太完美。
Firecracker 是由 Amazon 推出的一个虚拟化技术。这个技术提供最小开销的虚拟机,允许创建和管理隔离的环境和服务。Firecracker 提供叫做微 VMs 的轻量虚拟机,它使用基于硬件的虚拟化技术实现完全隔离,同时提供传统容器级别的性能和灵活性。对开发者的不便之处是,该技术的开发完全采用 Rust 语言。还使用了一个删减的软件环境,其中包含最小的组件集。为了节省内存,减少启动时间同时提高环境安全性,一个修改过的 Linux 内核被启动,其他所有多余的部分都被排除在外。此外,功能和设备支持也减少了。该平台由 Amazon Web Services 开发,旨在提高 AWS Lambda 和 AWS Fargate 平台的性能和效率。
Oracle Fn 是一个开放服务的 serverless 平台,为云系统提供附加抽象层,允许函数即服务(FaaS)。与 Oracle Fn 中其他开放平台一样,开发者在独立的函数中实现逻辑。不像现存的商业 FaaS 平台,例如 Amazon AWS Lambda, Google Cloud Functions, 和 Microsoft Azure Functions,Oracle 的解决方案定位是无供应商锁定。用户能选择任何云解决方案供应商启动 Fn 基础架构,组合不同的云系统,或者在他们自己的设备上运行平台。
Kubeless 是一个基础架构,支持在集群中部署 serverless 函数,同时能够在 Python, Node.js 或 Ruby 代码中执行 HTTP 和事件触发。Kubeless 是一个使用 Kubernetes 核心功能,例如部署、服务、配置卡等,构建的平台。 这节省了 Kubeless 的基础代码,而且代码尺寸很小,这也意味着开发者不必重放大部分任务调度逻辑代码,它包含在 Kubernetes 内核中。
Fission 是一个开源平台,在 Kubernetes 上提供 serverless 架构。Fission 优势之一是它负责 Kubernetes 中自动扩展资源的大部分任务,把你从手动资源管理中释放出来。Fission 的第二个优势是你不受单一供应商的束缚,可以自由的从一个换到另一个,前提是他们支持 Kubernetes 集群(和你的程序或许有的任何其他特别的需求)。
使用 OpenFaaS 和 Knative 的主要优点
OpenFaaS 和 Knative 公开可用且免费开源环境,能够创建和托管 serverless 函数。这些平台允许你:
- 减少闲置资源
- 快速处理数据
- 对接第三方服务
- 通过对大量请求的深加工来负载均衡
然而,尽管这两种平台和 serverless 计算在总体上都有优势,开发者必须在开始实现前评估应用的逻辑。这意味着,你必须首先拆分逻辑为独立的任务,并且仅仅这样你才能写代码。
为清晰起见,让我们分别考虑这些开源 serverless 解决方案。
如何使用 OpenFaaS 构建和部署 Serverless 函数
OpenFaaS 的主要目标是使用 Docker 容器简化 serverless 函数,允许你运行复杂和灵活的基础设施。
OpenFaas 设计和架构
OpenFaas 架构基于云原生标准,并且包含下列组件: API Gateway(API 网关), Function Watchdog, and the container orchestrators Kubernetes, Docker Swarm, Prometheus, 和 Docker。根据如下所示的架构,当开发者使用 OpenFaas 时,流程开始于安装 Docker,结束于 Gateway API。
API Gateway(API 网关)
通过 API 网关,提供了到所有函数位置的路由,同时通过 Prometheus 监控云原生指标。
Function Watchdog
Watchdog 组件与每个容器集成去支持 serverless 应用,并且提供一个介于用户和函数之间的通用接口。
Watchdog 的主要功能之一是组织在 API Gateway 接收的 HTTP 请求,并且调用选定的应用。
Prometheus(监控程序)
这个组件允许你随时获取指标变化的动态,和其他指标对比,转换他们,在不离开网络界面主页的情况下,用文本格式或图表形式可视化他们。Prometheus 在 RAM 中存储收集的度量指标,并且在到达给定大小限制或一段时间后,把他们存储在磁盘上。
Docker Swarm 和 Kubernetes
Docker Swarm 和 Kubernetes 是编排引擎。诸如 API Gateway, Function Watchdog, 和 Prometheus 实例工作在这些编排器之上。建议使用 Kubernetes 去开发产品,而 Docker Swarm 更适合创建本地函数。
再者,所有开发的函数、微服务和产品被存储在 Docker 容器中,它充当主要的 OpenFaaS 平台,使用容器为开发者和系统管理员提供开发、部署和运行 serverless 应用。
在 Docker 中安装 OpenFaaS 的要点
OpenFaaS API Gateway 依赖所选 Docker 编排工具内建的函数。为了实现它,API Gateway 为所选的编排工具连接合适的插件,在 Prometheus 中记录各种指标,并且基于从 Prometheus 通过 AlertManager 收到的警告扩充函数。
例如,假如你正在用 Linux 系统工作,想去使用 OpenFaaS 在 Docker 集群节点上写一个简单的函数。为了实现它,你需要跟着下列的步骤:
- 安装 Docker CE 17.05 或者更新的版本
- 运行 Docker
$ docker run hello-world
- 初始化 Docker Swarm
$ docker swarm init
- 从 Github 克隆 OpenFaaS
git clone https://github.com/openfaas/faas && \ cd faas && \ ./deploy_stack.sh
- 登录 UI 门户: http://127.0.0.1:8080
Docker 现在已经准备好使用了,当你进一步写函数时,不需要再安装它。
为构建函数准备 CLI OpenFaaS
为开发函数,你需要使用脚本安装最新的命令行工具。对于 brew,它是 $ brew install faas-cli
。对于 curl,你需要使用$ curl -sL https://cli.get-faas.com/ | sudo sh
。
使用 OpenFaas 的不同编程语言
使用 CLI 中的模板创建和部署一个 OpenFaas 函数,你几乎可以用任何编程语言写一个处理器(handler)。例如:
- 创建新的函数:
$ 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:
$ curl -d "10" http://localhost:8080/function/fib
-
使用 UI
初一看,每件事情似乎都很简单。然而,你仍然必须处理很多细微的差别。如果你必须用 Kubernetes,需要很多函数,或者需要为 FaaS 主代码库增加额外的依赖,这更是如此了。
这个一个在 GitHub 上完整的 OpenFaaS 开发者社区,你也能找到很多有用的信息。
OpenFaaS 的优缺点
OpenFaaS 简化了系统的构建。修复错误变得更加容易,并且为系统增加新的功能也比单体应用情况下更快。换句话说,OpenFaaS 允许你随时随地用任何编程语言运行代码。
然而,这儿是一些缺点:
- 对一些编程语言冷启动时间长
- 容器启动时间依赖于供应商
- 函数有限的生命周期,意味着不是所有的系统都能根据 Serverless 工作。(当使用 OpenFaaS 时,计算容器不能在内存中长时间存储可执行的应用代码。平台将自动创建和销毁他们,所以无状态是不可能的。)
使用 Knative 部署和运行函数
Knative 允许你开发和部署基于容器的服务端应用,你可以容易的在云服务提供商之间迁移。Knative 是刚开始受欢迎的开源平台,但是现在引起了开发者很大的兴趣。
Knative 的架构和组件
Knative 架构包含 Building, Eventing, 和 Serving 组件。
构建(Building)
Knative Building 组件的职责是确保在集群中容器程序集从源代码中启动。该组件以现存的 Kubernetes 原语为基础,并对其进行扩展。
事件(Eventing)
Knative Eventing 组件负责通用的订阅、投递和事件管理,以及在松耦合架构组件之间创建通讯。此外,该组件允许你扩展服务器上负载。
服务(Serving)
Serving 组件的主要目标是支持 serverless 应用和特性的开发,自动缩放,Istio 组件的路由和网络编程,以及部署代码和配置的快照。Knative 使用 Kubernetes 作为编排器,Istio 执行查询路由和高级负载均衡的功能。
使用 Knative 最简单函数的例子
你可以在 Knative 上使用一些方法创建一个后端应用。你的选择依赖于你的特定技能和使用多种服务的经验,包括 Istio, Gloo, Ambassador, Google, 尤其是 Kubernetes Engine, IBM Cloud, Microsoft Azure Kubernetes Service, Minikube, 和 Gardener。
简单为每个 Knative 组件选择安装文件。以下是三个所需组件的主要安装文件的链接:
这些组件的每一个都由一系列对象构成。关于语法和安装组件的更多细节信息能在Knative 开发站点上找到。
Knative 的优缺点
Knative 有大量的优势。和 OpenFaaS 一样,Knative 允许你使用容器创建 serverless 环境。这反过来允许你获得一个本地的基于事件的架构,其中没有来自公共云服务施加的限制。Knative 也能自动化容器组装进程,从而提供自动伸缩。因此,serverless 函数的能力是基于预定义阈值和事件处理机制。
此外,Knative 允许你在内部、云上或者第三方数据中心创建应用。这意味着,你不必被任何云供应商束缚。并且由于它的操作基于 Kubernetes 和 Istio,Knative 也有一个更高的采用率和更大采用潜能。
Knative 一个主要的缺点是需要独立管理容器架构。简而言之,Knative 不是针对终端用户的。然而,因此,更多的商业化管理的 Knative 服务正开始出现,例如 Google Kubernetes Engine 和 IBM Cloud Kubernetes Service 的 Managed Knative 。
结论
尽管开源 serverless 平台越来越多,OpenFaaS 和 Knative 将继续获得开发者的欢迎。值得注意的是,这些平台不容易比较,因为他们为了不同的任务而设计。
尽管 OpenFaas, Knative 不是一个完全成熟的 serverless 平台,但是它是更合适作为一个创建、部署和管理 serverless 工作负载的平台。然而,从配置和维护的角度,OpenFaas 是更简单的。使用 OpenFaas,不需要像 Knative 那样单独安装所有的组件,并且如果需要的组件早已被安装了,你不需要清除之前的设置和新开发的资源。
还是,如上面所提到的,OpenFaaS 的一个显著缺点是容器启动时间依赖提供者,而 Knative 不受制于任何单独的云解决方案提供商。基于上面的优缺点,团队或许也可以选择同时使用 Knative 和 OpenFaaS 来有效实现不同目标。