在Kubernetes上实现无服务器化的五种方式
【51CTO.com快译】我们常听说的“无服务器化”,有时也被称为“事件驱动的计算(event-driven compute)”或被叫做“功能即服务(functions as a service,FaaS)”。其背后的思想是:为了响应各种事件,而通过动态分配资源,以调用或运行各项微服务(microservices)的功能。无服务器计算平台能够让应用程序人员更专注于应用程序本身,而不再是基础架构、及其所有的管理细节。
如今,大多数云服务提供商都能够提供相应的无服务器平台。当然,您也可以通过两个要素来构建自己的平台。第一个是:Kubernetes,它是一种容器编排系统。作为一个标准化的平台,它能够构建可扩展的组件化应用程序。第二个是在Kubernetes中构建无服务器应用模式的任意系统。
目前,大多数Kubernetes的无服务器框架都具有以下的共同特点:
- 能够从本地或远程部署到任何支持Kubernetes的环境中,包括OpenShift之类的环境。
- 支持运行由任意语言编写的代码,并带有一些常见的运行时预包装(runtimes prepackaged)框架。
- 通过HTTP端点、队列消息、或其他钩子等各类事件,来触发代码的执行。
在Kubernetes上构建无服务器的一个主要优点是:能够获得对于底层平台的更大控制权。通过Kubernetes,您可以创建一个满足自身需求的无服务器平台,从而让Kubernetes运维人员来负责该基础设施,而让开发人员更专注于必要的代码编写。
下面,我们向您介绍在Kubernetes上实现无服务器功能的五大主流项目。它们分别是:
- Fission
- Knative
- Kubeless
- OpenFaaS
- OpenWhisk
Fission是由Kubernetes的子公司Platform 9创建和维护的。它的主要特点是:您无需构建容器,只要提供定义文件,即可创建应用程序。
Fission的安装并不一定需要Helm chart。通常,它具有两个版本:全面版,带有消息队列、以及支持日志的InfluxDB;而精简版,只能提供基本的功能与服务。前者可以被专门部署在生产环境中,而后者仅供用户小范围内试用。
为了将代码添加并部署到Fission中,您可以使用基于YAML的规范文件。同时,Fission的命令行工具能够帮助您,创建针对不同功能和路由入口触发点的YAML文件。另外,这些规范文件还允许您提供各种环境变量、辅助容器、卷、以及Kubernetes的容错控制代码。
当然,Fission还会提供“工作流(workflow)”。通过安装Helm chart,这些工作流将会从一个函数输出并传递给另一个函数,哪怕两个功能函数并非使用的是同一种编程语言。值得注意的是,为了降低系统的开销,工作流系统默认支持诸如:整数、通用字节流等许多常见的原始二进制类型。不过,每个功能函数在进行格式转换输出与提交时,还是会产生一定的性能代价。
此类FaaS的一个缺点是:当我们首次调用某个功能函数时,其关联的容器会出现明显的延迟。因此,Fission需要通过对容器进行“预热”,来最小化此类延迟。
此外,Fission能够为开发人员和管理员提供的其他便利,还包括:将服务部署到无法访问外部互联网的集群中,按需将代码重新热加载(hot-reloaded)到集群里,以及记录与回放功能函数的各项活动,从而辅助开发人员进行调试。而且,由于Fission项目拥有自由的Apache许可证,因此用户可以免费对它进行修改。
最初是由谷歌创建的Knative,能够协助用户在Kubernetes中运行各种无服务器的应用。它主要关注的是,在生产环境中无服务器部署的通用模式。Knative在有效管理和利用多个Kubernetes组件方面,积累了许多丰富的专业知识。
为了管理Kubernetes,Knative除了需要路由系统和诸如Istio之类的服务网格之外,还会借用到Ambassador等其他选项。虽然,这会带来一些额外的设置工作,但是该项目的详细指南已经包含了各种云服务,以及诸如vanilla Kubernetes的环境说明。
通过利用或扩展现有的Kubernetes工具和功能,Knative能够通过YAML文件和为您交付Docker容器的方式,来配置各种应用程序与函数。而对于各种定义的添加、修改或删除则可通过kubectl命令行来实现。用户既可以使用Grafana来获取Knative的应用参数,又可以使用Knative自带的autoscaler、或其他与Kubernetes兼容的scaler,来实现扩展。
不过,Knative仍处于深入开发阶段,它的许多专有工具也还处于初级阶段。其中,knctl是一款专门的Knative命令行工具。它可以方便您使用Kubernetes的其他工具,来管理Knative。而ko工具则可以被用于在Knative构建Go语言的应用,并削减容器的构建步骤。
由Bitnami创建的Kubeless,能够帮助开发人员轻松地安装各种常见的Web应用程序栈。Kubeless使用Kubernetes原生的各种定制化资源定义(Custom Resource Definitions),来处理各种功能函数,我们可以将它理解为Kubernetes metaphor和Kubeless各项功能之间的抽象层。
Kubeless不但能够支持.NET、Java、Python、Node.js、PHP、Ruby等大多数编程语言,而且支持为云原生开发的Ballerina语言的运行时(runtimes)平台。此处的运行时是指各种Docker镜像。当然,Kubeless也拥有一种特定的包格式,可使用Dockerfiles来构建其自定义的运行时。
Kubeless的另一个便利性体现在它的CLI上。该CLI与AWS Lambda的CLI有些类似。使用它,您可以在移出AWS Lambda时,仍保留各种现有的管理脚本,而且不必学习一套全新的命令集。Kubeless还可以被作为无服务器框架的插件,实现在各种架构上构建无服务器应用。
OpenFaaS的宗旨是:让开发人员不再为部署Docker容器而烦恼。因此,它既可以被部署到Kubernetes,也可以用于本地测试或低需求的Docker Swarm集群中。您可以使用OpenFaaS CLI来构建、推送、以及部署各种Docker镜像到集群里,以运行相应的功能。虽然您完全可以自行发布,但是您也可以使用它预先用Python、Node.js、.NET、Ruby、Java或PHP 7编写的现成模板,来部署应用程序。另外,OpenFaaS CLI的内置web UI还允许您创建各种新的功能,以及管理集群中的密钥。
作为OpenFaaS的另一个版本,OpenFaaS Cloud为开发人员重新打包了OpenFaaS的各项特性,集成了GitHub和自托管版本的GitLab,提供了CI/CD,密钥管理,HTTPS,以及向Slack的事件反馈能力。OpenFaas Cloud是一款免费的开源产品,而它的托管版本,目前也仍然可以被免费使用。
Apache OpenWhisk可谓一个通用的无服务器平台。OpenWhisk不但支持在Kubernetes上运行容器,还支持Mesos和Docker Compose。OpenWhisk提供了针对Kubernetes的Helm charts工具,以部署各种应用。大家比较熟悉的IBM Cloud Functions就是基于OpenWhisk项目的,因此它可以直接使用OpenWhisk CLI的各种命令。
不同于其他大多数无服务器的Kubernetes框架,OpenWhisk是用Scala语言编写而成,并非用于编写Kubernetes和Docker的Go语言。所以您可能需要花点时间,去了解一下它的编程思想。
在应用运行时选项方面,OpenWhisk封装了Java、Node.js、Python、Ruby、PHP和.NET。另外,它的高级语言选项还包括:Scala、Ballerina、Swift、以及Rust。由于其运行时属于Docker容器类型,因此您很容易通过它来实现自己的应用。