开源无服务器:Fission,Fn,Kubeless和OpenWhisk
如果曾经有“无服务器”一词,那是一个令人困惑的流行词,因为服务器有点痛苦。 所有这些安全漏洞的补丁程序都在收件箱中的一百万封电子邮件中用数十亿个单词描述了吗? 如果您可以摆脱服务器,则可以忘记那些补丁。 您必须记住要保持防火墙上所有这些端口的关闭状态? 他们也不再是您的烦恼。 无服务器世界将使您*。 至少这就是这个词的承诺。
无服务器世界看起来轻松而充裕,全神贯注于您的一项真正使命:无论您的西装告诉您什么。 但不要上当。 您将通过牺牲自己的游荡或变更*来为这种免于忧虑的*付出代价。 亚马逊,微软和谷歌云中的无服务器平台通过专有界面传递魔力,每当您将一些烦恼转移到等待中时,您就会上瘾。 被博格所吸收。 “拥有”一词过于强烈,但您可能会发现它同样难以逃脱。
[开发人员指南: 无服务器:AWS,Google Cloud和Microsoft Azure 。 | 然后学习如何使用Microsoft的Azure功能以及如何使用AWS Lambda进行无服务器计算。 ]
程序员讨厌这样的束缚,这就是为什么他们中的许多人试图构建开源程序包的原因,这些程序包提供了基于云的无服务器平台的某些甚至大部分功能,但是却包含了可以在任何地方使用的大量代码。 这不仅使调试和测试变得更加容易,而且还使您可以将整个套件和kaboodle带到价格更高,延迟更短或任何其他条件更好的另一个云中。 您甚至可以将其带到您以前称为服务器机房的空调壁橱中。
为了处理这个新兴的开放源代码无服务器框架世界,我启动了一些机器并编写了一些简单的逻辑。 得出任何肯定的结论还为时过早,因为这些项目喜欢说它们是“预测试版”,但是有很大希望将我们从锁定中解放出来。
这里介绍了四个主要工作-Fission,Fn,Kubeless和OpenWhisk。 当然,不久还会有更多的事情发生。
裂变
Fission是Platform9的一种开源无服务器解决方案,它使用一些带有动态加载程序的标准容器将运行在Kubernetes中的容器编织在一起。 您的函数将被拉入适当的标准容器中,并被加载以回答来自容器内已存在的Web服务器的查询。
标准环境包括主要模型(Node.js,Python和Go)以及一些旧式解决方案,例如PHP,.Net,Ruby甚至Perl。 当然,只要您生成可响应HTTP请求的二进制文件,您也可以使用任意语言滚动显示自己的名字。
对于希望使用容器协调程序提供的自动缩放选项直接跳到Kubernetes级别的任何人,裂变可能都是最有用的。 Fission使用Kubectl,Helm和Tiller等标准工具在Kubernetes集群内部运行。
一个简短的五行示例,介绍了如何使用Fission的命令行界面将简单功能转换为正在运行的容器。
如果您不能依靠HTTP调用来调用函数,则Fission可以从Crontab或来自两个受支持的排队工具(Azure队列存储或NATS流)之一的消息中触发它们。 还有一个选项可以在YAML文件中定义“工作流”,该文件将依次运行多个任务。
Fission提供的最大服务是维护可动态加载代码的一组标准容器。 它们基本上是预先配置的,从而省去了添加在集群中正确运行所必需的代码的麻烦。
Fn项目
Oracle在无服务器领域的进入Fn将一些模板,主要语言的标准构建例程以及一些标准Docker容器粘合在一起。 Fn比其他的以Java为中心,当您认为Oracle拥有Java时也就不足为奇了。 只要Docker是基础,Fn就应该使用大多数语言组合并构建例程。 一些Oracle文献说“一个依赖:Docker”。
一组更有趣的功能是一组包装程序,使您可以在Oracle本地堆栈中而不是您的本地堆栈中运行AWS Lambda代码。 使用这些包装器可以相对容易地映射核心功能,但这通常只是图片的一部分。 大多数人将Lambda用作其他Amazon云服务的粘合代码。 这些包装器仅帮助您带来Lambda代码本身,因此您必须为AWS API的繁琐工作找到其他解决方案。 包装器很棒,但是它们的实用程序取决于您如何设计架构以及代码使用了多少Amazon服务。
像所有这些工具一样,Fn的界面也是所有命令行。 键入fn ,然后添加命令以创建新模板,生成结果代码或最终对其进行部署。 您编写的简单函数是一个单独的文件,然后fn将其与正确的模板捆绑在一起,以便它可以在某个地方的Docker容器中运行。
用于Go,Java,Python,Ruby和Node.js的预构建模板作为Fn开发工具包(FDK)捆绑在一起,但您不必专心于它们。 他们都要求您构建一个函数,该函数将字符串作为参数并返回字符串作为结果。 这再简单不过了。
Fn中的这个实验性UI展示了如何将许多不同的功能链接在一起成为一个工作流。
部署代码时,Fn会将其连接到HTTP触发器,该触发器捆绑所有参数,并将其提供给在Docker容器中运行的函数。 几乎所有其他一切都对您的梦想和设计开放。 是的,Fn使您摆脱了所有部署难题,但是您仍然必须在一个函数中编写所有代码。
您可以对Fn内部的机制进行一些摆弄。 管家信息存储在用于跟踪路由和其他部署信息的基本数据库(SQL3)中,但您可以直接使用MySQL或Postgres。 消息队列还有一个可配置的选择,可以帮助Fn的不同版本进行协调。 您可能会保留这些内容,但如果需要更多选项,则可以使用。
Fn感觉非常轻巧和简单,毫无疑问是设计使然。 它需要一些标准的构建工具和一些标准的Docker模板并将它们链接在一起,因此更容易编写一些代码,并查看它们在其中一个Docker容器中运行。
无核
Kubeless来自Bitnami,Bitnami是帮助我们使用几种不同类型的手持产品提取云的所有功能的公司之一。 与Fission一样, Kubeless旨在将无服务器的所有乐趣带入Kubernetes集群。 这个名字有点开玩笑,因为这项技术除了Kubernetes之外,什么都不是。 如果有的话,那就是利用Kubernetes的内置功能来建立快速的无服务器基础架构。
Kubeless将您的功能转变为自定义资源,Kubernetes旨在根据需要创建和扩展这些内容。 开发人员似乎最喜欢Python,这仅仅是因为示例大部分是用Python编写的,但是也有Node.js,Ruby,PHP,Go和.Net的运行时。 尽管文档的某些部分缺少Java 1.8,但根据我安装的版本,Java包含在可用运行时列表中。
基本功能比其他框架要复杂一些。 您编写的每个函数都将带有两个参数,一个带有事件的对象,另一个带有一些元数据或上下文的对象。 与仅将字符串传递给函数的方法相比,这允许稍微更复杂和具有自我意识的编程模型。 最后,您必须返回一个字符串,该字符串将返回到所有开始滚动的HTTP请求中。 (在某些堆栈中有一些更好的帮助程序功能,其中Node.js运行时接受一个对象并将其序列化。)
Kubeless具有一个UI,可让您编辑功能,然后单击一下即可部署它。
如果您不想从HTTP请求中触发功能,也可以将Kubeless配置为在特定时间响应Kafka或NAT消息或计划的调用。 您还可以通过为事件创建自定义资源源来扩展它。
对于完全拥抱Kubernetes并在集群和自动扩展世界中自如的人来说,无Kube方法将是最有吸引力的。 Kubeless主要是一种用于快速将一些基本代码转换为可响应请求的Kubernetes集群的工具。
OpenWhisk
OpenWhisk是IBM在IBM Cloud中构建Cloud Functions的官方工具。 这也是Apache Software Foundation托管的一个开源项目(处于孵化状态)。 OpenWhisk实际上是几个受欢迎的Apache项目的综合,这些项目被缝合在一起以占用几行代码,将它们包装在Docker容器中,并通过REST API调用它们的执行。 Nginx对请求进行处理,将其转换为Kafka消息,然后传递到容器中。 身份验证和管理信息存储在CouchDB中。 这就像一个Apache Foundation团聚。
代码本身可以用JavaScript,Java,Python,PHP,Go,甚至您所知道的Swift编写,以供那些不想花时间编写iPhone应用程序的人使用。 当然,只要功能参数可以被stdin接受并且结果通过stdout传递出去,您就可以使用几乎所有可以捆绑到Docker容器中的东西。
OpenWhisk开发人员实质上为每种主要语言建立了一系列标准框架,这些框架将接受一些文本输入并使用一些预配置的库吐出一些文本输出。 编写短函数时,OpenWhisk会将其粘贴到此标准容器中,并且一切正常,如果您已按照说明进行操作并正确编写了函数。
总是会有皱纹。 Java代码期望Google GSON库可用。 Swift代码的容器将运行Swift的开放源代码版本,因此有时代码行为可能与您在iOS世界中所经历的完全相同。 JavaScript可能是每个人中最受欢迎的选项,并且您JavaScript代码将在Node 6或Node 8内运行,这是众所周知且可预测的。
OpenWhisk请求的路径。 请求到达HTTP网关后,它会通过Kafka到达正确的Docker软件包。
但是,在IBM精心策划的云中使用OpenWhisk与在我自己的计算机中运行OpenWhisk之间存在巨大差异。 IBM的Web界面使编写几行代码并使其成功运行变得很简单。 从零开始到将文本存储在IBM Cloudant数据库中的运行界面只花了半个小时。
当我尝试对开放源代码发行版进行任何类似的操作时,我一直遇到像配置API主机这样的障碍。 文档远未达到应有的完整程度。 这里有一些指向不同快速入门路径的指针,您将不断猜测并填补漏洞。
很快就很清楚,要使它们全部在自己的计算机上运行,需要进行大量配置。 打包 Swift函数的说明是一个很好的示例,说明了几行代码如何进行大量配置和脚本编写才能使其运行。
无服务器与简单
所有这四个项目都占据了相当狭窄的位置。 “无服务器”一词没有得到尽可能广泛的使用,还有许多其他选择可以提供很多相同的灵活性和免于裁剪的*,而无需使用“无服务器”这个流行词。 人们通常认为数据库是最初的无服务器选项,而许多开源系统(如WordPress,Drupal和Magento)实际上都是无服务器的。 您可以通过添加适合大型框架的PHP代码片段来扩展它们。 我们过去所说的插件或模块可以被称为“无服务器”。
在这种情况下,这些工具中没有一个比那一代技术更省心。 这四个无服务器平台更接近于Kubernetes或Docker集群的增强型管理器。 它们更像是管理工具,可简化设置和运行这些集群所需的所有配置。 或者像自动构建工具一样,它可以包装您的功能并使它在集群上运行。
他们的角色的局限性由他们的体系结构定义。 工具创建者旨在提供最大的灵活性。 它们所有人都有一长串受支持的语言,但是尝试通过说它们将与遵守输入和输出格式规则的任何二进制文件一起使用来尝试达成协议。 因此,他们所能做的就是将零件粘合在一起并吐出一个容器。
事实证明,将零件放在容器内部仍然是挑战的很大一部分。 所有文献都说,您可以通过编写一个函数来使这些任务或动作运行。 但是它可以是什么功能。 因此,您将无法处理容器内的所有工作。 在移交控制权之前,您必须先在其中获取库和代码。 然后,您必须处理所有其他部分,例如数据库和API。