「無伺服器架構」動手操作Knative -第2部分

2020-12-25 首席架構師智庫

在上一篇文章中,我討論了Knative用於快速部署和自動調整無伺服器容器。如果您希望您的服務由HTTP調用同步觸發,那麼Knative服務是很好的選擇。然而,在沒有伺服器的微服務世界中,異步觸發器更加常見和有用。這時,Knative三項賽就開始發揮作用了。

在Knative系列的第2部分中,我將介紹Knative事件並展示一些來自我的Knative教程的示例,這些示例介紹了如何將它與各種服務集成在一起。

什麼是Knative Eventing?

Knative事件處理與Knative服務密切相關,它為鬆散耦合的事件驅動服務提供了基元。典型的Knatives事件架構是這樣的:

主要有4個組成部分:

Source(也稱為Producer)從實際的源中讀取事件,並將事件向下轉發到一個通道,或者直接轉發到一個服務,這種情況比較少見。Channel從源接收事件,保存到其底層存儲(稍後詳細介紹),並向所有訂閱者展開。訂閱連接一個通道和一個服務(或另一個通道)。服務(也稱為消費者)是使用事件流的Knative服務。讓我們更詳細地看看這些。

來源,渠道和訂閱

Knative事件的最終目標是將事件從源路由到服務,這是通過我前面提到的原語實現的:源、通道和訂閱。

Source從實際源讀取事件並將它們轉發到下遊。到目前為止,Knative支持從Kubernetes、GitHub、谷歌雲發布/訂閱、AWS SQS主題、容器和CronJobs讀取事件。

一旦事件被拉入Knative,它就需要保存到內存中,或者保存到更持久的地方,比如Kafka或谷歌雲發布/訂閱。這發生在通道上。它有多個實現來支持不同的選項。

從Channel將事件傳遞給所有感興趣的Knative服務或其他通道。這可以是一對一的,也可以是扇出的。訂閱決定了這種交付的性質,並充當通道和Knative服務之間的橋梁。

現在我們已經了解了Knative三項賽的基礎知識,讓我們來看一個具體的例子。

Hello World事件

對於Hello World事件,讓我們讀取來自谷歌雲發布/訂閱的消息並在Knative服務中註銷它們。我的你好世界三項賽教程有所有的細節,但在這裡重述,這是我們需要設置:

從谷歌雲發布/訂閱讀取消息的GcpPubSubSource。將消息保存在內存中的通道。連結頻道到Knative服務的訂閱。接收消息並註銷的Knative服務。gcp-pubsub-source。yaml定義了GcpPubSubSource。它指向一個名為測試的發布/訂閱主題,它有訪問發布/訂閱的憑證,並指定應該像這樣轉發哪個頻道事件:

apiVersion: sources.eventing.knative.dev/v1alpha1kind: GcpPubSubSourcemetadata:name: testing-sourcespec:gcpCredsSecret: # A secret in the knative-sources namespacename: google-cloud-keykey: key.jsongoogleCloudProject: knative-atamel # Replace thistopic: testingsink:apiVersion: eventing.knative.dev/v1alpha1kind: Channelname: pubsub-test

接下來,我們使用Channel .yaml定義通道。在這種情況下,我們只是在內存中保存消息:

apiVersion: eventing.knative.dev/v1alpha1kind: Channelmetadata:name: pubsub-testspec:provisioner:apiVersion: eventing.knative.dev/v1alpha1kind: ClusterChannelProvisionername: in-memory-channel

繼續創建源和通道:

kubectl apply -f gcp-pubsub-source.yamlkubectl apply -f channel.yaml

你可以看到源和通道被創建,有一個源pod也被創建:

kubectl get gcppubsubsource NAME AGE testing-source 1mkubectl get channel NAME AGE pubsub-test 1mkubectl get pods NAME READY STATUS gcppubsub-testing-source-qjvnk-64fd74df6b-ffzmt 2/2 Running

最後,我們可以創建Knative服務,並使用訂閱伺服器中的訂閱將其連結到subscriber.yaml文件:

apiVersion: serving.knative.dev/v1alpha1 kind: Servicemetadata: name: message-dumper-csharp spec: runLatest: configuration: revisionTemplate: spec: container: # Replace {username} with your actual DockerHub image: docker.io/{username}/message-dumper-csharp:v1--- apiVersion: eventing.knative.dev/v1alpha1 kind: Subscription metadata: name: gcppubsub-source-sample-csharp spec: channel: apiVersion: eventing.knative.dev/v1alpha1 kind: Channel name: pubsub-test subscriber: ref: apiVersion: serving.knative.dev/v1alpha1 kind: Service name: message-dumper-csharp

