Kubeless 是 Kubernetes 原生的 Serverless 框架。
本文將介紹 Kubeless 架構設計。
Kubeless 三個核心概念
Kubeless 有三個核心概念,分別是:
-
Functions(函數)
-
Triggers(觸發器)
-
Runtime(運行時)
函數表示的是要被執行的代碼。除了代碼,它還包括運行時的依賴項以及構建指令等元數據信息。函數有獨立的生命週期。函數支持以下方法:
-
Deploy(部署):部署函數實例。這個步驟可能涉及構建函數鏡像或者重用預先生成的鏡像,並將其部署到集羣中。
-
Execute(執行):直接調用函數,不通過任何事件源。
-
Get(獲取):返回函數元數據和規格。
-
Update(更新):修改函數元數據和規格。
-
Delete(刪除):刪除函數,並從集羣中清理爲該函數配置的所有資源。
-
List(列表):顯示函數及其元數據的列表。
-
Logs(日誌):返回函數生成的日誌。
觸發器表示的是關聯到函數的事件源。當事件源中發生事件時,Kubeless 將確保最多調用一次關聯的函數。觸發器可以與單個函數關聯,也可以與多個函數關聯,具體取決於事件源類型。它們與函數的生命週期是脫鉤的。觸發器支持以下方法:
目前 Kubeless 官方支持5種觸發器:HTTP Trigger、CronJob Trigger、Kafka Trigger、NATS Trigger、AWS Kinesis Trigger。
安裝 Kubeless 的時候,默認安裝了 HTTP Trigger 和 CronJob Trigger,其他觸發器如果有需要,需要自行安裝。
此外,用戶還可以自定義觸發器。
運行時表示函數被執行時的語言和特定的運行環境。
可以通過 kubeless get-server-config 命令查看當前支持的運行時列表。
$ kubeless get-server-config
INFO[0000] Current Server Config:
INFO[0000] Supported Runtimes are: ballerina0.981.0, dotnetcore2.0, dotnetcore2.1, dotnetcore2.2, dotnetcore3.1, go1.13, go1.14, java1.8, java11, nodejs6, nodejs8, nodejs10, nodejs12, php7.2, php7.3, python2.7, python3.4, python3.6, python3.7, ruby2.3, ruby2.4, ruby2.5, ruby2.6, jvm1.8, nodejs_distroless8, nodejsCE8, vertx1.8
每種運行時都封裝在一個容器鏡像中。這些鏡像的引用被注入到 Kubeless 的配置中。
此外,除了 Kubeless 默認支持的運行時外,用戶還可以自定義運行時。
Kubeless 架構設計
Kubeless 利用 Kuberbetes 的多個概念來支持在 Kubernetes 之上部署函數。詳細說明如下:
-
自定義 CRD 用於表示函數,名稱爲 functions.kubeless.io 的 CRD 表示 Function
-
每個事件源都建模爲單獨的 Trigger CRD 對象
-
-
單獨的 CRD controller 用於處理與 CRD 對象相對應的 CRUD 操作
-
-
kubeless-function-controller 用於處理 Function 對應的 CRUD 操作
-
http-trigger-controller 用於處理 HTTPTrigger 對應的 CRUD 操作
-
cronjob-trigger-controller 用於處理 CronJobTrigger 對應的 CRUD 操作
-
Deployment/Pod 運行相應的運行時
-
ConfigMap 用於將函數代碼注入到 運行時 Pod
-
Init Container 用於加載函數可能具有的依賴
-
Service 用於暴露函數
-
Ingress 資源用於將函數暴露到集羣外
-
函數的調用入口通過 Service 實現
-
基於 Ingress 實現函數的 HTTP Trigger
-
基於 CronJob 實現函數的 CronJobTrigger
使用 Kubernetes CRD 和 CRD controller 構成了 Kubeless 的核心設計宗旨。
對函數和觸發器使用單獨的 CRD 可以將關注點清楚地分開。
使用單獨的 CRD controller 可使代碼保持解耦和模塊化。
參考: