ITBear旗下自媒體矩陣:

智匯華云 | 初識(shí) Serverless

   時(shí)間:2022-11-02 17:00:46 來(lái)源:互聯(lián)網(wǎng)編輯:茹茹 發(fā)表評(píng)論無(wú)障礙通道

背景

從部署物理機(jī)到虛擬機(jī)過(guò)程中,云計(jì)算通過(guò)虛擬化的方式對(duì)算力資源進(jìn)行了更高效的分配。為了更細(xì)粒度的分配,容器在云計(jì)算發(fā)展浪潮中誕生了。那有沒(méi)有可能再進(jìn)一步,將一次業(yè)務(wù)執(zhí)行作為單元進(jìn)行算力分配呢?每當(dāng)執(zhí)行的時(shí)候才分配一次資源,否則不消耗。

答案就是 Serverless。

什么是 Serverless

Serverless (無(wú)服務(wù)器架構(gòu))并不是嚴(yán)格意義上的無(wú)服務(wù)器,因?yàn)闊o(wú)論如何抽象或者封裝底層設(shè)備,程序總是要有一個(gè)服務(wù)器作為物理載體才能運(yùn)行。Serverless 的概念更加強(qiáng)調(diào)計(jì)算資源的自由擴(kuò)展,無(wú)需手動(dòng)人工配置。

Serverless 是由事件驅(qū)動(dòng)的全托管計(jì)算服務(wù)。用戶無(wú)需管理服務(wù)器等基礎(chǔ)設(shè)施,只需要編寫代碼和選擇觸發(fā)器(比如 RPC 請(qǐng)求,定時(shí)器等)并上傳。其余的工作(如實(shí)例選擇,擴(kuò)縮容、監(jiān)控、日志、容災(zāi)、部署等)全部由 Serverless 系統(tǒng)托管。

Serverless 通常包含了兩個(gè)領(lǐng)域 BaaS和 FaaS,其中 BaaS 可以理解成特定類型的托管服務(wù),例如數(shù)據(jù)庫(kù)服務(wù)、對(duì)象存儲(chǔ)服務(wù)、日志服務(wù)等等,而 FaaS 即為云函數(shù)計(jì)算服務(wù),提供核心的邏輯處理。

Serverless 實(shí)踐

基于 Kubernetes 的 Serverless framework 有很多,例如 Knative、OpenFaaS、OpenWhisk 等等,這里以 OpenFaaS 為例。

OpenFaaS 部署

OpenFaaS 可以通過(guò) arkade、helm3 以及 manifests yaml 等方式部署,部署后共有以下組件:

為了方便后續(xù)函數(shù)管理,這里也一并部署了 faas-cli,并配置了 Gateway Service 暴露的入口地址:

OpenFaaS 工作流程

OpenFaaS Gateway

Gateway作為請(qǐng)求網(wǎng)關(guān),當(dāng)要部署或者調(diào)用一個(gè)函數(shù)的時(shí)候,Gateway會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給Provider(faas-netes),同時(shí)會(huì)將監(jiān)控指標(biāo)發(fā)給Prometheus。alertManager會(huì)根據(jù)需求,調(diào)用API自動(dòng)伸縮函數(shù)。

Prometheus & alertManager

收集 Gateway 的 auto-scaling 指標(biāo),結(jié)合實(shí)際情況,自動(dòng)伸縮函數(shù)的規(guī)模。

NATS Streaming

NATS Streaming 是由 NATS 驅(qū)動(dòng)的數(shù)據(jù)流系統(tǒng),在保證吞吐量和時(shí)延的基礎(chǔ)上,解決了Nats消息投遞一致性的問(wèn)題。在 OpenFaaS 中作為處理函數(shù)調(diào)用的低延遲隊(duì)列。

faas-netes

faas-netes 是faas-provider 的官方實(shí)現(xiàn)。

faas-provider 中定義了一些基本的 faas handler規(guī)范,如下所示:

OpenFaaS 使用

OpenFaaS 創(chuàng)建函數(shù)可以通過(guò) REST API,faas-cli 或者 GateWay UI 三種方式創(chuàng)建,這里以 faas-cli 為例:

下載模版

首先下載官方提供的語(yǔ)言模版,模版支持 go,java11,python2(3),php7(8),ruby 等諸多語(yǔ)言

生成應(yīng)用

通過(guò) faas-cli new 創(chuàng)建一個(gè) go 應(yīng)用,修改 handler 函數(shù),簡(jiǎn)單模擬一個(gè)計(jì)算服務(wù)(計(jì)算入?yún)⒌暮?:

#FormatImgID_10#

構(gòu)建鏡像

#FormatImgID_11#

部署應(yīng)用

#FormatImgID_12#

服務(wù)訪問(wèn)

#FormatImgID_13#

也可以通過(guò)界面訪問(wèn)或者部署服務(wù)

#FormatImgID_14#

自動(dòng)擴(kuò)縮容

#FormatImgID_15#

可以通過(guò) label 的配置,將服務(wù)默認(rèn)為0副本,當(dāng)請(qǐng)求到達(dá)時(shí),會(huì)根據(jù)副本范圍、緩沖期,擴(kuò)縮模式等規(guī)格自動(dòng)擴(kuò)容,請(qǐng)求結(jié)束后,并自動(dòng)縮容。

OpenFaaS 自動(dòng)擴(kuò)縮容源碼分析

Prometheus將監(jiān)控指標(biāo)發(fā)給alertManager之后,alertManager會(huì)調(diào)用 /system/alert接口,這個(gè)接口的handler是由handlers.MakealertHandler方法生成。MakealertHandler方法接收的參數(shù)是ServiceQuery。ServiceQuery是一個(gè)接口,它有兩個(gè)函數(shù),用來(lái)獲取或者設(shè)置最大的副本數(shù)。

MakealertHandler的函數(shù)主要是從http.Request中讀取body,然后反序列化成Prometheusalert對(duì)象:該對(duì)象是一個(gè)數(shù)組類型,支持對(duì)多個(gè)函數(shù)進(jìn)行縮放。反序列化之后,調(diào)用handlealerts方法,而handlealerts對(duì)alerts進(jìn)行遍歷,針對(duì)每個(gè)alerts調(diào)用了scaleService方法。scaleService才是真正處理伸縮服務(wù)的函數(shù)。

Serverless 使用場(chǎng)景

在了解 Serverless 的應(yīng)用場(chǎng)景之前,首先總結(jié)一下它的技術(shù)特點(diǎn):

快速迭代與部署

高并發(fā)、高彈性

穩(wěn)定、可靠、安全

運(yùn)維與成本控制

如果應(yīng)用復(fù)雜有顯著的波峰波谷、對(duì)快速迭代有強(qiáng)烈訴求,Serverless 就可以發(fā)揮顯著的作用。

但是,由于Serverless 的無(wú)狀態(tài)性,狀態(tài)管理和共享仍然很困難,因此在使用場(chǎng)景下也具有局限性。

綜合而言,Serverless 比較適合以下場(chǎng)景:

機(jī)器學(xué)習(xí)及 AI 模型處理

圖片處理、文件處理以及流處理

IoT 后端及移動(dòng)后端

Serverless 的價(jià)值

無(wú)服務(wù)器管理

無(wú)需預(yù)置或維護(hù)任何服務(wù)器。無(wú)需安裝、維護(hù)或管理任何軟件或運(yùn)行時(shí)。

靈活擴(kuò)展

應(yīng)用程序可自動(dòng)擴(kuò)展,或通過(guò)切換占用資源(如吞吐量、內(nèi)存)的單位數(shù)(而不是切換單個(gè)服務(wù)器的單位數(shù))來(lái)調(diào)整容量,從而實(shí)現(xiàn)擴(kuò)展。

按價(jià)值付費(fèi)

為一致的吞吐量或執(zhí)行持續(xù)時(shí)間(而不是服務(wù)器單元)付費(fèi)。

自動(dòng)化的高可用

無(wú)服務(wù)器應(yīng)用程序提供內(nèi)置可用性和容錯(cuò)功能。無(wú)需構(gòu)建這些功能,因?yàn)檫\(yùn)行此應(yīng)用程序的服務(wù)在默認(rèn)情況下會(huì)提供這些功能。

Serverless 現(xiàn)階段的不足

狀態(tài)管理

要想實(shí)現(xiàn)自由的縮放,應(yīng)用的無(wú)狀態(tài)是必須的,而對(duì)于有狀態(tài)的服務(wù)而言,使用 Serverless 就喪失了靈活性,有狀態(tài)服務(wù)需要與存儲(chǔ)交互就不可避免的增加了延遲和復(fù)雜性。

延遲

應(yīng)用程序中不同組件的訪問(wèn)延遲是一個(gè)大問(wèn)題,傳統(tǒng)架構(gòu)中可以通過(guò)專有的網(wǎng)絡(luò)協(xié)議、RPC 調(diào)用、實(shí)例拓?fù)涞确矫鎯?yōu)化,而 Serverless 應(yīng)用程序是高度分布式、低耦合的,這就意味著延遲將始終是一個(gè)問(wèn)題,單純使用 Serverless 的應(yīng)用程序是不太現(xiàn)實(shí)的。

結(jié)語(yǔ)

Serverless 的出現(xiàn)能夠解決備份容災(zāi)、計(jì)費(fèi)方式、彈性伸縮、資源分配的等棘手問(wèn)題,盡管現(xiàn)階段 Serverless 架構(gòu)存在很多不足,但是諸多的優(yōu)良特性決定它是大勢(shì)所趨。隨著Serverless 生態(tài)圈多樣化發(fā)展,它無(wú)疑是非常令人期待并且前景光明的方向。

舉報(bào) 0 收藏 0 打賞 0評(píng)論 0
 
 
更多>同類資訊
全站最新
熱門內(nèi)容
網(wǎng)站首頁(yè)  |  關(guān)于我們  |  聯(lián)系方式  |  版權(quán)聲明  |  網(wǎng)站留言  |  RSS訂閱  |  違規(guī)舉報(bào)  |  開(kāi)放轉(zhuǎn)載  |  滾動(dòng)資訊  |  English Version