如您所見,message-dump -csharp只是一個普通的Knative服務,但它是通過其訂閱的Knative事件異步觸發的。

kubectl apply -f subscriber.yamlservice.serving.knative.dev "message-dumper-csharp" created subscription.eventing.knative.dev "gcppubsub-source-sample-csharp" configured

一旦你kubectl apply所有的yaml文件,你可以使用gcloud發送消息到發布/訂閱主題:

gcloud pubsub topics publish testing --message="Hello World"

你應該可以看到pods 的服務創建:

kubectl get podsNAME READYgcppubsub-testing-source-qjvnk-64fd74df6b-ffzmt 2/2 Running 0 3mmessage-dumper-csharp-00001-deployment-568cdd4bbb-grnzq 3/3 Running 0 30s

服務將Base64編碼的消息記錄在Data下面:

info: message_dumper_csharp.Startup[0]C# Message Dumper received message: {"ID":"198012587785403","Data":"SGVsbG8gV29ybGQ=","Attributes":null,"PublishTime":"2019-01-21T15:25:58.25Z"}info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]Request finished in 29.9881ms 200

查看我的Hello World事件教程,了解更多關於步驟和實際代碼的細節。

與雲存儲和Vision API集成

當您試圖以無縫的方式連接完全不相關的服務時,Knative事件就會真正地發揮作用。在我的集成與視覺API教程中,我展示了如何使用Knative事件連接谷歌雲存儲和谷歌雲視覺API。

雲存儲是一種全球可用的數據存儲服務。可以將bucket配置為在保存映像時發出發布/訂閱消息。然後,我們可以使用Knative事件偵聽這些發布/訂閱消息,並將它們傳遞給Knative服務。在服務中,我們使用圖像進行一個Vision API調用,並使用機器學習從中提取標籤。所有的細節都在教程中進行了解釋,但是我想在這裡指出一些事情。

首先,在Knative中,所有的出站流量在預設情況下都會被阻塞。這意味著在默認情況下,您甚至不能從Knative服務調用Vision API。這最初讓我感到驚訝,所以請確保配置了網絡出站訪問。

其次,無論何時將圖像保存到雲存儲中,它都會發出CloudEvents。Knative三項賽通常與CloudEvents一起使用。你需要將傳入的請求解析為CloudEvents,並提取你需要的信息,如事件類型和圖像文件的位置:

var cloudEvent = JsonConvert.DeserializeObject<CloudEvent>(content); var eventType = cloudEvent.Attributes["eventType"]; var storageUrl = ConstructStorageUrl(cloudEvent);

有了這些信息,很容易為圖像構造存儲URL並使用該URL進行Vision API調用。完整的原始碼在這裡解釋,但這裡是相關的部分:

var visionClient = ImageAnnotatorClient.Create();var labels = await visionClient.DetectLabelsAsync(Image.FromUri(storageUrl), maxResults: 10);

一旦代碼準備好了,我們就可以通過定義一個ubscriber.yaml將服務掛接到Knative事件上。它和以前很相似。我們正在重用現有的源和通道,所以我們不必重新創建它們。我們只是創建一個新的訂閱指向我們新的Knative服務與願景API容器:

apiVersion: serving.knative.dev/v1alpha1kind: Servicemetadata:name: vision-csharpspec:runLatest:configuration:revisionTemplate:spec:container:# Replace {username} with your actual DockerHubimage: docker.io/{username}/vision-csharp:v1---apiVersion: eventing.knative.dev/v1alpha1kind: Subscriptionmetadata:name: gcppubsub-source-vision-csharpspec:channel:apiVersion: eventing.knative.dev/v1alpha1kind: Channelname: pubsub-testsubscriber:ref:apiVersion: serving.knative.dev/v1alpha1kind: Servicename: vision-csharp

一旦使用kubectl apply創建了所有內容,無論何時將映像保存到雲存儲桶中,都應該看到該映像的Knative服務日誌標籤。

例如,我有一張我最喜歡的地方的照片:

當我把圖片保存到桶裡時,我可以在日誌中看到Vision API中的以下標籤:

info: vision_csharp.Startup[0]This picture is labelled: Sea,Coast,Water,Sunset,Horizoninfo: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]Request finished in 1948.3204ms 200

