評估Kubernetes中的Serverless框架

ServiceMesher2018-11-12 03:32:13

原文鏈接:https://rancher.com/blog/2018/2018-04-23-evaluation-of-serverless-frameworks-for-kbe/ 作者:Hisham Hasan 譯者:殷龍飛

Rancher 1.6和Rancher 2.0底層容器編排引擎的術語和概念略微有所不同。想要了解這些差異就需要先了解Cattle和Kubernetes之間的根本區別。對於過Cattle或者Kubernetes的新手來說,這篇文章比較適合您。同時你也可以從這裡獲取到容器編排引擎 Cattle 到 Kubernetes 的對應關係詞匯表cheatsheet。

無服務器 kubernetes


在Pokemon Go的早期,我們都驚訝於Niantic如何在全球範圍內擴展其用戶群,現在看來他們應該是以無縫地向其容器添加額外的節點以容納更多的玩家和環境,所有這一切都可以通過使用Kubernetes作為容器編排工具來實現。Kubernetes在擴展和管理容器基礎架構中,能夠從開發者角度抽象出部分過程和低級依賴關係。這使它成為一個非常有效的平臺,用於開發和維護跨多個容器的服務。本文將探討如何利用K8S的設計參數和服務編排功能,並將它們與無服務器框架和即服務(FaaS)結合起來。特別是,我們將深入研究其特性和功能,分析在K8s架構上構建的三個無服務器框架的運行性能和效率:(i)Fission; (ii)OpenFaaS; (iii)Kubeless。

A. 為什麼Kubernetes是無服務器的優秀編排系統?

無服務器體系結構指的是從開發人員中抽象出服務器管理任務的應用程序體系結構,並通過動態分配和管理計算資源來提高開發速度和效率。函數即服務(FaaS)是一個運行時被構建的無服務架構,可以在其上構建無服務器體系結構。FaaS框架作為短暫的容器運行,它們已經安裝了公共語言運行時,並允許在這些運行時內執行代碼。

FaaS框架應該能夠在各種基礎架構上運行,以實現真正有用,包括公共雲,混合雲和內部部署環境。在真實生產環境中基於FaaS運行時構建的無服務器框架應該能夠依靠經過驗證和測試的編排和管理功能來大規模部署容器和分佈式工作負載。

對於編排和管理,無服務器FaaS框架依賴Kubernetes,因為它能夠:

  • 跨主機群集編排容器。

  • 最大化程度的利用企業應用程序所需的硬件資源。

  • 管理和自動化應用程序部署並提供聲明式更新。

  • 通過掛載存儲運行有狀態應用程序。

  • 秒級擴容容器化應用程序並提供支持它們的資源。

  • 聲明式地管理服務。

  • 提供一個大盤,來檢查應用的健康情況,並通過自動重啟,自動複製和自動縮放來進行應用程序的自我修復。

無服務器系統可以包括通過客戶端請求觸發的功能或作為業務服務的一部分執行的功能。這兩個過程都可以使用容器集群管理器(如Kubernetes)進行編排。資料來源:dzone.com

我們將在本文中介紹三個無服務器框架各自的優點和缺點。這些FaaS框架之間的共同點是,它們能夠(1)將函數轉化為服務; (2)利用Kubernetes平臺管理這些服務的生命週期。這些框架背後的設計,會由於其用於實現的具體方式的不同而有差異,我們將在下一節中探討。我們將在以下部分中重點介紹這些框架之間的一些差異:

  1. 框架是在源碼級別或Docker鏡像級別還是在中間運行,例如buildpacks?

  2. 由於使用公共語言運行庫啟動容器,冷啟動性能的延遲或執行函數期間的延遲分別是多少?

  3. 它們如何為服務分配內存或資源?

  4. 它們如何訪問和部署Kubernetes的編排和容器管理功能?

B. OpenFaaS和部署Spring Boot模板

