使用Argo Events跟蹤k8s的資源變化

addtoany linkedin

作者:

Jean-François Dubeau,架構師,機器學習,ML解決方案在Kinaxis

在Kinaxis,我們大量使用Kubernetes(k8s)的高級分析和機器學習模塊和工作流程。我們的多步驟工作流包括數據準備、特征生成、超參數調優、模型訓練、推斷等等。Kubernetes提供自動化資源分配、可伸縮性和多雲能力,這對我們來說是必不可少的。

在這篇文章中,我們將解釋如何通過一些簡短的聲明式清單,使用Argo Events跟蹤對k8s資源的更改。万搏体育app官方平台在深入研究“如何”之前,讓我們先討論一下“為什麼”並描述一些概念。

用例

為什麼我們要跟蹤k8s資源的變化?万搏体育app官方平台我們希望允許用戶和一些外部係統得到k8s資源狀態修改的通知(例如工作流進度、故障等)。簡而言之,我們希望我們的係統能夠被外界觀察到,並且,做一個公共關係的類比,我們希望控製信息。

可觀察性

“使我們的係統可觀察”是什麼意思?可觀察性是係統的一種屬性,是基於可用輸出定義其內部狀態和行為的能力。我們經常依賴日誌、度量和跟蹤來深入了解係統狀態。隻要有可能,我們盡量以最少的幹擾方式收集這些信息。為此,我們使用諸如Fluentd普羅米修斯,Jaeger,但對於那些收集數據的工具,我們的應用程序通常需要進行儀器化,以生成和公開適當的數據。

K8s資源事件

Kubernetes API允許客戶端跟蹤對對象或集合的更改。換句話說,它允許客戶端“監視”資源更改。

當執行“監視”請求時,API服務器將響應一個更改流,每個更改通知都是一個JSON文檔。根據對對象或集合的更改以及建立監視的方式,將生成不同類型的事件(例如“ADDED”、“MODIFIED”和“DELETED”事件)。

這樣的事件日誌將允許我們“觀察”部分係統狀態。要使用它,我們可以編寫一個應用程序來管理這樣的手表和相關的事件。一個更合適的解決方案是使用告密者(來自k8s client-go包)。但有一個更簡單的解決方案:利用Argo Events。

阿爾戈號事件

阿爾戈是一套非常有趣和有用的開源工具。

其中一個,阿爾戈號事件,是Kubernetes上的事件管理多工具。Argo的網站將其描述為“Kubernetes的事件驅動工作流自動化框架”。如果您喜歡k8s上的事件驅動架構,那麼這個框架將在您的工具集(以及您的內心)中占有一席之地。

有4個重要的概念:

1)事件來源
事件源使用來自外部源的事件,將它們轉換為CloudEvents,並將它們發送到EventBus。

在撰寫本文時,Argo Events支持20多個不同的事件源:AMQPAWS SNSAWS SQSAzure活動中心Bitbucket都日曆,發射器,基於文件的事件,GCP PubSubGitHubGitLabHDFS、K8s R万搏体育app官方平台esources、卡夫卡MinIONATSNetApp StorageGridMQTTNSQ脈衝星複述,鬆弛條紋,人。
在此基礎上,可以添加自定義事件偵聽器。

2)觸發
觸發器是響應特定事件而執行的資源/万搏体育app官方平台工作負載。

Argo Events支持多種觸發類型,如HTTP請求、Kafka消息、NATS消息、Slack通知,當然還有Argo工作流。您還可以創建任何k8s資源,甚至帶來自定義觸發器。

3)傳感器
傳感器允許您指定觸發器事件依賴關係(觸發器應該響應的事件)。它監聽EventBus上指定的事件,並相應地執行觸發器。

4) EventBus
事件總線是連接事件源和傳感器的傳輸層。

Argo Events體係結構的一個好處是,您的觸發器與事件源是解耦的,允許您以任何您喜歡的方式混合和匹配。考慮到您可以帶來自定義事件監聽器和自定義觸發器,實際上,可能性是無窮無盡的。

跟蹤k8s資源万搏体育app官方平台

現在是時候好好利用這些概念了。

我們的目標將是顯示一些特定的係統輸出,以深入了解係統狀態,並允許基於此狀態采取行動。

當k8s資源發生更改時,我們希望得到通知,以便對這些更改做出響應。万搏体育app官方平台為了說明該過程,我們將跟蹤推理工作流的進展(我們將在k3d集群上運行的真實推理工作流的簡化版本)。

工作流模板的細節並不重要。重要的是生成的事件。

讓我們檢查一個故意失敗的工作流(kubectl get wf)。首先,我們注意到我們的工作流被標記以指示我們的工作流處於哪個階段,以及工作流是否已經完成。這些標簽由Argo的工作流控製器管理。“跟蹤我”標簽將在後麵解釋。

故意失敗工作流的代碼

如果您查看下麵的工作流狀態細節,您可以發現許多有用的信息,如“消息”(例如:"child 'XYZ' failed")、失敗的節點退出代碼、輸入和輸出參數值、時間戳等。

帶有正確值和時間戳的代碼

