作者:Ran Ribenzaft,Epsagon联合创始人兼首席技术官。最初发表在Epsagon博客上。
https://epsagon.com/blog/serverless-open-source-frameworks-openfaas-knative-more/
本文将讨论上面提到的一些框架,并深入探讨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提供轻量级虚拟机称为微VM“microVM”,它使用基于硬件的虚拟化技术来实现完全的隔离,同时在传统容器级别上提供性能和灵活性。开发人员的一个不便之处是,该技术的所有开发都是用Rust语言编写的。还使用了带有最少组件集的截断的软件环境。为了节省内存、减少启动时间并提高环境中的安全性,将启动一个修改过的Linux内核,所有多余的东西都将从这个内核中删除。此外,功能和设备支持也减少了。该项目由AWS开发,目的是提高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设计与架构
OpenFaaS架构基于云原生标准,包括以下组件:API网关、Watchdog、容器编排器Kubernetes、Docker Swarm、Prometheus和Docker。根据如下所示的架构,当开发人员使用OpenFaaS时,该过程从安装Docker开始,并以网关API结束。
OpenFaaS组件和流程
API网关
通过API网关,可以提供到所有函数所在位置的路由,并通过Prometheus收集云原生指标。
客户端到函数路由
函数Watchdog
Watchdog组件集成到每个容器中,以支持无服务器应用程序,并在用户和函数之间提供公共接口。
OpenFaaS Watchdog接口
Watchdog的主要任务之一是组织在API网关上接收到的HTTP请求,并调用所选的应用程序。
Prometheus
这个组件允许你在任何时候获取指标变化的动态,将它们与其他指标进行比较,转换它们,并以文本格式或图形的形式查看它们,而不需要离开web界面的主页。Prometheus将收集到的指标存储在RAM中,并在达到给定的大小限制或在一段时间之后将它们保存到磁盘中。
Docker Swarm和Kubernetes
Docker Swarm和Kubernetes是编排的引擎。API网关、函数Watchdog和Prometheus实例等组件都在这些编排器之上工作。推荐使用Kubernetes开发产品,Docker Swarm更适合创建本地函数。
此外,所有开发的函数、微服务和产品都存储在Docker容器中,Docker容器是开发人员和系统管理员使用容器开发、部署和运行无服务器应用程序的主要OpenFaaS平台。
在Docker上安装OpenFaaS的要点
OpenFaaS API网关依赖于所选Docker编排器提供的内置功能。为此,API网关连接到所选协调器的适当插件,记录Prometheus中的各种函数指标,并根据通过AlertManager从Prometheus收到的警报调整函数。
例如,假设你正在使用Linux操作系统的机器上工作,并且希望使用OpenFaaS在Docker集群的一个节点上编写一个简单的函数。要做到这一点,你只需遵循以下步骤:
Docker现在已经可以使用了,在编写其他函数时不再需要安装它。
为构建函数准备CLI OpenFaaS
要开发一个函数,你需要使用脚本安装命令行的最新版本。对于brew,这将是 brew install faas-cli。对于curl,你可以使用 curl -sL https://cli.get-faas.com/ | sudo sh。
使用OpenFaas的不同程序语言
要使用CLI中的模板创建和部署OpenFaaS函数,你几乎可以用任何编程语言编写处理程序。例如:
从OpenFaaS UI测试该函数
你可以从OpenFaas用户界面以多种方式快速测试该函数,如下所示:
乍一看,一切似乎都很简单。但是,你仍然需要处理许多细微差别。如果你必须使用Kubernetes,需要许多函数,或者需要向FaaS主代码库添加额外的依赖项,则尤其如此。
在GitHub上有一个完整的OpenFaas开发人员社区,在那里你也可以找到有用的信息。
https://github.com/openfaas/faas/tree/master/sample-functions
OpenFaaS的优点和缺点
OpenFaaS简化了系统的构建。修复错误变得更容易了,并且向系统添加新功能比在单一应用程序的情况下要快得多。换句话说,OpenFaaS允许你随时随地以任何编程语言运行代码。
然而,也有缺点:
使用Knative部署和运行函数
Knative允许你开发和部署基于容器的服务器应用程序,你可以轻松地在云提供商之间移植这些应用程序。Knative是一个刚刚开始流行的开源平台,但是今天的开发人员对它非常感兴趣。
Knative的架构和组件
Knative架构由Building、Eventing和Serving组件组成。
Knative架构和组件
Building
Knative的Building组件负责确保集群中的容器程序集从源代码启动。这个组件在现有的Kubernetes基本功能的基础上工作,并且扩展了它们。
Eventing
Knative的Eventing组件负责统一的订阅、交付和事件管理,以及在松散耦合的架构组件之间创建通信。此外,此组件允许你扩展服务器上的负载。
Serving
Serving组件的主要目标是支持无服务器应用程序和特性的部署、从零开始的自动扩展、Istio组件的路由和网络编程,以及已部署代码和配置的快照。Knative使用Kubernetes作为编排器,Istio执行查询路由和高级负载平衡功能。
Knative中最简单的函数的例子
你可以使用几种方法在Knative上创建服务器应用程序。你的选择将取决于你在各种服务方面的特定技能和经验,包括Istio、Gloo、Ambassador、Google,特别是Kubernetes Engine、IBM Cloud、Microsoft Azure Kubernetes Service、Minikube和Gardener。
只需为每个Knative组件选择安装文件。以下是三个组件的主要安装文件链接:
Serving组件
https://github.com/knative/serving/releases/download/v0.7.0/serving.yaml
https://github.com/knative/serving/releases/download/v0.7.0/monitoring.yaml
Building组件
https://github.com/knative/build/releases/download/v0.7.0/build.yaml
Eventing组件
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自己的开发站点上找到。
https://knative.dev/docs/
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来有效地实现不同的目标。