Knative Eventing是一個旨在滿足雲原生開發的常見需求的系統,并提供可組合的原語以啟用後期綁定事件源和事件使用者。
設計概述
Knative Eventing是圍繞以下目标設計的:
- 原始事件服務是松散耦合的。這些服務可以在各種平台上(例如Kubernetes,VM,SaaS或FaaS)獨立開發和部署。
- 事件生産者和事件消費者是獨立的。任何生産者(或源)都可以在有活動的事件使用者監聽之前生成事件。在有生産者建立事件之前,任何事件消費者都可以對事件或事件類别表示興趣。
- 可以将其他服務連接配接到Eventing系統。這些服務可以執行以下功能:建立新的應用程式而無需修改事件生産者或事件使用者。從生産者那裡選擇事件的特定子集并将其作為目标。
- 確定跨服務的互操作性。Knative Eventing與由CNCF Serverless WG開發的CloudEvents規範一緻。
事件消費者
為了能夠傳遞到多種類型的服務,Knative Eventing定義了兩個通用接口,可以由多個Kubernetes資源實作:
- 可尋址對象能夠接收和确認通過HTTP發送到其status.address.url字段中定義的位址的事件。作為一種特殊情況,核心的Kubernetes Service對象還實作了Addressable接口。
- 可調用對象能夠接收通過HTTP傳遞的事件并轉換該事件,進而在HTTP響應中傳回0或1個新事件。可以以與處理來自外部事件源的事件相同的方式來進一步處理這些傳回的事件。
事件經紀人和觸發器
從v0.5開始,Knative Eventing定義了Broker和Trigger對象,使過濾事件更加容易。
代理提供了一系列事件,可以通過屬性選擇事件。它接收事件并将其轉發給由一個或多個比對觸發器定義的訂戶。
觸發器描述了事件屬性的過濾器,應将其傳遞給可尋址對象。您可以根據需要建立任意數量的觸發器。