使用正確的時間戳編碼

我們將在事件源和觸發器中使用這些信息。

使用k8s API

首先,讓我們嚐試直接查詢k8s API來跟蹤這類事件。換句話說,讓我們在資源上建立一個“監視”(在“工作流”名稱空間中,因為這是部署工作流的地方)。万搏体育app官方平台

讓我們先列出我們的資源:万搏体育app官方平台

代碼塊列表資源万搏体育app官方平台

然後,我們可以從上一個命令返回的" resourceVersion "中建立一個監視:

對上一個命令的資源轉換建立監視的代碼

既然已經建立了監視,那麼如果/當工作流對象或集合發生變化時,我們就會收到通知。在下麵被截斷的捕獲中,一個工作流被“添加”了,因此我們可以首先獲得一個“added”通知,然後隨著工作流的進展獲得一些“MODIFIED”通知。

帶有通知的截斷代碼塊

使用Argo事件

現在讓我們使用Argo events來使用這些事件。

EventBus

我們需要的第一件事是一個EventBus。我們的事件源將為我們的EventBus產生事件,傳感器將使用這些事件。下麵是我們簡單的“默認”EventBus:

顯示簡單默認EventBus的代碼

事件源

Argo Events提供了“資源”事件源,以方便使用k8的資源更改事件。此事件源目前是使用inform實現的。

下麵是我們的事件源:

事件源代碼示例

注意過濾器。我們感興趣的是跟蹤明確標記要跟蹤的工作流的事件(例如,將標簽“track-me”設置為“true”的資源。万搏体育app官方平台如果您熟悉Prometheus,就會知道這類似於要取消的注釋資源。万搏体育app官方平台

你可能想知道為什麼是“ADD”、“UPDATE”和“DELETE”。畢竟,對k8s的API的手表請求將返回" ADDED ", " MODIFIED "和" DELETED "作為事件類型。如前所述,“資源”事件源是使用inform實現的。它實現了處理函數(AddFunc、UpdateFunc和DeleteFunc),這些函數由通知程序調用。如果深入研究Informer代碼,您會注意到,在反射器的watchHandler中,“ADDED”、“MODIFIED”和“DELETED”事件被轉換為對Informer內部存儲(緩存)的“add”、“update”和“delete”調用。

觸發器和傳感器

我們的第一個觸發器很簡單,隻是為了說明這個概念。我們將利用Argo Events“日誌”觸發器並簡單地記錄事件。

傳感器指定我們的觸發器依賴於單個事件源,並且應該在從EventBus消費相應事件時觸發。

這是我們的傳感器包括觸發器:

顯示傳感器和觸發器的代碼塊

瞧!這些資源將允万搏体育app官方平台許我們跟蹤與特定工作流相關的k8s事件。

顯示如何使用特定工作流跟蹤k8s事件的符號

嚐試它!

讓我們在推理工作流中嚐試一下。提交工作流將生成一係列事件,這些事件將由我們的事件源使用,發布到EventBus上,由傳感器使用,最後由觸發器記錄(到傳感器艙日誌中)。這是我們傳感器日誌中的一個樣本:

日誌的代碼樣例

事件日誌被截斷以避免混亂,但是可以看到記錄了ADD和UPDATE事件。

卡夫卡觸發

讓我們做一些更有趣的事情,設置一個Kafka觸發器。為此,我們需要一個Kafka集群。我們的傳感器將從上述事件負載中提取一些字段,並發布關於Kafka主題的某種形式的摘要。下麵是我們將使用的觸發器(使用與之前相同的傳感器依賴關係):

代碼塊顯示Kafka觸發器的例子

“有效載荷”部分指出我們如何從我們的源構建我們的目標有效載荷。在這裏,我們將使用名稱、一些標簽和可選的狀態消息。

提交工作流將導致在Kafka主題上發布消息流。

來自源代碼的有效負載部分中的代碼示例

使用這樣的消息,我們可以跟蹤我們的工作流進展並采取行動。

事件源過濾

如果我們想要過濾掉所有的工作流事件,除了那些工作流已經完成或失敗的事件,該怎麼辦呢?在某些情況下,我們當然更願意讓訂閱者自己進行過濾,在其他情況下,我們希望預先執行過濾。在後一種情況下,我們可以像這樣修改我們的事件源過濾器:

可能的事件源過濾的代碼示例

修正了事件源代碼塊示例

結論

可觀察係統允許我們從其輸出推斷其內部狀態。K8s API允許我們監視資源的變化。Argo Events使使用k8的資源更改事件和對它們采取行動變得容易。

我們的觸發器非常適合用於演示,但是我們可以通過使用“工作流”觸發器或自定義觸發器來執行更複雜的處理。我們可以很容易地向人們發送電子郵件、短信或其他形式的通知,例如關於失敗的工作流。

在Kinaxis,我們將這些事件寫入ML平台事件總線,並讓訂閱者(其他係統)使用它們。他們可以分析這些事件,並以任何他們想要的方式采取行動。

顯示選項
主要

留言回複

獲取博客更新

通過電子郵件更新博客文章:

Eloqua webform