深入淺出Serverless:3 Serverless的實現
- 2019 年 10 月 8 日
- 筆記
介紹
- Serverless的落地與實踐需要實實在在的平台、工具以及框架作為技術支撐。通過這些Serverless的實現,用戶才能進行Serverless應用的架構設計、部署及運維
Serverless技術的發展
- CNCF的Serverless工作小組也對目前業界存在的Serverless資源做了一次梳理。基於其中比較成熟的平台和方案,CNCF發布了一份Serverless資源的導覽圖(Serverless Cloud Native Landscape)

Serverless實現導覽圖
- CNCF基金會還維護了一些關於構建、設計和運行雲原生應用的資源導覽圖

Serverless構建、設計和運行雲原生應用的資源導覽圖
Serverless資源分類
- Serverless平台:提供Serverless應用開發和運維的公有雲和私有雲平台,如AWS Lambda、Azure Functions、Google Cloud Functions等公有雲平台;OpenWhisk、Fission、Kubeless、Fn、OpenFaaS等都可以被部署在私有數據中心的開源Serverless平台。
- Serverless框架:Serverless平台為用戶提供了開發和運行Serverless的基礎,但是許多Serverless平台應用開發的用戶體驗還不是很完善。為了方便用戶同時在多個不同平台上開發和部署應用,業界出現了一批Serverless框架,以幫助用戶降低Serverless應用開發、部署和管理的複雜度,提高效率。比如,一款名為Serverless Framework的框架同時支援AWS、Azure、Google及OpenWhisk等眾多平台。
- Serverless工具:各類Serverless應用的輔助工具,簡化Serverless應用設計和部署的.architect。如,幫助用戶監控管理Serverless應用的日誌和性能的Dashbird和IO Pipe,幫助用戶對Serverless應用進行持續集成的LambCI。
- 程式語言庫:針對某種程式語言的Serverless類庫。python-λ是一款基於Python語言的Serverless工具,可以簡化基於Python的AWS Lambda應用的開發和部署。
- 後台服務:完整的Serverless應用往往還依賴於第三方的後台服務,以解決安全、數據持久化、消息傳遞等需求。如安全服務Puresec,為Serverless應用提供安全運行環境(Serverless Security Runtime Environment,SSRE);Snyk提供Serverless應用的安全漏洞掃描服務。
Serverless與公有雲
- 按照雲的運維責任所有人來劃分,雲服務可以分為公有雲(Public Cloud)、私有雲(Private Cloud)以及混合雲(Hybrid Cloud)

各種雲服務的類型
- 公有雲優點
- 更低的開銷:在大部分場景下,用戶按需購買資源,節約了開支
- 更低的運維成本:用戶無須再運維各類計算資源,節省了大量的人力開銷
- 高度可擴展:大部分的公有雲都有能力提供海量的計算資源,應用可以在短時間內按需迅速擴展
- 高可用:提供遍布世界的站點和高可用區,幫助用戶節省了大量用於實現高可用和容災的時間和精力
- Serverless與公有雲服務在理念上天然契合。兩者都強調將應用服務運營中非核心的要素移出用戶的關注範圍,簡化複雜度,提高效率。Serverless的流行和公有雲服務提供商的大力推廣有著非常大的關係。其中,AWS在2014年推出AWS Lambda成為這個領域走向高速發展的一個重要標誌。
Amazon Web Services
- Amazon Web Services即AWS,是目前市場份額最大的公有雲服務提供商之一。目前它在世界5個大洲都設置有數據中心

