在 Kubernetes 上实现无服务器化的五种方式

我们常听说的“无服务器化”,有时也被称为“事件驱动的计算 (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

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

最初是由谷歌创建的 Knative,能够协助用户在 Kubernetes 中运行各种无服务器的应用。它主要关注的是,在生产环境中无服务器部署的通用模式。Knative 在有效管理和利用多个 Kubernetes 组件方面,积累了许多丰富的专业知识。

为了管理 Kubernetes,Knative 除了需要路由系统和诸如 Istio 之类的服务网格之外,还会借用到Ambassador%E5%92%8CGloo(https://docs.solo.io/gloo/latest/) 等其他选项。虽然,这会带来一些额外的设置工作,但是该项目的详细指南已经包含了各种云服务,以及诸如 vanilla Kubernetes 的环境说明。

通过利用或扩展现有的 Kubernetes 工具和功能,Knative 能够通过 YAML 文件和为您交付 Docker 容器的方式,来配置各种应用程序与函数。而对于各种定义的添加、修改或删除则可通过 kubectl 命令行来实现。用户既可以使用 Grafana 来获取 Knative 的应用参数,又可以使用 Knative 自带的 autoscaler、或其他与 Kubernetes 兼容的 scaler,来实现扩展。

不过,Knative 仍处于深入开发阶段,它的许多专有工具也还处于初级阶段。其中,knctl 是一款专门的 Knative 命令行工具。它可以方便您使用 Kubernetes 的其他工具,来管理 Knative。而 ko 工具则可以被用于在 Knative 构建 Go 语言的应用,并削减容器的构建步骤。

Kubeless

由 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

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 是一款免费的开源产品,而它的托管版本,目前也仍然可以被免费使用。

OpenWhisk

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 容器类型,因此您很容易通过它来实现自己的应用。

OpenWhisk 在部署方面的一个便捷特性是“zip actions”。它可以使用代码包的清单文件,将某个代码的 zip 包、以及多个辅助文件指向 OpenWhisk。而 OpenWhisk 则可据此创建一项后续操作。同时,OpenWhisk CLI 还可以通过工具将代码的目录树转换成一个归档文件。它的服务包目录,能够方便您将应用插入到诸如 GitHub、Slack、Apache Kafka 或 Jira 等常见的第三方产品之中。

原文标题:5 ways to do serverless on Kubernetes,作者:Serdar Yegulalp

【51CTO 译稿,合作站点转载请注明原文译者和出处为 51CTO.com】