在Kubernetes上實現(xiàn)無服務(wù)器化的五種方式
譯文【51CTO.com快譯】我們常聽說的“無服務(wù)器化”,有時也被稱為“事件驅(qū)動的計算(event-driven compute)”或被叫做“功能即服務(wù)(functions as a service,F(xiàn)aaS)”。其背后的思想是:為了響應(yīng)各種事件,而通過動態(tài)分配資源,以調(diào)用或運行各項微服務(wù)(microservices)的功能。無服務(wù)器計算平臺能夠讓應(yīng)用程序人員更專注于應(yīng)用程序本身,而不再是基礎(chǔ)架構(gòu)、及其所有的管理細(xì)節(jié)。
如今,大多數(shù)云服務(wù)提供商都能夠提供相應(yīng)的無服務(wù)器平臺。當(dāng)然,您也可以通過兩個要素來構(gòu)建自己的平臺。第一個是:Kubernetes,它是一種容器編排系統(tǒng)。作為一個標(biāo)準(zhǔn)化的平臺,它能夠構(gòu)建可擴展的組件化應(yīng)用程序。第二個是在Kubernetes中構(gòu)建無服務(wù)器應(yīng)用模式的任意系統(tǒng)。
目前,大多數(shù)Kubernetes的無服務(wù)器框架都具有以下的共同特點:
- 能夠從本地或遠(yuǎn)程部署到任何支持Kubernetes的環(huán)境中,包括OpenShift之類的環(huán)境。
- 支持運行由任意語言編寫的代碼,并帶有一些常見的運行時預(yù)包裝(runtimes prepackaged)框架。
- 通過HTTP端點、隊列消息、或其他鉤子等各類事件,來觸發(fā)代碼的執(zhí)行。
在Kubernetes上構(gòu)建無服務(wù)器的一個主要優(yōu)點是:能夠獲得對于底層平臺的更大控制權(quán)。通過Kubernetes,您可以創(chuàng)建一個滿足自身需求的無服務(wù)器平臺,從而讓Kubernetes運維人員來負(fù)責(zé)該基礎(chǔ)設(shè)施,而讓開發(fā)人員更專注于必要的代碼編寫。
下面,我們向您介紹在Kubernetes上實現(xiàn)無服務(wù)器功能的五大主流項目。它們分別是:
- Fission
- Knative
- Kubeless
- OpenFaaS
- OpenWhisk
Fission是由Kubernetes的子公司Platform 9創(chuàng)建和維護的。它的主要特點是:您無需構(gòu)建容器,只要提供定義文件,即可創(chuàng)建應(yīng)用程序。
Fission的安裝并不一定需要Helm chart。通常,它具有兩個版本:全面版,帶有消息隊列、以及支持日志的InfluxDB;而精簡版,只能提供基本的功能與服務(wù)。前者可以被專門部署在生產(chǎn)環(huán)境中,而后者僅供用戶小范圍內(nèi)試用。
為了將代碼添加并部署到Fission中,您可以使用基于YAML的規(guī)范文件。同時,F(xiàn)ission的命令行工具能夠幫助您,創(chuàng)建針對不同功能和路由入口觸發(fā)點的YAML文件。另外,這些規(guī)范文件還允許您提供各種環(huán)境變量、輔助容器、卷、以及Kubernetes的容錯控制代碼。
當(dāng)然,F(xiàn)ission還會提供“工作流(workflow)”。通過安裝Helm chart,這些工作流將會從一個函數(shù)輸出并傳遞給另一個函數(shù),哪怕兩個功能函數(shù)并非使用的是同一種編程語言。值得注意的是,為了降低系統(tǒng)的開銷,工作流系統(tǒng)默認(rèn)支持諸如:整數(shù)、通用字節(jié)流等許多常見的原始二進制類型。不過,每個功能函數(shù)在進行格式轉(zhuǎn)換輸出與提交時,還是會產(chǎn)生一定的性能代價。
此類FaaS的一個缺點是:當(dāng)我們首次調(diào)用某個功能函數(shù)時,其關(guān)聯(lián)的容器會出現(xiàn)明顯的延遲。因此,F(xiàn)ission需要通過對容器進行“預(yù)熱”,來最小化此類延遲。
此外,F(xiàn)ission能夠為開發(fā)人員和管理員提供的其他便利,還包括:將服務(wù)部署到無法訪問外部互聯(lián)網(wǎng)的集群中,按需將代碼重新熱加載(hot-reloaded)到集群里,以及記錄與回放功能函數(shù)的各項活動,從而輔助開發(fā)人員進行調(diào)試。而且,由于Fission項目擁有自由的Apache許可證,因此用戶可以免費對它進行修改。
最初是由谷歌創(chuàng)建的Knative,能夠協(xié)助用戶在Kubernetes中運行各種無服務(wù)器的應(yīng)用。它主要關(guān)注的是,在生產(chǎn)環(huán)境中無服務(wù)器部署的通用模式。Knative在有效管理和利用多個Kubernetes組件方面,積累了許多豐富的專業(yè)知識。
為了管理Kubernetes,Knative除了需要路由系統(tǒng)和諸如Istio之類的服務(wù)網(wǎng)格之外,還會借用到Ambassador等其他選項。雖然,這會帶來一些額外的設(shè)置工作,但是該項目的詳細(xì)指南已經(jīng)包含了各種云服務(wù),以及諸如vanilla Kubernetes的環(huán)境說明。
通過利用或擴展現(xiàn)有的Kubernetes工具和功能,Knative能夠通過YAML文件和為您交付Docker容器的方式,來配置各種應(yīng)用程序與函數(shù)。而對于各種定義的添加、修改或刪除則可通過kubectl命令行來實現(xiàn)。用戶既可以使用Grafana來獲取Knative的應(yīng)用參數(shù),又可以使用Knative自帶的autoscaler、或其他與Kubernetes兼容的scaler,來實現(xiàn)擴展。
不過,Knative仍處于深入開發(fā)階段,它的許多專有工具也還處于初級階段。其中,knctl是一款專門的Knative命令行工具。它可以方便您使用Kubernetes的其他工具,來管理Knative。而ko工具則可以被用于在Knative構(gòu)建Go語言的應(yīng)用,并削減容器的構(gòu)建步驟。
由Bitnami創(chuàng)建的Kubeless,能夠幫助開發(fā)人員輕松地安裝各種常見的Web應(yīng)用程序棧。Kubeless使用Kubernetes原生的各種定制化資源定義(Custom Resource Definitions),來處理各種功能函數(shù),我們可以將它理解為Kubernetes metaphor和Kubeless各項功能之間的抽象層。
Kubeless不但能夠支持.NET、Java、Python、Node.js、PHP、Ruby等大多數(shù)編程語言,而且支持為云原生開發(fā)的Ballerina語言的運行時(runtimes)平臺。此處的運行時是指各種Docker鏡像。當(dāng)然,Kubeless也擁有一種特定的包格式,可使用Dockerfiles來構(gòu)建其自定義的運行時。
Kubeless的另一個便利性體現(xiàn)在它的CLI上。該CLI與AWS Lambda的CLI有些類似。使用它,您可以在移出AWS Lambda時,仍保留各種現(xiàn)有的管理腳本,而且不必學(xué)習(xí)一套全新的命令集。Kubeless還可以被作為無服務(wù)器框架的插件,實現(xiàn)在各種架構(gòu)上構(gòu)建無服務(wù)器應(yīng)用。
OpenFaaS的宗旨是:讓開發(fā)人員不再為部署Docker容器而煩惱。因此,它既可以被部署到Kubernetes,也可以用于本地測試或低需求的Docker Swarm集群中。您可以使用OpenFaaS CLI來構(gòu)建、推送、以及部署各種Docker鏡像到集群里,以運行相應(yīng)的功能。雖然您完全可以自行發(fā)布,但是您也可以使用它預(yù)先用Python、Node.js、.NET、Ruby、Java或PHP 7編寫的現(xiàn)成模板,來部署應(yīng)用程序。另外,OpenFaaS CLI的內(nèi)置web UI還允許您創(chuàng)建各種新的功能,以及管理集群中的密鑰。
作為OpenFaaS的另一個版本,OpenFaaS Cloud為開發(fā)人員重新打包了OpenFaaS的各項特性,集成了GitHub和自托管版本的GitLab,提供了CI/CD,密鑰管理,HTTPS,以及向Slack的事件反饋能力。OpenFaas Cloud是一款免費的開源產(chǎn)品,而它的托管版本,目前也仍然可以被免費使用。
Apache OpenWhisk可謂一個通用的無服務(wù)器平臺。OpenWhisk不但支持在Kubernetes上運行容器,還支持Mesos和Docker Compose。OpenWhisk提供了針對Kubernetes的Helm charts工具,以部署各種應(yīng)用。大家比較熟悉的IBM Cloud Functions就是基于OpenWhisk項目的,因此它可以直接使用OpenWhisk CLI的各種命令。
不同于其他大多數(shù)無服務(wù)器的Kubernetes框架,OpenWhisk是用Scala語言編寫而成,并非用于編寫Kubernetes和Docker的Go語言。所以您可能需要花點時間,去了解一下它的編程思想。
在應(yīng)用運行時選項方面,OpenWhisk封裝了Java、Node.js、Python、Ruby、PHP和.NET。另外,它的高級語言選項還包括:Scala、Ballerina、Swift、以及Rust。由于其運行時屬于Docker容器類型,因此您很容易通過它來實現(xiàn)自己的應(yīng)用。
OpenWhisk在部署方面的一個便捷特性是“zip actions”。它可以使用代碼包的清單文件,將某個代碼的zip包、以及多個輔助文件指向OpenWhisk。而OpenWhisk則可據(jù)此創(chuàng)建一項后續(xù)操作。同時,OpenWhisk CLI還可以通過工具將代碼的目錄樹轉(zhuǎn)換成一個歸檔文件。它的服務(wù)包目錄,能夠方便您將應(yīng)用插入到諸如GitHub、Slack、Apache Kafka或Jira等常見的第三方產(chǎn)品之中。
原文標(biāo)題:5 ways to do serverless on Kubernetes,作者:Serdar Yegulalp
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】