当前位置: 首页 > 科技观察

开源无服务器软件概览:Fission、Fn、Kubeless和OpenWhisk

时间:2023-03-17 13:51:32 科技观察

“无服务器”是一个诱人的流行语,因为没有什么比服务器更痛苦的了。难道你收件箱中的数百万封电子邮件中都用无数的文字描述了所有的安全漏洞补丁?想象一下,如果你能摆脱服务器,你就可以不用考虑这些补丁了。您是否必须记住防火墙上的所有端口都已关闭?这些问题将永远不会再困扰您。无服务器世界将使您自由。无论如何,这个词是如此有前途。无服务器的世界似乎是自由奔放的,并且充分利用它的时间来忠于你的每一个合法任务:你告诉它它应该是什么。但也不要被愚弄。你也会为摆脱痛苦而付出代价,那就是牺牲行动的自由。亚马逊、微软和谷歌云中的无服务器平台通过专有接口发挥其魔力,每次你将一些痛苦转移到他们等待的手中时,你就会慢慢上瘾。尤其是被谷歌的大型集群管理工具Borg等工具所吸收。“占有”这个词的力量如此强大,你可能会发现难以摆脱它的掌握。程序员讨厌这种限制,这就是为什么许多程序员试图开发开源软件包,这些软件包提供基于云的无服务器平台的部分甚至大部分功能,但可以在任何地方使用一大堆。代码。这不仅使调试和测试更容易,而且可以使您的整个套件和媒体播放器更昂贵,并具有更好的反应时间或其他好处。您甚至可以将它带回家,存放在您曾经称为服务器机房的空调储藏室中。为了了解这个快速发展的开源无服务器架构世界,我启动了几台机器并编写了一些简单的逻辑。现在得出任何确定的结论还为时过早,因为这些项目喜欢将自己称为“预览版”,但有希望让我们摆脱束缚。让我们来看看作出这一努力的四大软件成果——Fission、Fn、Kubeless和OpenWhisk。当然,很快就会有更多的软件出现加入他们的行列。Fission是来自PlatformNine的开源无服务器解决方案,Fission将使用一些带有动态加载器的标准容器将Kubernetes绑定到内部容器。所使用的功能将被放置在适当的标准容器中并加载以回答来自容器内已经存在的Web服务器的查询。标准环境包括主要模型(Node.js、Python和Go)以及一些老式解决方案,如PHP、.Net、Ruby,甚至Perl。当然,你也可以用你喜欢的任何语言翻阅你自己的语言,只要你制作一个响应HTTP请求的二进制文件即可。Fission可能对任何想使用容器编排提供的自动缩放选项直接跳到Kubernetes级别的人来说最有用。他们可以使用Kubectl、Helm和Tiller等标准工具在Kubernetes集群中运行Fission。一个包含五个项目的快速示例,它使用Fission的命令行界面将一个简单的函数转换为一个正在运行的容器。如果您不能依赖HTTP来调用这些函数,Fission可以通过Crontab或来自两个受支持的队列工具(Azure队列存储或NATS流)之一的消息来触发它们。还有一个选项可以在YAML文件中定义“工作流”以按顺序运行多个任务。Fission提供的最大服务是维护一组用于动态加载代码的标准容器。这些容器基本上是预先配置好的,省去你添加必要代码以在集群中正确运行的麻烦。ProjectFn意味着Oracle进军无服务器领域,将一些模板、主要语言的标准构建例程和一些标准的开源应用程序容器引擎Docker粘合在一起。Fn比其他应用程序更以Java为中心,当您认为Oracle拥有Java时,这并不奇怪。fn需要结合使用多种语言,基于Docker构建套路。一些Oracle消息来源说“一个依赖项:Docker”。其中一个更有趣的特性是一组包装器,允许您运行AmazonWebServices匿名代码而不是Oracle本地堆栈中的代码。使用这些包装器的核心功能相对容易理解,但这通常只是图片的一部分。大多数人使用匿名代码作为其他亚马逊云服务的胶水代码。这些包装器只能帮助您获取匿名代码本身,因此您必须想出其他解决方案来应对AmazonWebServices应用程序编程接口API带来的繁重工作。这些包装器很棒,但它们的用处取决于您如何设计架构以及您的代码使用了多少亚马逊服务。与所有此类工具一样,Fn的界面是命令行。您键入fn,然后添加命令以创建新模板、生成结果代码或最终部署它。您编写一个简单的函数,它是单个文件,fn会将它与适当的模板绑定,以便它可以在Docker容器中运行。Go、Java、Python、Ruby和Node.js的预构建模板都捆绑为Fn开发工具包(FDK),但您无需将时间集中在它们上面。它们都要求您创建一个函数,该函数将字符串作为参数并返回一个字符串作为结果。没有比这更容易操作的了。Fn中的这个实验性UI展示了如何将多个不同的功能链接到一个工作流中。当您部署代码时,Fn将它连接到一个HTTP触发器,该触发器捆绑所有参数并将它们提供给在Docker容器中运行的函数。几乎所有其他东西都对您的梦想和设计开放。是的,Fn使您免于所有部署难题,但您仍然必须在该函数中编写所有代码。你可以使用Fn内部的机制来稍微改变它。Steward信息存储在基础数据库(SQL3)中,用于跟踪路由和其他部署信息,但您可以不费吹灰之力直接使用MySQL或Postgres。消息队列还有一个可配置的选项,可以帮助不同版本的Fn协调它们的工作。您可能对它们无动于衷,但如果您想要更多,选项就在那里。经过一些设计,Fn非常轻巧简单。它采用一些标准的构建工具和一些标准的Docker模板并将它们链接在一起,这样就可以更轻松地编写一段代码并观察它在其中一个Docker容器中运行。KubelessKubeless起源于Bitnami,该公司是帮助我们通过许多不同类型的手持产品提取云的所有力量的公司之一。与Fission一样,Kubeless旨在将无服务器的所有乐趣带入Kubernetes集群。这个名字有点可笑,因为这个技术是没有Kubernetes的。如果说有什么不同的话,那就是它利用Kubernetes的内置功能来实现快速的无服务器基础设施。Kubeless将您的功能变成自定义资源,这就是Kubernetes旨在根据需要创建和扩展功能的关键点。开发人员似乎更喜欢Python,因为大部分示例都是用Python编写的,但也有用于Node.js、Ruby、PHP、Go和.Net的运行时。尽管文档的某些部分缺少Java1.8,但它包含在可用的运行时计划中,具体取决于安装的版本。这个框架的基本功能比其他框架更复杂。你写的每个函数都会有两个参数,一个对象参与事件,一个对象参与一些元数据或上下文。这个框架允许更复杂一点的自感知编程模型。最后,您必须返回一个字符串,该字符串将由启动所有内容滚动的任何HTTP请求返回。(在某些接受对象并在Node.js运行时将其序列化的堆栈中有更好的辅助函数。)Kubeless有一个UI,可让您编辑函数并单击部署。如果您不想从HTTP请求触发功能,您可以配置Kubeless在特定时间响应Kafka或NAT消息或计划调用。您还可以通过为事件创建自定义资源来扩展此功能。对于完全拥抱Kubernetes的人来说,Kubeless所采用的方法非常有吸引力,并且可以让人们在集群和自动缩放的世界中感到自在。Kubeless主要是一个工具,用于将一些基本代码快速转换为响应请求的Kubernetes集群。OpenWhiskOpenWhisk是IBM用于在IBMCloud中构建云功能的官方工具。它也是一个由Apache软件基金会领导的开源项目(仍在孵化中)。OpenWhisk实际上是几个流行的Apache项目的组合,将几行代码拼接在一起,然后将它们包装在Docker容器中,并通过RESTAPI唤醒它们执行。这些请求由Nginx发起,转换成Kafka信息,然后传递给容器。身份验证和管理信息存储在CouchDB中。这就像Apache基金会再次联合起来。代码本身可以用JavaScript、Java、Python、PHP、Go等语言编写,要知道即使是Swift也是为那些花时间编写iPhone应用程序的人准备的。当然,您几乎可以使用任何可以绑定到Docker容器中的东西,只要函数参数在stdin上被接受并且结果在stdout上输出。OpenWhisk开发人员基本上已经为每种主要语言构建了一系列标准框架,这些框架将使用一些预配置的词汇表来进行一些文本输入并吐出一些文本输出。当您编写简短的函数时,OpenWhisk会将其粘贴到这个标准容器中,一切都会开始工作——前提是您已根据规范正确编写了函数。总有一个窍门。Java代码期望GoogleGSON库可用。Swift代码的容器将运行Swift的开源版本,因此可能会或可能不会出现代码与iOS世界中的体验完全相同的时刻。JavaScript可能是所有人的选择,并且很好理解和预测您的JavaScript代码将在Node6或Node8内部运行。OpenWhisk请求的路径。一旦请求到达HTTP网关,它就会通过Kafka传播到正确的Docker包。但是,在IBM精心设计的云平台上使用OpenWhisk与在我自己的机器上运行OpenWhisk之间存在巨大差异。IBM的Web界面使得编写几行代码并观察它们成功运行变得容易。我花了半个小时才看到在StoringTextinanIBMCloudantDatabasefromScratch中运行的界面。当我尝试做一些像开源发行版这样的事情时,在经历了诸如配置API主机之类的障碍之后,我不断遇到障碍。该文档远不如应有的完整。有几个不同的快速启动路径的指针,您将尝试猜测并填补漏洞。然而,很快就会发现有相当多的配置可以在您自己的机器上运行它们。打包Swift函数的说明是几行代码如何需要大量配置和脚本编写的好例子。Serverlessvs.Simplicity这四个项目都在一个非常狭窄的利基市场中。“无服务器”一词并没有像预期的那样广泛使用,还有许多其他选项在没有“无服务器”流行语的情况下提供了很大的灵活性和自由度。数据库通常被认为是原始的无服务器选项,许多开源系统(如WordPress、Drupal和Magento)都是无服务器的。您可以通过添加适用于大型框架的PHP模块来扩展它们。所谓的插件或模块也有点“无服务器”。在这种情况下,这些工具都没有像任何一代技术那样无忧无虑地运行。这四个无服务器平台更接近Kubernetes或Docker集群的增强管理器。它们更像是一种管理工具,可以简化启动和运行这些集群所需的所有配置。或者像autogen工具一样,您可以包装您的函数并让它在集群上运行。他们扮演的角色受限于他们的架构。工具创建者的目标是提供最大的灵活性。他们都有一长串支持的语言,但他们说他们支持所有符合输入和输出标准的二进制数据。所以他们所能做的就是将零件粘在一起并吐出一个容器。事实证明,将这些零件放在容器内是一项相当大的挑战。所有消息来源都会说您可以通过编写函数来执行这些任务或操作。但是这个函数能有什么样的功能呢?此时,您无法处理容器内的所有工作。在移交控制权之前,您必须先妥善处置容器中的二进制文件和代码。然后处理所有其他部分,如数据库和API。这最终比在AmazonCloudServiceLambda、IBMCloudFunctions或MicrosoftAzure和GoogleCloud上为相同功能编写代码要难得多。当一切就绪时,云数据存储或API服务将提供您需要的持久性和分析。此时,您实际上只需编写一些简单的函数来编码一些业务逻辑即可。剩下的就是让云继续那里的工作。持久性、API集成和云的其他组件都对开源项目提出了一些挑战。所有这些项目都运行良好并使其运行。但是他们没有解决所有其他事情,这意味着您也必须重复所有其他事情。如果您远离主要的云提供商,您会感觉像一个背着装满果酱馅饼的背包走出家门的孩子,并发现家不仅仅是食物。是一张床、一台洗衣机、一台电视、一间浴室、一只狗等等。一点思考在这一点上,开源项目对于云本身来说是一个非常好的营销策略。在我最初接触这些开源项目后,我很快就遇到了一些问题,这些问题让我更难在锁定的云环境之外生存。不过,随着平台的成熟和程序员推动“无服务器”一词的含义,这种情况可能会改变。起初,我认为无服务器主要是云的shell脚本,这种方法只是添加一些逻辑来平滑进出IBMCloudant或AmazonS3等大型服务的数据流。现在人们正在接受这个简单的想法,并继续在无服务器框架中编写极其复??杂的函数。一些比较有冒险精神的程序员也在将相当复杂的代码转换、机器学习或计算工作放到Serverless调用中,这基本上可以在时间和内存限制内完成工作。开源工具包是为更大范围的无服务器图景铺平道路的好方法。如果您要完成一项功能中的几乎所有工作,这些工具将让您立即上手并运行。但是有一个问题,无服务器对很多人来说可能更便宜的原因是你只在运行代码时为服务器付费。在您的工作负载大到足以让一台服务器全速运行之前,在云中运行您的函数应该更便宜,因为这将帮助您与其他一些函数共享硬件。如果你的功能只能产生10%的负载,支付10%的负载当然便宜,而这时候你需要支付云服务器100%的价格,90%的钱花在服务器上是一种浪费。这个成本构成非常混乱,涉及电费、房产成本和硬件成本。如果你很聪明,你可以节省很多钱。这些开源项目允许您在自己的服务器场上复制无服务器魔法,但这也意味着您必须自己找出正确的方法来处理所有的经济和部署复杂性。好消息是,他们在将函数转换为运行容器方面仍然做得很好。如果这是唯一的任务。