可以看到,我們使用Knative事件將一個服務(雲存儲)連接到另一個服務(Vision API)。這只是一個例子,但可能性是無限的。在本教程的翻譯API集成部分中,我展示了如何將發布/訂閱連接到翻譯API。

這就是Knative三項賽。在本系列的下一篇也是最後一篇文章中,我將討論Knative構建。

相關焦點

  • 「無伺服器架構」Knative Serving 介紹
    Knative Serving建立在Kubernetes和Istio之上,以支持無伺服器應用程式和功能的部署和服務。服務易於上手,並且可以擴展以支持高級方案。Knative Serving項目提供了中間件原語,這些原語可實現:快速部署無伺服器容器自動放大和縮小到零Istio組件的路由和網絡編程部署的代碼和配置的時間點快照
  • 「雲原生」節儉K8s Operators第3部:利用Knative縮減到零的能力
    在本系列博客的第1部分中,我們介紹了這樣一種想法,即Kubernetes Operator(在大規模部署時)可以消耗大量資源,無論是實際資源消耗還是可調度容量的消耗。我們還介紹了一種想法,即無伺服器技術可以通過在活動控制器部署空閒時減少其規模來減少對Kubernetes集群的影響。
  • 「全棧之路」Web前端開發的後端指南
    5.2 資料庫部署你可以在一臺伺服器上託管資料庫,但在生產方案中更常見的是將其託管在某種形式的集群2臺或更多伺服器上。這可確保資料庫具有高可用性並降低數據丟失的風險,例如,如果一臺伺服器的存儲損壞。近年來,少數雲託管的「無伺服器資料庫」已經可用。這些是可以通過API調用的資料庫,但你無需設置伺服器來託管它們。
  • 「謝燦asp.net三層架構」3、創建增刪改查及複雜操作的存儲過程
    簡而言之,存儲過程就是SQL Server為了實現特定任務,而將一些需要多次調用的固定操作語句編寫成程序段,這些程序段存儲在伺服器上,有資料庫伺服器通過程序來調用。存儲過程可以封裝複雜的資料庫操作,簡化操作流程,例如對多個表的更新,刪除等。可實現模塊化的程序設計,存儲過程可以多次調用,提供統一的資料庫訪問接口,改進應用程式的可維護性。
  • Knative:基於 Kubernetes 的 severless 開源平臺
    據谷歌開源博客報導,Google 和其他供應商聯合發布了 Knative。
  • 谷歌表示 Knative 不會捐贈給任何基金會
    Knative 是谷歌開源的一套 Serverless 架構方案,它擴展了 Kubernetes,專注於解決容器為核心的 Serverless
  • 如何用 React Native 開發一款電商 App?
    你可以利用JS來製作web app、後臺伺服器、移動端app。React Native不僅可以像Cordova/Ionic/Phonegap等利用WebView架構和Javascript進行移動端APP開發,而且支持native編譯,因此如果有需要也可以編寫native代碼。
  • ReactNative 的組件架構設計
    【編者按】本篇作者 @cnsnake11,寫的是 react native 的架構設計,如果你用 react
  • App產品測評 | 在家就可以操作的STEAM動手實驗課
    這名字聽起來就古靈精怪的,據說App內容都是按照美式幼兒園的授課大綱與教學目標研發的,主體內容為STEAM動手實驗課,簡單來說就是打通了線上線下場景互動,孩子可以跟著視頻親自動手做實驗,實現與歐美幼兒同步學習。
  • 「學習筆記」HTML基礎
    排版標籤」主要和css搭配使用,顯示網頁結構的標籤,是網頁布局最常用的標籤。div和span標籤:是沒有語義的,是我們網頁布局最主要的2個盒子。「2. 排版標籤」「3.(找目標)  <h3 id="two">第2集</h3> 2. 使用<a href="#id名">連結文本</a>創建連結文本(被點擊的)   <a href="#two">   「6.
  • 無伺服器計算的機器學習,出路在哪裡?
    對於開發人員來說,這些 API 是作為一個自動擴縮容和透明操作的服務提供的,所以對於開發人員來說,這種服務方式也是無伺服器的。從技術實現的角度分析,無伺服器計算依靠雲基礎設施而不是用戶來自動解決資源調配和管理的挑戰。
  • 「張江jobs」WiFi萬能鑰匙|iOS、Android、PHP、後端、測試、數據分析、廣告投放、審計等崗位熱招
    更多張江招聘信息:-「張江jobs」雲從科技|產品、測試、C++、前端、Java架構、語音算法、機器學習、嵌入式、系統架構等崗位熱招-「張江jobs」亮風臺|產品、算法、QT、音視頻、C++等崗位熱招-「張江jobs」縱目科技|地圖導航研發、自動駕駛軟體、應用開發、架構師、研發總監、Linux、iOS
  • 創投日報|「4iNLOOK」一年內累計融資近 2 億元;「Califia Farms...
    >渡鴉科技創始人再創業,「rct studio」用AI引擎做沉浸式全互動娛樂36氪最近接觸到了一家新型創意娛樂工作室——rct studio,公司成立於2018年,致力於通過人工智慧研發下一代沉浸式交互娛樂體驗,公司曾入選美國最大創業孵化器 Y combinator, 同時是YC China第一批學員……(查看更多請點這裡)
  • Knative 核心概念介紹:Build、Serving和Eventing 三大核心組件
    Knative 主要由 Build、Serving 和 Eventing 三大核心組件構成。Knative 正是依靠這三個核心組件,驅動著 Knative 這艘 Serverless 巨輪前行。下面讓我們來分別介紹一下這三個核心組件。
  • 反事實推理、特徵分離,「因果表示學習」的最新研究都在講什麼?
    當每個 RIM 的輸入和輸出是一組對象或實體(每一個都與鍵和值向量相關聯)時,RIM 處理就變成了一個通用的對象屬性的處理機器,它可以在類似於程式語言中變量的意義上操作「變量」:作為函數的可交換參數。因此,如果單個 RIM 可以用類型化參數表示這些「函數」,那麼它們可以「綁定」到當前可用且最適合它的任何輸入(根據它的注意力得分):「輸入注意力」機制將查看候選輸入目標的鍵,並評估其「類型」是否與 RIM 期望的匹配(在查詢中指定)。
  • 程式設計師幹活:什麼是REST架構和K&T決策?
    REST本身只是為分布式超媒體系統設計的一種架構風格,而不是標準。 基於Web的架構,實際上就是各種規範的集合,這些規範共同組成了Web架構。比如Http協議,比如客戶端伺服器模式,這些都是規範。每當我們在原有規 範的基礎上增加新的規範,就會形成新的架構。而REST正是這樣一種架構,他結合了一系列的規範,而形成了一種新的基於Web的架構風格。
  • 3D模型學會了「唱、跳、Rap、籃球」,GitHub網友也沉迷雞你太美
    器之心報導機器之心編輯部繼 B 站之後,GitHub 網友也開始沉迷「雞你太美」,讓 3D 姿態也學會了「唱、跳、Rap、籃球」,而且動作準確度和連貫性似乎一點也不輸練習時長兩年半的練習生。看了這段 demo 之後,網友戲稱,「你的律師函已經在路上了」。這段「看到停不下來」的 demo 來自一位用戶名為「zh-plus」的 GitHub 網友。他用 CVPR 2019 接收論文中的一項技術實現了這種效果。
  • iPhone 卡貼機「無鎖」了,天下有這麼好的事兒嗎?
    本篇內容由 GeekBar 提供部分技術支持。幾天前,一則重磅消息席捲了蘋果愛好者的圈子:iPhone「卡貼機」被完全破解,變成了真正的「無鎖機」。而目前的卡貼技術,其實是往手機卡槽裡墊一張「晶片」,這張晶片可以把任意一串數字燒製成手機卡的身份證號(ICCID),並且代替手機卡原本的身份證。所以,理論上來說只要你找到一個蘋果伺服器承認的 ICCID 碼,卡貼就能幫你順利激活。
  • ...的「統一場」:從與 WL 算法、組合優化算法的聯繫看 GNN 的表達...
    與其它關於 GNN 的綜述(介紹 GNN 的架構和應用)不同,本文重點關注 GNN 的理論特性。本文的組織結構如下:在本章的其餘部分中,我們將介紹本文使用的數學符號並簡要回顧標準的 GNN 模型。在第 2 章中,我們看到 GNN 不能使用基本的參數和具體的示例來區分某些圖。在第 3 章中,我們介紹了 GNN 和 WL 算法之間的聯繫。
  • 華為18級架構師分享百萬級MySQL筆記,基礎+優化+架構一鍵搞定
    前言MySQL不用多說,大家都知道它是目前最為活躍熱門的開源資料庫,由於成本低,操作簡易的特點,所以在網際網路企業中被廣泛使用,即使是頭部的BATJ。由此可見,想要在網際網路行業混得風生水起,或者說想要進入BATJ等一線網際網路公司,那麼熟練掌握MySQL必定是一塊必要的敲門磚。