天天看點

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

在企業級開發應用進入雲原生開發時代之後,Serverless 架構這個詞也頻繁出沒于各大技術媒體裡。

Serverless的字面意思容易給人以 ​

​不再需要伺服器了​

​ 的誤解。

站在整個企業的角度上講,ABAP Netweaver 的 SICF 開發模式,和 Serverless 架構幾乎沒有任何聯系,兩者差別很大:一個是需要在部署于企業本地的伺服器上編寫函數代碼,另一個則是直接在雲服務提供商提供的平台上編寫代碼。

然而,從隻需要專心搬磚的程式員個體視角出發,兩者也有一些相似之處:程式員都不需要關注自己編寫的代碼在伺服器端如何存儲, 也不用操心這些函數在何時被調用。

當然,技術總是在向前發展的,運作在現代雲服務提供商基于Serverless架構平台之上的函數,和運作在ABAP Netweaver伺服器上的SICF服務相比,就像一個含着金鑰匙出生的富二代,天生就具備雲原生應用的一些基本特質,比如高可用性,彈性伸縮,按需裝載,動态計費等等。

SAP 近些年來在雲原生開發領域進行了巨大的持續投入,自然少不了基于Serverless架構的解決方案,其中一個典型例子就是 SAP Kyma上的Lambda Function.

SAP Kyma Serverless的實作基于Kubeless,一個Kubernetes原生支援的Serverless架構,實作了運作于Kubernetes之上資源的自動伸縮,API路由,監控和排錯等功能。

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

借助Kubeless提供的指令行接口,我們可以在Kyma上建立和部署具備Serverless特性的Lambda Function.

kubeless指令行接口提供的CRUD操作:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

當然也可以在Kyma提供的浏覽器控制台裡進行建立工作。

如下圖所示,我建立了一個Hello World級别的Lambda Function,執行的邏輯是簡單的把傳入的字元串尾部加上一個字尾,函數基于nodejs8實作。

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

我們試試通過 HTTPS 協定觸發這個 Lambda Function.

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

這個HTTPS-endpoint就是将來我們調用這個Lambda Function的url.

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

這個Lambda Function的認證由dex完成,一個基于openID的開源認證架構。

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

在Kyma提供的函數測試控制台裡,發送一個請求,得到添加了字尾的字元串,簡單易懂。

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

當我們建立了一個Lambda Function,背後發生了什麼?雖然名稱為Serverless,但是這些函數實體上總得運作于伺服器上某種容器内,這種容器就是Kubernetes的pod,Jerry之前強調過,SAP Kubernetes基于Kubernetes,是以Kubernetes支援的指令,SAP Kyma也完全支援。

指令行檢視剛剛建立的函數:

kubeless function list -n ctu-demo
雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

使用指令行檢視這個函數的明細:

kubectl describe function zjerry-lambda -n ctu-demo

Deployment和ReplicationSet:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

水準自動伸縮的實作:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

Lambda Function這個概念是SAP Kyma基于Kubernetes的Custom Resource Definitions(CRD)機制建立的一種自定義資源,而上圖顯示的這些函數屬性都是Kubernetes裡資源支援的原生屬性。

在Kyma的控制台裡能找到Lambda Function建立後,Kyma背景自動生成的對應資源:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

Pod,即Lambda Function代碼的運作環境:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

同樣的,使用kubectl describe pod指令可以檢視這個pod的明細,找到裡面包含的docker ID和docker鏡像ID.

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

前面提到SAP Kyma的Lambda Function采取dex進行認證,如果想在程式設計語言裡顯式調用,需要提供相應的token.

在Kyma的控制台裡拿到token,

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

傳到Postman的Authorization頭部字段裡,得到期望的響應。

下面介紹如何在 Kyma 控制台裡擴充新的 UI.

方法是建立一個新的resource,類型為ClusterMicroFrontend.

使用指令行kubectl get ClusterMicroFrontend檢視這些UI擴充:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹
雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

最後自定義的UI出現在Kyma console的這個位置:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

下面我們詳細分析 Kyma Lambda Function 的技術實作細節。

我在Kyma上建立了一個名為zjerry-lambda的函數,基于nodejs8:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

可以直接在Kyma的測試控制台裡調用這個Lambda Function:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

Serverless的字面意思,不是暗示我們沒有伺服器了嗎?那麼這段函數代碼到底運作在哪裡的?

因為SAP Kyma是基于Kubernetes的,是以我們還是可以通過Kubernetes提供的一些工具,來探索SAP Kyma上Lambda Function運作原理的一些蛛絲馬迹。

首先找到zjerry-lambda函數建立後,對應生成的pod,把名字抄下來:zjerry-lambda-86668f75d4-pfbk6

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

使用kubectl的互動式參數-ti,進入這個pod内部:

​kubectl exec -ti zjerry-lambda-86668f75d4-pfbk6 -n ctu-demo -- /bin/sh​

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

進入之後,檢視程序清單,發現了node kubeless這個程序,Jerry頓時覺得有點眉目了:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

看樣子,SAP Kyma的Lambda Function是通過一個node程序執行的。檢視一下這個pod裡都有哪些檔案:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

打開kubeless.js看看裡面的内容:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

如果您是一位nodejs開發人員,看到上面Jerry高亮的紅色内容,一定會恍然大悟。SAP Kyma的Lambda Function,其實運作在對應的Kubernetes pod裡啟動的express應用架構上。

Express的依賴定義在pod内部的package.json裡:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

而待執行的Lambda Function邏輯,通過環境變量FUNC_HANDLER進行注入,在Jerry這個例子裡,函數體名稱為main:

雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹
雲原生平台 Kyma 上建立的 Lambda Function 的技術實作細節介紹

在Lambda Function的Serverless架構,即kubeless.js運作時,會從pod内部的kubeless這個檔案夾裡,找到應用開發人員編寫的Lambda Function,加載并運作。

大家可以看到,Jerry紅色高亮的位于pod内部的handler.js, 其内容就是Kyma控制台裡編寫的函數體。

總結

繼續閱讀