使用Knative和Python的构建无服务器事件驱动的应用 - Ron Nagar


Knative是Kubernetes一个扩展,它提供了一套工具来部署无服务器。
Knative由以下主要组件构建:

  1. 构建  - 源到容器的构建编排。
  2. 事件Eventing  - 管理和交付事件。
  3. 服务  - 请求驱动的计算,可以扩展到零。

在本文中,我们将重点介绍Eventing组件。它为无服务器事件驱动架构提供基础架构,在触发事件时运行容器。Knative Eventing支持不同的事件源(例如GitHub事件,Pub / Sub等),您甚至可以编写自己的自定义事件源

我们之所以选择Knative而不是其他传统的无服务器平台(Functions,Lambda等),原因如下:

  1. 它由容器驱动,这意味着您可以在每种语言或框架中编写您喜欢的代码,只要您可以从中创建容器。通常,其他无服务器平台将您限制为它们支持的特定运行时环境。
  2. 资源是完全可定制的(CPU,GPU,网络等),只要您的Kubernetes集群配备了您可以使用的相关资源。就像每个Kubernetes部署一样,您必须说明您需要哪些资源。其他无服务器解决方案限制了资源,这些限制对我们来说通常是不行的。
  3. 没有超时限制,因此您可以部署长时间运行的进程(数据分析,图像处理等等)。使用其他无服务器平台无法实现这一点,因为它们通常具有超时限制。
  4. Eventing组件使用cloudevents作为发布事件的规范。基本上,它可以帮助我们编写事件源无关的代码。我们只需要了解事件的有效负载,但不必直接与事件源集成或以不同方式解析事件。

然而,它不是所有的玫瑰和蝴蝶,我们还必须提到缺点。Knative仍处于非常早期阶段(截至今日最新版本为0.6),这意味着API可能会在此过程中发生变化,升级可能会破坏您的部署。与其他无服务器解决方案相比,编写所有这些Kubernetes YAML并安装所有内容更加麻烦。

这就是为什么我们将Knative与其自己的集群隔离,并且不要将我们的日常集群与Knative集群混合。我们将相关服务与VPC和负载均衡器连接起来。

Knative Eventing和Python
我们使用Knative的主要用例是在新数据到达系统时运行长CPU限制数据分析过程。作为大多数数据分析任务,我们的数据科学团队使用Python编写。不幸的是,Knative Eventing示例是Go编写,其中唯一可用于轻松引导Knative Eventing项目的库也是Go。

我们知道我们必须为Python创建一个类似的开源库,以便其他人也可以使用它。经过一些研究并深入研究Go库代码,我们意识到我们需要实现的只是一个HTTP服务器,它监听POST请求并解析cloudevents有效负载。在幕后,Knative Eventing使用Knative Serving,并在一个事件中向Knative Eventing容器发出POST请求。我们很高兴分享我们的开源项目,python-kncloudevents,用于轻松集成Python和Knative Eventing 

python-kncloudevents的用法非常简单,你需要做的就是编写一个接收cloudevents作为参数的函数。要访问事件数据,您只需调用cloudevent的Data函数即可。现在要在事件触发时运行您的函数,您只需要创建CloudeventsServer实例并运行接受您的函数的start_receiver函数。

import sys
from kncloudevents import CloudeventsServer
import logging

logging.basicConfig(stream=sys.stdout, level=logging.INFO)


def run_event(event):
    try:
        logging.info(event.Data())
    except Exception as e:
        logging.error(f"Unexpected error: {e}")
        raise


client = CloudeventsServer()


结论
Knative非常适合构建无需资源的工作负载,这需要资源,运行时和持续时间的灵活性。Knative允许构建与依赖项和环境无关的事件驱动架构。
如果您需要运行需要定制环境的基于事件的流程,Knative是您的正确选择。如果您想构建快速简单的功能,那么像Functional或Lambda这样的托管无服务器平台也可能适合您。