OpenFaaS是一個無服務器平臺,允許使用Docker或Kubernetes管理函數,因為它是基於OCI格式的容器。OpenFaaS可以支持企業級擴展的功能,如Docker Universal Control Plane企業級集群管理解決方案與Docker Enterprise或Tectonic for Kubernetes。OpenFaaS繼承了現有的容器安全功能,例如r/o文件系統,權限下降和內容信任。它能夠使用Docker或K8s調度程序/容器編排的管理功能,並且可以使用其相關的豐富的商業和社區供應商生態系統。同樣,由於其多語言特性,任何可執行文件都可以打包到OpenFaas中的函數中。

SpringBoot和Vertx是開發微服務的非常流行的框架,它們的易用性已經通過OpenFaaS模板擴展到OpenFaaS。這些模板允許在OpenFaaS平臺上無縫地開發和部署無服務器函數。模板在這裡的github存儲庫中可用。讓我們來看看如何在OpenFaaS平臺上部署SpringBoot模板。

在本地安裝OpenFaaS

在本地計算機上下載和安裝模板

我們需要安裝和配置FaaS CLI以與本地或遠程K8S或Docker配合使用。在本練習中,我們將使用本地Docker客戶端,並在後續工作中將其擴展到基於雲的GKE集群。

對於最新版本的CLI類型:

$ curl-sL https://cli.openfaas.com | sudo sh

[或通過MacOS上的brew install faas-cli。]

使用以下命令驗證本地安裝的模板:

faas-clinew--list

在我們創建無服務器函數之前,我們必須在本地計算機上安裝這些模板。

  1. faas-cli template pull https://github.com/tmobile/faas-java-templates.git

查看幫助菜單

可以為所有命令調用-help標誌。

$ faas-cli--help

從命令行管理您的OpenFaaS功能

用法: faas-cli [flags] faas-cli [command]

可用命令:

build 構建OpenFaaS功能容器

deploy 部署OpenFaaS功能

help 有關任何命令的幫助

push 將OpenFaaS功能推送到遠程倉庫(Docker Hub)

remove 刪除已部署的OpenFaaS功能

version 顯示客戶端版本信息

參數: -h--help 幫助FAAS-CLI -f--yamlstring 描述函數的yaml文件的路徑

有關命令的更多信息,請使用 faas-cli [command] --help

用已安裝的模板創建函數

使用來自Vertx/SpringBoot模板的github存儲庫中我們感興趣的函數,我們可以創建一個函數(用我們的函數替換大括號內的文本,我們使用springboot但你可以用vertx模板代替它):

faas-clinew{functionoffunction}--lang springboot

使用mvnw,命令是

  1. faas-cli new mvnw --lang vertx | springboot

  2. Folder: mvnw created.

  3. Function created in folder: mvnw

  4. Stack file written: mvnw.yml

mvnw.yml的內容現在可以與CLI一起使用。

注意:如果您的群集是遠程的或未在8080端口上運行 - 請在繼續之前在YAML文件中對其進行編輯。為我們的函數生成了handler.java文件。您可以編輯pom.xml文件,並在“build”步驟中安裝所有依賴項。

構建函數

現在我們已經創建了函數邏輯,我們可以使用faas cli build命令構建函數。我們將使用本地Docker客戶端將該函數構建到docker鏡像中。

  1. $ faas-cli build -f mvnw.yml

  2. Building: mvnw.

  3. Clearing temporary build folder: ./build/mvnw/

  4. Preparing ./mvnw/ ./build/mvnw/function

  5. Building: mvnw with node template. Please wait..

  6. docker build -t mvnw .

  7. Sending build context to Docker daemon  8.704kB

  8. Step 1/19 : FROM node:6.11.2-alpine

  9. ---> 16566b7ed19e

  10. Step 19/19 : CMD fwatchdog

  11. ---> Running in 53d04c1631aa

  12. ---> f5e1266b0d32

  13. Removing intermediate container 53d04c1631aa

  14. Successfully built f5e1266b0d32

  15. Successfully tagged mvnw:latest

  16. Image: mvnw built.

推送您的函數(可選,因為我們正在進行本地安裝)