事件系統資料庫
從v0.6開始,Knative Eventing定義了一個EventType對象,以使消費者更容易發現可以從不同的Broker消費的事件類型。
系統資料庫包含事件類型的集合。系統資料庫中存儲的事件類型包含(全部)必需的資訊,供消費者建立觸發器而不使用某些其他帶外機制。
若要了解如何使用系統資料庫,請參閱事件系統資料庫文檔。
事件頻道和訂閱
Knative Eventing還定義了事件轉發和持久層,稱為Channel。每個通道都是一個單獨的Kubernetes自定義資源。使用訂閱将事件傳遞到服務或轉發到其他管道(可能是其他類型)。這使群集中的消息傳遞可以根據需求而變化,是以某些事件可能由記憶體中的實作處理,而其他事件則可以使用Apache Kafka或NATS Streaming持久化。
請參閱管道實施清單。
更進階别的事件構造
在某些情況下,您可能希望一起使用一組協作功能,對于這些用例,Knative Eventing提供了兩個附加資源:
- 序列提供了一種定義功能的有序清單的方法。
- 并行提供了一種定義事件分支清單的方法。
未來的設計目标
下一個Eventing版本的重點是使事件源的易于實作。源使用Kubernetes Custom Resources管理來自外部系統的事件的注冊和傳遞。在Eventing工作組中了解有關Eventing開發的更多資訊。
安裝
目前,Knative Eventing要求安裝的Istio版本> = 1.0或Gloo版本> = 0.18.16的Knative Serving。按照說明在您選擇的平台上進行安裝。
架構
事件基礎結構目前支援兩種形式的事件傳遞:
- 從源直接傳遞到單個服務(可尋址端點,包括Knative服務或核心Kubernetes服務)。在這種情況下,如果目标服務不可用,則源負責重試或排隊事件。
- 使用管道和訂閱從源或服務響應向多個端點進行扇出傳遞。在這種情況下,通道實作可確定将消息傳遞到請求的目标,并且如果目标服務不可用,則應緩沖事件。
實際的消息轉發是由多個資料平面元件實作的,這些元件提供可觀察性,持久性以及不同消息傳遞協定之間的轉換。
來源
每個源都是一個單獨的Kubernetes自定義資源。這允許每種類型的Source定義執行個體化Source所需的參數和參數。Knative Eventing在sources.eventing.knative.dev API組中定義了以下Sources。以下類型以golang格式聲明,但在YAML中可以表示為簡單清單等。所有源都應屬于源類别,是以您可以使用kubectl get源列出所有現有源。目前實作的源描述如下。
除了核心資源(如下所述)外,您還可以安裝其他資源。
如果您需要可用的Source實作中未涵蓋的Source,則提供有關編寫自己的Source的教程。
如果您的代碼需要将事件作為其業務邏輯的一部分發送,并且不适合源模型,請考慮将事件直接饋送給Broker。
KubernetesEventSource
每當建立或更新Kubernetes事件時,KubernetesEventSource都會觸發一個新事件。
規格字段:
- namespace:string要監視事件的名稱空間。
- serviceAccountname:string用于連接配接到Kubernetes apiserver的ServiceAccount的名稱。
- sink:ObjectReference對應該接收事件的對象的引用。
請參閱Kubernetes事件源示例。
GitHub源
GitHubSource為標明的GitHub事件類型觸發一個新事件。
規格字段:
- ownerAndRepository:string從中接收事件的GitHub所有者/組織和存儲庫。該存儲庫可以保留下來以接收來自整個組織的事件。
- eventTypes:[]字元串“ Webhook事件名稱”格式的事件類型清單(lower_case)。
- accessToken.secretKeyRef:包含用于配置GitHub Webhook的GitHub通路令牌的SecretKeySelector。必須設定此之一或secretToken。
- secretToken.secretKeyRef:SecretKeySelector,其中包含用于配置GitHub Webhook的GitHub秘密令牌。必須設定其中之一或accessToken。
- serviceAccountName:string用來運作容器的ServiceAccount的名稱。
- sink:ObjectReference對應該接收事件的對象的引用。
- githubAPIURL:字元串可選字段,用于指定API請求的基本URL。如果未指定,則預設為公共GitHub API,但可以将其設定為要與GitHub Enterprise一起使用的域端點,例如https://github.mycompany.com/api/v3/。應始終在該基本URL後面加上斜杠。
參見GitHub Source示例。
GcpPubSubSource
每次在Google Cloud Platform PubSub主題上釋出消息時,GcpPubSubSource都會觸發一個新事件。
規格字段:
- googleCloudProject:字元串擁有該主題的GCP項目ID。
- topic:字元串PubSub主題的名稱。
- serviceAccountName:字元串用于通路gcpCredsSecret的ServiceAccount的名稱。
- gcpCredsSecret:ObjectReference對Secret的引用,其中包含用于與PubSub對話的GCP重新整理令牌。
- sink:ObjectReference對應該接收事件的對象的引用。
請參閱GCP PubSub來源示例。
AwsSqsSource
每次在AWS SQS主題上釋出事件時,AwsSqsSource都會觸發一個新事件。
規格字段:
- queueURL:從中提取事件的SQS隊列的URL。
- awsCredsSecret:用于輪詢AWS SQS隊列的憑證。
- sink:ObjectReference對應該接收事件的對象的引用。
- serviceAccountName:字元串用于通路awsCredsSecret的ServiceAccount的名稱。
ContainerSource
ContainerSource将執行個體化一個容器映像,該映像可以生成事件,直到ContainerSource被删除。例如,可以使用它來輪詢FTP伺服器上的新檔案,或在設定的時間間隔内生成事件。
規格字段:
- image(必填):字元串要運作的容器的docker鏡像。
- args:[] string指令行參數。如果未提供--sink标志,則将添加一個并用接收器對象的DNS位址填充。
- env:map [string] string要在容器中設定的環境變量。
- serviceAccountName:string用來運作容器的ServiceAccount的名稱。
- sink:ObjectReference對應該接收事件的對象的引用。
CronJobSource
CronJobSource根據給定的Cron時間表觸發事件。
規格字段:
- schedule(必填):字元串Cron格式的字元串,例如0 * * * *或@hourly。
- data:字元串發送到下遊接收器的可選資料。
- serviceAccountName:string用來運作容器的ServiceAccount的名稱。
- sink:ObjectReference對應該接收事件的對象的引用。
請參閱Cronjob源示例。
Kafka資
KafkaSource從Apache Kafka叢集讀取事件,并将事件傳遞給Knative Serving應用程式,以便可以使用它們。
規格字段:
- ConsumerGroup:字元串Kafka消費者組的名稱。
- bootstrapServers:字元串用逗号分隔的Kafka Broker主機名:端口對清單。
- topic:字元串,用于吸收消息的Kafka主題的名稱。
- net:可選的網絡配置。
- sasl:可選的SASL身份驗證配置。
- enable:布爾值如果為true,則使用SASL進行身份驗證。
- user.secretKeyRef:包含要使用的SASL使用者名的SecretKeySelector。
- password.secretKeyRef:包含要使用的SASL密碼的SecretKeySelector。
- tls:可選的TLS配置。
- enable:布爾值如果為true,則在連接配接時使用TLS。
- cert.secretKeyRef:包含要使用的用戶端證書的SecretKeySelector。
- key.secretKeyRef:包含要使用的用戶端密鑰的SecretKeySelector。
- caCert.secretKeyRef:包含要驗證伺服器證書時使用的伺服器CA憑證的SecretKeySelector。
參見Kafka Source示例。
CamelSource
CamelSource是事件源,可以代表提供使用者端并允許将事件釋出到可尋址端點的任何現有Apache Camel元件。每個Camel端點都具有URI的形式,其中方案是要使用的元件的ID。
CamelSource要求将Camel-K安裝到目前名稱空間中。
規格字段:
- 來源:有關應建立的駱駝來源類型的資訊。
- component:預設類型的源,可通過配置單個Camel元件來建立EventSource。
- uri:字元串包含應用于将事件推送到目标接收器的駱駝URI。
- 屬性:鍵/值映射包含Camel全局選項或特定于元件的配置。每個現有的Apache Camel元件的文檔中都提供了選項。
- serviceAccountName:字元串,可用于運作源容器的可選服務帳戶。
- image:字元串(可選)用于源pod的可選基本圖像,主要用于開發目的。
參見CamelSource示例
微信公衆号