使用Knative和Python的構建無伺服器事件驅動的應用 - Ron Nagar

banq發表於2019-06-19

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這樣的託管無伺服器平臺也可能適合您。

相關文章