Amazon Web Services雲服務列表
- AWS Lambda(https://aws.amazon.com/lambda/)是AWS針對Serverless架構推出的FaaS雲服務。AWS Lambda自2014年推出以後受到廣泛的關注,也使得Serverless架構變得更加觸手可及和流行。
- AWS Lambda大獲成功的原因除了其設計和技術特性滿足了大家對Serverless計算的期望之外,還得益於其所在平台AWS的成功。在AWS推出Lambda之前,AWS平台上已經提供了大量的雲服務,這些服務涵蓋主機、網路、存儲、PaaS、日誌、資料庫、CDN、負載均衡、身份驗證、大數據及人工智慧等各個領域。一個完整的Server-less應用,除了應用本身要實現「無伺服器」化之外,其所依賴的第三方服務也應該實現「無伺服器」化。

函數式計算平台AWS Lambda
- AWS Lambda的優勢
- 成熟度高:AWS Lambda是第一個在主流公有雲平台上的Serverless FaaS平台,已經有數年的發展和沉澱。其他平台的推出時間相對較晚(Google和Microsoft都是在2016年才推出相對應的產品)
- 用戶基數大:AWS Lambda有較大的用戶基數,可以查詢到的客戶參考案例較多
- 活躍的社區:目前開源社區有不少圍繞AWS Lambda展開的開源項目,有的項目改善了用戶體驗,如Serverless Framework;有的則增強了功能,如Apex和LambCI
- AWS的整合:AWS Lambda天然和AWS平台上的服務有良好的集成
Microsoft Azure
- Microsoft Azure是微軟公司推出的公有雲服務,是目前市場份額位居前列的公有雲服務。根據資料顯示,目前Azure收入的增長速度超過了其最大的競爭對手AWS
- Microsoft Azure也在2016年推出了事件驅動的函數式雲計算服務Azure Functions,Azure Functions支援用戶以多種語言進行函數的開發,包括Java、Node.js、PHP、C#、F#、Bash及Microsoft Windows的PowerShell腳本。Azure支援按用量收費,提供靈活的收費模型

函數式計算平台Azure Functions
- Azure Functions除公有雲的版本之外還提供私有化(On-premises)部署的版本Azure Functions Runtime。用戶可以通過將Azure Functions部署在私有數據中心來搭建Serverless計算平台。
- Azure Functions的功能可圈可點
- 完整性。Azure Functions是一個功能完備的Serverless FaaS平台
- 整合:Azure Functions天然與Azure雲平台上各類服務有良好的集成
- 平台:對於使用微軟體系產品和工具構建IT能力的企業而言,Azure Functions是Serverless轉型的首選平台
- 私有化:提供帶商業支援的私有化部署版本,可滿足不同用戶的需求
Google Cloud Platform
- Google Cloud Platform是Google公司推出的公有雲服務。2016年,Google Cloud Platform推出了Google Cloud Functions平台(https://cloud.google.com/functions/)加入Serverless領域的競爭。同為FaaS平台,Google Cloud Functions與AWS Lambda和Microsoft Azure在功能上最大的區別在於Google Cloud Functions目前僅支援JavaScript作為函數開發語言,運行環境為Node.js

AWS Lambda、Microsoft Azure Functions及Google Cloud Functions支援的開發語言
- 2018年7月Google公布了開源項目Knative(https://github.com/knative/)。Knative定位為Kubernetes的Serverless插件。Knative推出後得到了Pivotal、IBM以及Red Hat的支援。Knative提供基於容器的Serverless FaaS平台能力
阿里雲
- 阿里雲是阿里巴巴旗下的公有雲服務,也是目前中國市場份額最大的公有雲服務提供商。根據2018年年初的報道,目前阿里雲已經成為世界上第五大公有雲服務提供商。阿里雲是中國第一批推出Serverless平台的公有雲廠商
- 阿里雲的FaaS平台產品是阿里雲函數計算(Function Compute,https://serverless.aliyun.com/)

阿里雲函數計算應用架構圖
- 阿里雲函數計算平台的特點
- 事件觸發:阿里雲函數計算可以被阿里雲上的服務事件觸發,如阿里雲對象存儲(OSS)
- 支援語言:阿里雲函數計算目前支援的開發語言為Node.js,並計劃後續將支援Java及Python。整個函數程式碼的部署包大小不能超過50MB,部署包解壓後的程式碼不能超過250MB。程式碼會在一個受限的Linux環境中執行。阿里雲貼心地提供了一個Web Shell環境讓用戶體驗函數的執行環境
- 用戶體驗:阿里雲函數計算提供了基於Web的控制台和SDK。用戶可以通過Web控制台管理函數應用,也可以通過互動式的命令行來操作
- 服務規格:一個服務下最多包含50個函數和10個觸發器。在運行時,函數最長的運行時間為300s,即5min。一個函數的最大並發數為100
- 服務計費:按函數的執行時間計費。收費最小顆粒度可達100ms。計費有兩個維度,一是函數調用次數,二是函數執行時間。每個月的前100萬次調用及每月前40萬GB免費。如果函數在執行過程中涉及公網的數據傳輸,相關傳輸的數據量也將進行計費
- 用戶生態:官方文檔比較完備,用戶手冊、開發手冊、API文檔及演示影片等一應俱全。同時還提供了一些典型場景的案例參考。更多內容可參考阿里雲棲社區的部落格,其中有一些案例和技術分享
騰訊雲
- 無伺服器雲函數(Serverless Cloud Function,SCF)是騰訊雲推出的函數式計算平台(https://cloud.tencent.com/product/scf)。根據官方的資料,騰訊雲SCF發布日期是2017年4月26日,而阿里雲的Function Compute的發布日期為2017年4月27日
- 騰訊雲Serverless平台的特點
- 函數運行時:騰訊雲SCF目前支援Python、Java及Node.js作為函數的開發語言。用戶可以以壓縮包的形式從本地上傳程式碼,也可以引用騰訊雲對象存儲中的程式碼文件
- 事件觸發:目前騰訊雲SCF支援的事件觸發源有騰訊雲對象存儲COS、定時器、騰訊雲消息服務CMQ,以及用戶手動通過API及控制台觸發
- 服務規格:每個函數將在一個基於CentOS Linux的環境中被執行。函數執行的記憶體範圍為128MB至1536MB,單個區域支援的最大函數定義數量為20個,函數執行的最大時長為300秒,最大的並發數為5。如果需要更高的並發則需要聯繫客服
- 計費方式:和阿里雲類似,騰訊雲SCF通過資源的使用量(記憶體的使用量,單位為GB)以及調用的次數進行計算。每個月提供40萬GB和100萬次調用的免費計算量。
- 用戶生態:產品的文檔說明比較清晰,也提供了一些入門的教程和示例
- 即將發布的Serverless2.0功能非常值得期待(service、devops、運維監控等)
Serverless與私有化部署
- 公有雲的優點是節約了用戶大量的管理成本,缺點是削弱了用戶對基礎架構的控制力。此外,許多用戶,尤其是大企業,對公有雲一直懷有的擔憂,便是其安全性
- 和公有雲相比,在私有環境中構建Serverless平台,在技術上並沒有什麼障礙。由於容器技術已比較成熟,通過Docker和Kubernetes這樣的技術平台,用戶可以在私有的數據中心快速方便地構建和管理龐大的計算集群。因此,當前絕大多數可以在私有雲上部署的Serverless平台方案底層都是基於容器技術實現的
OpenWhisk
- OpenWhisk(https://openwhisk.apache.org)是一個開源的Serverless FaaS平台。這個源於IBM的Serverless平台目前由Apache基金會進行孵化和管理。OpenWhisk是一個功能完備的FaaS平台,包含事件驅動及函數執行時等核心組件。OpenWhisk可以運行在不同的基礎架構上,包括各類物理機、虛擬機、容器平台(如Kubernetes)、PaaS(如OpenShift)、公有雲(如AWS和Azure等)和私有雲(如Open-Stack)環境中

OpenWhisk項目主頁
Fission
- Fission( https:// fission.io/)是 Platform9公司推出的一個開源 Serverless框架

Serverless框架Fission
- 用戶可以在 Kubernetes集群上運行 Fission以提供 FaaS平台服務。通過 Kubernetes的容器編排能力, Fission對底層的容器化函數執行環境進行調度和編排。Fission目前支援的語言非常廣泛,包含各類常見的程式語言,如 Node.js、 Python、 Java、. NET、 Go、 PHP、 Ruby、 Perl及二進位執行文件等,用戶還可以根據需要進行擴展。Fission還提供了函數的編排能力。通過 Fission Workflows,用戶可以定義並執行函數調用鏈

Fission技術架構圖
Kubeless
- 和 Fission相似, Kubeless也是運行在 Kubernetes平台之上的 FaaS。Kubeless官方強調其是 Kubernetes原生( Kubernetes native)的 Serverless實現。Kubeless在設計之初就引用了許多 Kubernetes原生的組件,如 Service、 Ingress、 HPA( Horizontal Pod Autoscaler)等。目前 Kubeless支援的程式語言有 Python、 Ruby、 Node.js和 PHP。用戶可以通過訂製容器鏡像來自定義函數的執行環境

Serverless框架Kubeless
OpenFaaS
- OpenFaaS( https:// github.com/ openfaas)是一個基於容器技術構建的 Serverless FaaS平台。和 Fission、 Kubeless不同的是, OpenFaaS除了支援 Kubernetes外,還支援 Docker Swarm

Serverless FaaS平台OpenFaaS

OpenFaaS支援Docker Swarm
- Fission和 Kubeless都傾向於向用戶隱藏底層容器技術的細節。在 OpenFaaS中函數是以容器的形式定義的,容器對用戶而言並不是抽象的,用戶在定義函數時將指定具體的容器鏡像。這對於一些容器技術愛好者而言是一個優點
- OpenFaaS項目還維護了一個應用市場 OpenFaaS Store,用戶可以從這個軟體市場上查找和快速部署社區驗證過的函數應用

OpenFaaS函數應用市場
Fn
- 是 IronFunctions團隊成員加盟 Oracle後的產物。Fn項目的特點是基於容器技術( Container native),支援多個不同的容器編排平台,包括 Kubernetes、 Docker Swarm及 Mesosphere,支援在不同的私有雲和公有雲平台上進行部署
- Fn可以兼容 AWS Lambda的函數程式碼,用戶可以將 AWS Lambda的程式碼導入 Fn中運行。不難想像,當 Oracle在其雲服務 Oracle Cloud上提供以 Fn為基礎的 FaaS服務時,用戶可以更容易地將他們的 Serverless應用從 AWS Lambda上遷移到 Oracle Cloud

Serverless平台Fn
小結

私有化部署的 Serverless平台對比
- 容器技術已成為當前雲計算的一個重要基石,也是 Serverless實現的一個重要技術手段。通過容器,用戶可以很方便地打包各種程式語言的運行環境。通過容器編排, Serverless平台可以很快速地將其部署到龐大的計算集群中去
Serverless框架和工具
- 當前 Serverless還沒有建立通用的行業規範,每個 Serverless平台的用戶介面都不盡相同。用戶在同時使用多個 Serverless平台時變得困難重重。這些因素都讓 Serverless應用的開發和調試變得相對困難。為了解決這個問題,社區出現了一批框架和工具,以幫助用戶降低 Serverless應用開發、調試和部署的複雜度,提高 Serverless應用開發的工作效率。
Serverless Framework
- Serverless Framework( https:// github.com/ serverless/ serverless)是一款幫助用戶構建、部署和管理在不同 Serverless平台之上應用的命令行工具。
- Serverless Framework是由 Node.js編寫的一個命令行工具。通過這個命令行工具,用戶可以選擇不同 Serverless平台的應用模板快速創建出一個 Serverless應用的框架。通過簡單的命令,用戶可以將應用發布到指定的 Serverless平台上

Serverless Framework示例
- 當前 Serverless Framework支援的平台有 AWS Lambda、 Azure Cloud Functions、 Google Cloud Functions、 IBM OpenWhisk、 Kubeless以及 Webtask等。
Chalice
- Chalice( https:// github.com/ aws/ chalice)是 AWS官方支援的開源項目。Chalice是基於 Python實現的一個簡單框架,用於簡化用戶定義和部署 AWS Lambda應用。
- 用戶通過命令行可以快速建立一個名為 helloworld的項目的框架。
$ pip install chalice $ chalice new-project helloworld $ ls-la drwxr-xr-x .chalice -rw-r--r-- app.py -rw-r--r-- requirements.txt
- Chalice讓用戶可以用 Python的語法定義 AWS Lambda和 API Gateway的對象。下面示例項目的程式碼定義了一個 AWS Lambda應用及一個函數,並將 URL路徑「/」與該函數進行了關聯。
from chalice import Chalice app = Chalice( app_name =" helloworld") @app.route("/") def index(): return {" hello": "world"}
- 通過 Chalice命令行,用戶可以快速地將這個應用部署到遠端的 AWS Lambda平台上。部署完畢後,就可以馬上訪問這個 Serverless應用了。
$ chalice deploy ... Initiating first time deployment... https://qxea58oupc.execute-api.us-west-2.amazonaws.com/api/ $ curl https://qxea58oupc.execute-api.us-west-2.amazonaws.com/api/ {"hello": "world"}
小結

Serverless框架與工具比較
Serverless後台服務
- 在 Serverless架構中,除了應用的無伺服器化外,應用所依賴的第三方服務的無伺服器化也是一塊龐大的內容。它們的一個共同特點就是無須用戶運維,用戶無須關心這些服務底層的基礎設施。
- 公有雲服務:對用戶而言無疑是管理成本最低的選擇。AWS的資料庫服務 DynamoDB、 Azure的資料庫服務 Cosmos DB、 Auth0等服務都是 Serverless後台服務的典型例子。隨著時間的推移,各大公有雲平台的服務類型日趨豐富,用戶構建 Serverless應用所用的後台服務的選擇也越來越多。
- 私有雲服務:開源的領軍公司 Red Hat公司推出了基於 Docker和 Kubernetes的 PaaS平台 OpenShift。通過像 OpenShift這樣的容器 PaaS,用戶可以快速實現 Everything-as-a-Service或者 xPaaS。這使得在私有數據中心搭建 Serverless後台服務的複雜度大大降低
小結
- 雖然公有雲是 Serverless的主戰場,但是私有化的 Serverless實現仍然有一定的市場空間。隨著容器技術的日益成熟,用戶在私有化環境中構建和管理大規模計算集群的門檻變得空前低下。OpenWhisk、 Fission、 Kubeless和 OpenFaaS等開源項目可以讓容器平台快速獲得 Serverless FaaS的能力,從而實現私有環境的 Serverless FaaS平台。
資料
- Serverless相關資源列表:https://github.com/anaibol/awesome-serverless
- Serverless導覽圖的參考地址:https://github.com/cncf/wg-serverless
- CNCF基金會維護的關於構建、設計和運行雲原生應用的資源導覽圖,地址:https://github.com/cncf/landscape
- 公有雲市場份額報告參考來源:https://www.skyhighnetworks.com/cloud-security-blog/microsoft-azure-closes-iaas-adoption-gap-with-amazon-aws/
- Google公布了開源項目Knative(Kubernetes的Serverless插件,https://github.com/knative/)
- OpenShift是 Red Hat支援的一個開源容器平台項目,項目主頁:https:// www.openshift.org