為了部署我們的函數,我們將編輯mvnw.yml文件並將“image”行設置為Docker Hub上適用的用戶名,例如:hishamhasan/mvnw。然後我們將再次構建該函數。

  1. $ faas-cli push -f mvnw.yml

  2. Pushing: mvnw to remote repository.

  3. The push refers to a repository [docker.io/hishamhasan/mvnw]

完成此操作後,鏡像將被推送到Docker Hub或遠程Docker registry,我們可以部署並運行該函數。

部署函數

  1. $ faas-cli deploy -f mvnw.yml

  2. Deploying: mvnw.

  3. No existing service to remove

  4. Deployed.

  5. 200 OK

  6. URL: [http://localhost:8080/function/mvnw](http://localhost:8080/function/mvnw)

調用函數

  1. $ faas-cli invoke -f mvnw.yml callme

  2. Reading from STDIN - hit (Control + D) to stop.

  3. This is my message

  4. {"status":"done"}

我們還可以將命令傳遞給函數,例如:

  1. $ date | faas-cli invoke -f mvnw.yml mvnw

  2. {"status":"done"}

在Google Cloud Platform上安裝OpenFaaS

在使用OpenFaaS時,我們不限於任何本地或雲基礎架構。現在我們已經在本地Docker集群中部署了模板,我們可以通過在GCP中的GKE上設置它來利用OpenFaaS的多功能性。

  1. 創建一個名為的GCP項目

  2. 在此處 下載並安裝Google Cloud SDK。安裝SDK後,運行gcloud init,然後將默認項目設置為openfaas。

  3. 使用gcloud安裝kubectl: gcloud components install kubectl

  4. 導航到API Manager>憑據>創建憑據>服務帳戶密鑰。

  5. 選擇JSON作為密鑰類型。將文件重命名為json並將其放在項目中

  6. 添加剛剛在ComputeEngine> Metadata> SSH Keys下創建的SSH密鑰,並使用您的公共SSH密鑰作為值創建名為sshKeys的元數據條目。

  7. 創建一個三節點Kubernetes集群,每個節點位於不同的區域中。在此處 閱讀 有關群集聯合的信息,以瞭解如何選擇每個群集中的群集數和節點數,這些群集可能會根據負載或增長頻繁更改。

  1. k8s_version=$(gcloud container get-server-config --format=json | jq -r '.validNodeVersions[0]')

  2. gcloud container clusters create demo \

  3.   --cluster-version=${k8s_version} \

  4.   --zone=us-west1-a \

  5.   --additional-zones=us-west1-b,us-west1-c \

  6.   --num-nodes=1 \

  7.   --machine-type=n1-standard-2 \

  8.   --scopes=default,storage-rw

將默認節點池的大小增加到所需的節點數(在此示例中,我們將按比例增加3到9個節點):

gcloud container clusters resize--size=3

您可以通過調用此 頁面中 所述的合適的SDK命令來執行集群管理功能,例如刪除集群。

gcloud container clustersdeletedemo-z=us-west1-a

完整的管理設置

設置kubectl的憑據:

gcloud container clustersget-credentials demo-z=us-west1-a

創建集群管理員用戶:

  1. kubectl create clusterrolebinding "cluster-admin-$(whoami)" \

  2. --clusterrole=cluster-admin \

  3. --user="$(gcloud config get-value core/account)"

授予kubernetes-dashboard管理員權限(確保在非生產環境中完成):

  1. kubectl create clusterrolebinding "cluster-admin-$(whoami)" \

  2. --clusterrole=cluster-admin \

  3. --user="$(gcloud config get-value core/account)"

您可以通過使用kubectl反向代理在瀏覽器(或在 http//localhost:9099/ui )上調用 kubectl proxy--port=8080 和導航到 http//localhost:8080/ui 來訪問port-8080上的kubernetes-dashboard :http://localhost:9099/ui

kubectl proxy--port=9099&

Kubernetes集群由主節點和節點資源組成 - 主節點協調集群,節點運行應用程序,並通過Kubernetes API進行通信。我們使用OpenFaaS CLI構建了容器化應用程序並編寫了.yml文件來構建和部署該函數。通過在Kubernetes集群中的節點之間部署該函數,我們允許GKE分發和調度我們的節點資源。我們的節點已經配置了處理容器操作的工具,可以通過kubectl CLI。

資料來源:dzone.com

使用基本身份驗證部署OpenFaaS。

克隆openfaas-gke存儲庫:

  1. git clone https://github.com/tmobile/faas-java-templates.git

  2. cd openfaas-gke

創建openfaas和openfaas-fn名稱空間以在多租戶設置中部署OpenFaaS服務:

kubectl apply-f./namespaces.yaml

要在openfaas命名空間中部署OpenFaaS服務:

kubectl apply-f./openfaas

這將為OpenFaaS網關,FaaS-netesd(K8S控制器),Prometheus,警報管理器,Nats和隊列工作者提供K8s pods,部署和服務。

我們需要在通過設置身份驗證在Internet上公開OpenFaaS之前保護我們的網關。我們可以使用一組憑據創建一個通用的basic-auth祕密:

  1. kubectl -n openfaas create secret generic basic-auth \

  2. --from-literal=user=admin \

  3. --from-literal=password=admin

然後我們可以為我們的OpenFaaS網關部署Caddy,它既可以作為反向代理,又可以作為強大的負載均衡器,並支持WebSocket連接:

kubectl apply-f./caddy

然後,我們將使用K8s服務對象公開的外部IP訪問OpenFaaS網關UI,並使用我們的憑據訪問http://。我們可以通過運行kubectl get svc來獲取外部IP。

  1. get_gateway_ip() {

  2. kubectl -n openfaas describe service caddy-lb | grep Ingress | awk'{ print $NF }'

  3. }

  4. until [["$(get_gateway_ip)"]]

  5. do sleep1;

  6. echo -n ".";

  7. done

  8. echo "."

  9. gateway_ip=$(get_gateway_ip)

  10. echo "OpenFaaS Gateway IP: ${gateway_ip}"

注意:如果外部IP地址顯示為,請等待一分鐘再次輸入相同的命令。

如果您尚未執行上一個練習,請通過調用安裝OpenFaaS CLI。

curl-sL cli.openfaas.com|sh

然後使用CLI,憑據和K8s服務公開的外部IP登錄:

faas-cli login-u admin-p admin--gateway http://<EXTERNAL-IP>

注意:(a)您可以通過創建Ingress資源,使用Google Cloud L7 HTTPS負載均衡器公開OpenFaaS網關。您可以在 此處 找到有關創建負載均衡器的詳細指南。(b)您可以使用密碼創建文本文件,並將該文件與-password-stdin標誌一起使用,以避免在bash歷史記錄中輸入密碼。

您可以使用先前在上一個練習中發佈的鏡像並部署無服務器功能。

$ faas-cli deploy-f mvnw.yml

deploy命令在當前目錄中查找mvnw.yml文件,並部署openfaas-fn命名空間中的所有函數。

注意:(a)您可以使用com.openfaas.scale.min標籤設置最小運行pod數,併為autoscaler com.openfaas.scale.max設置最小副本數。OpenFaaS的默認設置是每個功能運行一個pod,並且在負載下最多可擴展到20個pod

調用無服務器功能。

faas-cli invoke mvnw--gateway=http://<GATEWAY-IP>

您可以隨時註銷:

faas-cli logout-gateway http://<EXTERNAL-IP>

C. Fission和部署簡單的HTTP請求

Fission是一個無服務器框架,它進一步抽象出容器鏡像,並允許僅通過函數在K8s上創建HTTP服務。Fission中的容器鏡像包含語言運行時,一組常用的依賴項和一個用於函數的動態加載器。可以定製這些圖像,例如打包二進制依賴項。Fission能夠通過維護一個正在運行的容器池來優化冷啟動開銷。當新請求來自客戶端應用程序或業務服務時,它會將該函數複製到容器中,動態加載它,並將請求路由到該實例。因此,對於NodeJS和Python函數,它能夠最小化100毫秒的冷啟動開銷。

通過在源碼級別進行操作,Fission使用戶不必處理容器的鏡像構建,將鏡像推送到註冊表,管理註冊表憑據,鏡像版本控制和其他管理任務。

https://kubernetes.io/blog/2017/01/fission-serverless-functions-as-service-for-kubernetes

如上圖所示,Fission被設計為一組微服務,主要組件如下所述:

  1. 跟蹤功能,HTTP路由,事件觸發器和環境鏡像的控制器;

  2. 管理空閒環境容器池的池管理器,將函數加載到這些容器中,並定期殺死函數實例以管理容器開銷;

  3. 一種路由器,它接收HTTP請求並將它們路由到poolmgr或已在運行的實例中的新鮮函數實例。

我們可以使用在上一個練習中GCP上創建的K8s群集在Fission上部署HTTP請求。讓我們走過這個過程吧。

1. 安裝Helm CLI, Helm是一個Kubernetes包管理器。讓我們初始化Helm:

  1.     $ helm init

2. 在GKE命名空間中安裝Fission

  1.     $ helm install --namespace fission https://github.com/fission/fission/releases/download/0.7.0/fission-all-0.7.0.tgz

3. 安裝Fission CLI

OSX

  1.    $ curl -Lo fission https://github.com/fission/fission/releases/download/0.7.0/fission-cli-osx&& chmod +x fission && sudo mv fission /usr/local/bin/

Windows 在 此處 下載Windows可執行文件。

1. 創建HTTP服務我們將創建一個簡單的HTTP服務來打印Hello World。

  1. $ cat > hello.py

  2. def main(context):

  3.    print "Hello, world!"

2. 在Fission上部署HTTP服務

  1. $ fission function create --name hello --env python --code hello.py --route /hello

  2. $ curl http://<fission router>/hello

  3. Hello, world!

D. Kubeless和部署Spring Boot模板

Kubeless是一個Kubernetes原生無服務器框架,可以將功能部署在K8s集群上,同時允許用戶利用Kubernetes資源提供自動擴展,API路由,監控和故障排除。Kubeless使用Kubernetes自定義資源定義來創建自定義kubernetes資源的功能。自定義資源是 Kubernetes API 中的端點,用於存儲API對象的集合某種類型的K8s pod對象,它代表了特定K8s安裝的自定義。自定義資源非常有用,因為它們可以通過動態註冊進行配置然後在正在運行的集群中刪除,集群管理員可以獨立於集群本身更新自定義資源。Kubeless利用這些功能並運行集群內控制器,可以跟蹤這些自定義資源並按需啟動運行時。

我們可以使用在上一個練習中GCP上創建的K8s群集在Fission上部署HTTP請求。讓我們走過這個過程吧。

1. 訪問Kubernetes儀表板

在K8s集群正在運行的情況下,我們可以使用kubectl在8080端口上使用儀表板:

kubectl proxy--port=8080

可以通過瀏覽器導航到http://localhost8080/i來訪問儀表板

2. 安裝Kubeless CLI

OSX

  1. $ curl -L https://github.com/kubeless/kubeless/releases/download/0.0.20/kubeless_darwin-amd64.zip > kubeless.zip

  2. $ unzip kubeless.zip

  3. $ sudo cp bundles/kubeless_darwin-amd64/kubeless /usr/local/bin/

Windows

在 此處 下載Windows可執行文件。

1. 在K8s群集中部署Kubeless

我們將使用此鏈接中 的清單在K8s群集中部署Kubless。根據清單創建一個kubeless命名空間,一個函數ThirdPartyResource,一個kubeless控制器,並在進程中設置一個kafka,zookeeper StatefulSet。Kubless的一個主要優點是它具有高度的Kubernetes原生特性,它可以設置非rbac和rbac特定環境。下面的屏幕截圖顯示瞭如何使用kubectl命令在非rbac環境中部署kubeless。

1. 創建函數

我們可以創建一個服務函數,並從請求中接受方法,URL,標題和請求體。

  1. const http = require('http');

  2.    http.createServer((request, response) => {

  3.      const { headers, method, url } = request;

  4.      let body = [];

  5.      request.on('error', (err) => {

  6.        console.error(err);

  7.      }).on('data', (chunk) => {

  8.        body.push(chunk);

  9.      }).on('end', () => {

  10.        body = Buffer.concat(body).toString();

  11.        // 此時,我們有標題,方法,網址和請求體,現在可以做任何我們需要的事情來回應這個要求。

  12.      });

  13.    }).listen(8080); // 激活此服務器,監聽8080端口。

2. 在Kubeless環境中運行函數

我們可以通過提供以下信息向Kubeless註冊該函數:

  1. 用於通過Web訪問該函數的名稱

  2. 用於訪問該函數的協議

  3. 要執行以運行代碼的語言運行時

  4. 包含函數代碼的文件的名稱

  5. 文件內部函數的名稱

通過添加上面的變量1-5,我們調用以下命令在Kubeless中註冊和部署函數:

kubelessfunctiondeploy serverequest--trigger-http--runtime nodejs6--handler serverequest.createServer--from-file/tmp/serverequest.js

E.無服務器平臺的評估

我們評估的每個無服務器平臺都有其獨特的價值主張。使用OpenFaas,任何進程或容器都可以打包為Linux或Windows的無服務器功能。對於企業而言,OpenFaaS使用的體系結構提供了無縫插入計劃群集和現有微服務的CI/CD工作流的能力,因為OpenFaaS是圍繞Docker構建的,所有功能都打包到Docker鏡像中。OpenFaaS還為企業提供了一種通過外部API,網關管理和執行函數的無縫方式,並管理函數的生命週期,包括通過提供商進行部署,擴展和secret管理。

Fission具有事件驅動架構,使其成為短期無狀態應用程序的理想選擇,包括REST API或webhook實現以及DevOps自動化。使用Fission的一個很好的用例可能是開發聊天機器人的後端,因為Fission可以實現良好的冷啟動性能,並在需要時通過保持運行時的容器池來提供快速響應時間。

最後,Kubeless架構利用原生Kubernetes概念來部署和管理功能,例如自定義資源定義,用於定義功能和自定義控制器來管理函數,將其部署為Kubernetes部署並通過Kubernetes服務公開它。與Kubernetes原生功能的緊密結合將吸引現有的Kubernetes用戶,降低所需的學習曲線並無縫插入現有的Kubernetes架構。

關於作者


Hisham是一位諮詢企業解決方案架構師,在利用容器技術解決基礎架構問題和更快地部署應用程序以及更高級別的安全性,性能和可靠性方面擁有豐富的經驗 最近,Hisham一直在為各種中間件應用程序利用容器和雲原生架構,以在整個企業中部署複雜的關鍵任務服務。在進入諮詢領域之前,Hisham曾在Aon Hewitt,Lexmark和ADP從事軟件實施和技術支持工作。

Istio

IBM Istio

  • 111 Istio

  • 118 Istio 上手

  • 1115 Istio

  • 11月22日 Envoy

  • 1129 使Istio

  • 126 Istio mixer -

  • 1213 Istio

  • 1220 Istio使Serverless knative

  • IBMIstio

點擊【閱讀原文】跳轉到網站上瀏覽可以查看文中的鏈接。

  • SOFAMesh(https://github.com/alipay/sofa-mesh)基於Istio的大規模服務網格解決方案

  • SOFAMosn(https://github.com/alipay/sofa-mosn)使用Go語言開發的高性能Sidecar代理

合作社區

參與社區

以下是參與ServiceMesher社區的方式,最簡單的方式是聯繫我!

  • 加入微信交流群:關注本微信公眾號後訪問主頁右下角有獲取聯繫方式按鈕,添加好友時請註明姓名-公司

  • 社區網址:http://www.servicemesher.com

  • Slack:https://servicemesher.slack.com (需要邀請才能加入)

  • GitHub:https://github.com/servicemesher

  • Istio中文文檔進度追蹤:https://github.com/servicemesher/istio-official-translation

  • Twitter: https://twitter.com/servicemesher

  • 提供文章線索與投稿:https://github.com/servicemesher/trans


閱讀原文

TAGS: