Serverless初探

redhatxl發表於2019-01-09

一、背景

1.1 Serverless是什麼:

無伺服器計算是指開發者在構建和執行應用時無需管理伺服器等基礎設施,應用被解耦為細粒度的函式,函式是部署和執行的基本單位。使用者只為實際使用的資源付費。這些程式碼完全由事件觸發(event-trigger),平臺根據請求自動平行調整服務資源,擁有近乎無限的擴容能力,空閒時則沒有任何資源在執行。程式碼執行無狀態,可以輕易實現快速迭代、極速部署。

1.2 Serverless的特點:

以函式為擴充套件單位,虛擬化執行時環境(Runtime)。是現有計算資源的最小單位,具有完全自動、一鍵部署、高度可擴充套件等特點。

1.3 Serverless的作用:

  • 低成本

運營成本,Serverless將使用者的伺服器,資料庫,中介軟體委託於BaaS/FaaS,使用者將不再參與基礎設施及軟體的維護,尤其在大規模的叢集運營上成本大幅度降低。 開發成本,對比IaaS或者PaaS平臺的伺服器或者作業系統,Serverless的架構中,使用者操作的是服務化的元件比如儲存服務,授權服務等,可以縮短開發週期,降低開發難度。

  • 按需計費

Serverless/FaaS區別於IaaS/PaaS預先分配計算資源的計費方式,其計費方式通常是按請求次數及執行時間,一方面可以最大程度利用資源,另一方面真正的按需計費可以降低使用者的資源成本。

  • 彈性伸縮

Serverless架構一個顯而易見的優點即“橫向擴充套件是完全自動的、有彈性的、且由服務提供者所管理”。

  • “綠色”計算

據統計,商業和企業資料中心的典型伺服器僅提供5%~15%的平均最大處理能力的輸出,本質上這是對社會資源的一種浪費。而在Serverless架構下,提供商將提供更細力度的計算能力最大限度滿足實時需求,資源利用率將大幅度提升,可以認為相對IaaS與PaaS Serverless/FaaS是一種 “綠色” 計算。

  • NoOps

運維的發展經歷了人肉運維,自動化運維,DevOps,AiOps等,而Serverless帶來一種新的運維模式,這種模式下使用者需要管理的只有Code可以認為NoOps。

1.4 演進歷史

Serverless初探
雲端計算的發展從IaaS,PaaS,SaaS,到最新的BaaS,FasS,在這個趨勢中serverless(去伺服器化) 計算資源發展Physical->Virtualisation->Cloud Compute->Container->Server-less

1.5 各廠商產品

目前各大公有云廠商都上線了自己的serverless,如:

二、簡單示例

2.1 示例背景

目前有客戶有需求對數量眾多的測試環境想通過非工作時間進行關機操作,每天早上工作時間提前進行開機,如此如果人工來操作重複週期性的操作顯然非常不合適,但是共有云目前沒有提供這種對伺服器定時開關機操作的產品功能,只能利用其API來進行,但是需要一臺具備公網能力的伺服器來發起API呼叫請求,此時剛好利用Serverless小試牛刀,本次示例利用騰訊無伺服器雲函式(CFS)簡單示例下Serverless的一小部分功能,來實現此需求。

2.2 建立函式

無伺服器雲函式入門可以參考官網文件:入門概述

  • 選擇地域建立函式服務
    Serverless初探
  • 進行函式配置

填寫函式名稱,選擇程式函式執行的環境,選擇記憶體及函式執行的超時時間,最後可以在高階配置內,配置函式環境變數,在此我將騰訊雲的ak配置在環境變數中以便後續呼叫。 注意:在配置函式中如果選擇VPC,編寫的函式是具有出公網呼叫的能力,對應的VPC需要具備此能力。

Serverless初探

  • 編寫功能函式程式碼

在此我利用騰訊雲的CVM的SDK進行了雲伺服器的停止與開機操作,程式碼的輸入支援線上程式設計,以及本地zip上傳和cos上傳程式碼 ** 注意**:如果為原生程式碼呼叫的二進位制或可執行檔案,需要打包一併上傳。

Serverless初探
完整啟動程式碼(多個CVM可以寫入event的json instance列表內)

# -*- coding: utf8 -*-
# _auth:kaliarch

from tencentcloud.common import credential
from tencentcloud.cvm.v20170312 import cvm_client, models
import os
import logging

# 騰訊雲secretid
SecretId = os.getenv('secretid')
# 騰訊雲secretkey
SecretKey = os.getenv('secretkey')
# 事件

def cmvstart_handler(event, context):
		# 定義操作的CVM地域及例項ID
    event = {
    "region": "ap-shanghai",
    "instanceids": ["ins-kqf9os9x"]
    }
    logger = logging.getLogger()
    cred = credential.Credential(SecretId, SecretKey)
    Region = event['region']
    InstanceIds =  event['instanceids']
    cvmoper = cvm_client.CvmClient(cred, Region)
    request = models.StartInstancesRequest()
    request.InstanceIds = InstanceIds
    logger.info('requests:%s' % request)
		# 操作CVM啟動
    response = cvmoper.StartInstances(request)
    result_content = response.to_json_string()
    logger.info('result_content')
    print(result_content)
    return result_content

複製程式碼

停止的函式與此一致,在此只是拋磚引玉,其他的重啟,停止,已經對其他雲產品的操作等也都可以利用此來完成。

  • 進行線上函式功能測試

可以利用線上函式測試功能,對功能函式進行測試 注意:線上測試的資料格式必須為json格式,其傳入為event變數中

Serverless初探

  • 建立觸發方式

目前騰訊雲支援圖中的四種觸發方式,在此示例中適用於定時任務進行觸發

Serverless初探

定時任務可以選擇自定義配置,和Linux下的crond伺服器配置一致。 注意:定時任務形式觸發不會傳入event變數,需要自己函式內部指定在建立函式配置時進行變數配置。

2.3 檢視日誌

Serverless初探

函式返回值部分將顯示執行結果,還將顯示程式碼中 return 語句返回的函式執行結果。 執行資訊部分將顯示函式執行的時間、記憶體等資訊。 日誌部分將顯示函式執行時生成的日誌,包括使用者程式碼中的列印語句、函式執行失敗trace stack等,將會寫入至日誌模組。

2.4 官網示例

騰訊雲官網為我們瞭解及如何使用CFS,提供了不同的觸發條件示例及最佳實踐,可以進行進一步瞭解:最佳實踐

Serverless初探

三、思考

  • 在此只是最簡單的試用了一下CFS,其更強大的功能及優勢在雲端計算的潮流下後期會越顯明顯,適用場景眾多,業務進行拆分,分工更加精細。擷取官網的一張最常用的移動與WEB應用圖,業務各模組分離,函式具有彈性伸縮,前端入口為各業務模組的API閘道器,配合CDB/COS完成總體架構。

Serverless初探

  • 無伺服器雲函式想要後期更快的發展,需要進行業務邏輯的精細梳理和各函式呼叫,其次需要雲廠商多個性化定製服務,已經自己需要完善生態,最少無伺服器雲函式支援自家雲上各產品。