基于Kubernetes的原生 Serverless 框架 Kubeless实践

Serverless概念首次出现在2012年,Kubeless是基于Kubernetes的原生无服务器框架,其允许用户部署少量的代码(函数),而无需担心底层架构。它被设计部署在Kubernetes集群之上,并充分利用Kubernetes的特性及资源类型。可以克隆在AWS Lambda,Azure Functions、Google Cloud Functions上的内容。由于 Kubeless 的功能特性是建立在Kubernetes上的,所以对于熟悉 Kubernetes的人来说非常容易部署 Kubeless, 其主要实现是将用户编写的函数在Kubernetes中转变为 CRD( Custom Resource Definition,自定义资源), 并以容器的方式运行在集群中。

一 Kubeless背景

Serverless介绍

Serverless概念首次出现在2012年,由云基础设施服务提供商Iron.io的副总裁Ken Fromm在《Why the future of software and apps is serverless》4一文中阐述,在2014年亚马逊发布了AWS Lambda之后,Serverless开始变得流行了起来,国内外的各大云厂商都争相跟进。

2016年8月,martinfowler.com网站上发表的《Serverless》 5 一文中对Serverless概念做了详细阐述,简单来说,Serverless可以理解为以下内容:

由开发者实现的服务端逻辑运行在无状态的计算容器中,通常可以理解为Faas(Functions as a Service)函数即服务的形式,它由事件触发,完全被第三方管理,目前使用最广泛的为AWS的Lambda。

而Serverless与容器和虚拟机的关系可由下图所示:

图1 从物理机到函数计算

由上图可以看出serverless是构建在虚拟机和容器之上的,与应用关系更加密切。

开源框架 Kubeless 是由 2017 年 3 月被 Bitnami 收购的软件供应商 Skippbox开发的。 Kubeless 是一个 Kubernetes 本地无服务器框架,具有符合 AWS Lambda CLI 的命令行界面( CLI)。

Kubeless官方对其定义是这样的:

     Kubeless is a Kubernetes-native serverless framework that lets you deploy small bits of code (functions) without having to worry about the underlying infrastructure. It is designed to be deployed on top of a Kubernetes cluster and take advantage of all the great Kubernetes primitives. If you are looking for an open source serverless solution that clones what you can find on AWS Lambda, Azure Functions, and Google Cloud Functions, Kubeless is for you!1

Kubeless是基于Kubernetes的原生无服务器框架,其允许用户部署少量的代码(函数),而无需担心底层架构。它被设计部署在Kubernetes集群之上,并充分利用Kubernetes的特性及资源类型。可以克隆在AWS Lambda,Azure Functions、Google Cloud Functions上的内容。

Kubeless主要特点可以总结为以下几个方面:

  • 支持Python, Node.js, Ruby, PHP, Golang, .NET, Ballerina和自定义运行时。
  • Kubeless CLI符合AWS Lambda CLI。
  • 事件触发器使用Kafka消息系统和HTTP。
  • Prometheus默认监视函数的调用和延迟。
  • Serverless框架插件。

由于 Kubeless 的功能特性是建立在Kubernetes上的,所以对于熟悉 Kubernetes的人来说非常容易部署 Kubeless, 其主要实现是将用户编写的函数在Kubernetes中转变为 CRD( Custom Resource Definition,自定义资源), 并以容器的方式运行在集群中。

 

二 Kubeless架构

1 Kubeless基本组成

Kubeless主要由以下三部分组成:

  • Functions
  • Triggers
  • Runtime

下面针对这三个组成部分,进行详细介绍。

Functions

Functions 表示要执行的代码,即为函数,在Kubeless中函数包含有关其运行时的依赖、构建等元数据。函数具有独立生命周期,并支持以下方法:
(1) Deploy: Kubeless 将函数部署为 Pod的形式运行在Kubernetes集群中,此步骤会涉及构建函数镜像等操作。
(2)Execute:执行函数,不通过任何事件源调用。
(3)Update:修改函数元数据。
(4)Delete:在Kubernetes集群中删除函数的所有相关资源。
(5)List:显示函数列表。
(6)Logs:函数实例在Kubernetes中生成及运行的日志。

Triggers

Triggers表示函数的事件源,当事件发生时,Kubeless确保最多调用一次函数,Triggers可以与单个功能相关联,也可与多个功能相关联,具体取决于事件源类型。Triggers与函数的生命周期解耦,可以进行如下操作:
(1)Create:使用事件源和相关功能的详细信息创建 Triggers。
(2)Update: 更新 Triggers元数据。
(3)Delete:删除Triggers及为其配置的任何资源。
(4)List:显示Triggers列表。

Runtime

函数使用语言因不同用户的喜好通常多样化, Kubeless 为用户带来了几乎所有的主流函数运行时, 目前含有[3]
(1) Python: 支持2.7、3.4、3.6版本。
(2) NodeJS: 支持6、8版本。

(3) Ruby: 支持2.4版本。
(4) PHP: 支持7.2版本。
(5) Golang: 支持1.10版本。
(6) .NET: 支持2.0版本。

(7) Ballerina: 支持0.975.0版本。
在Kubeless中,每个函数运行时都会以镜像的方式封装在容器镜像中,通过在Kubeless配置中引用这些镜像来使用,可以通过 Docker CLI 查看源代码。

2 Kubeless设计方式

与其它开发框架一样, Kubeless也有自己的设计方式,Kubeless利用Kubernetes中的许多概念来完成对函数实例的部署,主要使用了 Kubernetes以下特性2

(1) CRD( 自定义资源) 用于表示函数。
(2) 每个事件源都被当作为一个单独的 Trigger CRD 对象。
(3) CRD Controller 用于处理与 CRD 对象相应的 CRUD 操作。
(4) Deployment/Pod 运行相应的