使用Nomad和OpenFaaS提供FaaS服务
將應用程序分解為由AWS Lambda、谷歌函數和Azure函數推廣的小工作單元的概念是現代軟件體系架構中最流行的趨勢之一。Serverless的主要好處是,您不必管理底層應用程序基礎架構,開發人員可以集中精力在交付業務價值方面。
雖然Serverless的開發人員工作流可能非常有吸引力,但是有一些原因說明這種方法可能不適合您的組織:
OpenFaaS(或FaaS)是一個框架,用于構建沒有服務器的函數,但是使用了容器。有了OpenFaaS,您可以將任何進程或容器作為Linux或Windows的無服務器函數進行打包—只需使用Nomad集群即可。這個項目通過它的UI和CLI來關注易用性,這兩個UI和CLI可以用于測試和監視函數,同Prometheus配合提供了自動縮放功能。
架構
OpenFaaS圍繞Docker進行構建;所有功能都打包到Docker鏡像中,這是微服務常用的工作流。由gateway、provider和monitoring element這三個核心組件組成。
Gateway是允許管理和執行函數的外部API。它不直接與Nomad交互,而是將此責任委托給一個管理函數生命周期的Provider:部署、擴展和認證管理。Gateway和Provider都發出調用計數和計時數據等指標(metrics),這些數據是使用Prometheus收集的。
Prometheus還能夠根據存儲的指標來廣播警報。該功能允許Gateway偵聽警報并對其作出反應。一個典型的例子是根據負載或其他因素自動觸發函數縮放。
讓我們看看在Nomad上使用OpenFaaS創建和部署函數是多么容易。
在Nomad上運行OpenFaaS
要在Nomad集群上運行OpenFaaS,可以使用Nomad提供者Github存儲庫中的示例作業文件: https://raw.githubusercontent.com/hashicorp/faas-nomad/master/nomad_job_files/faas.hcl
$ wget https://raw.githubusercontent.com/hashicorp/faas-nomad/master/nomad_job_files/faas.hcl faas.hcl $ nomad run faas.hcl或者為什么不從這篇文章開始啟動交互式終端呢,交互式終端已經預先安裝了Nomad、Consul和OpenFaaS。
啟動交互式演示
創建一個新函數
要創建一個新函數,我們可以利用OpenFaaS CLI faas-cli,這對于大多數平臺(如Windows、Linux和MacOS)都是可用的。它還支持許多編程語言,如Node、Python和Go。
Languages available as templates: - csharp - go - go-armhf - node - node-arm64 - node-armhf - python - python-armhf - python3 - ruby除了官方模板之外,您還可以使用社區提交的模板。我們將使用綁定的Go模板并創建一個名為bcrypt的函數。
$ faas-cli new -lang go bcrypt Folder: bcrypt created.___ _____ ____/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___| | | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \ | |_| | |_) | __/ | | | _| (_| | (_| |___) |\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/|_|Function created in folder: bcrypt Stack file written: bcrypt.yml新命令為bcrypt/handler.go函數和當前文件夾里的函數定義文件 bcrypt.yml創建了入口點。
$ tree -L 2 . ├── bcrypt │ └── handler.go ├── bcrypt.yml └── template├── csharp├── go├── go-armhf├── node├── node-arm64├── node-armhf├── python├── python-armhf├── python3└── ruby看看handler.go中包含了我們的示例函數代碼,我們可以看到它只包含一個帶有簡單接口的函數。參數以字節碼的形式傳給函數,輸出是一個簡單的字符串。
package functionimport ("fmt" )// Handle a serverless request func Handle(req []byte) string {return fmt.Sprintf("Hello, Go. You said: %s", string(req)) }讓我們將這個函數替換為允許使用bcrypt對字符串進行哈希的東西。編輯文件bcrypt/handler.go并用以下函數替換內容:
$ vim bcrypt/handler.go package functionimport ("golang.org/x/crypto/bcrypt" )// Handle a serverless request func Handle(req []byte) string {hash, err := bcrypt.GenerateFromPassword(req, bcrypt.DefaultCost)if err != nil {return ""}return string(hash) }一旦你保存了你的文件,讓我們運行gofmt命令來檢查有沒有語法錯誤:
gofmt -s -w bcrypt/handler.go我們使用的是位于golang實驗包的bcrypt庫,因此我們需要向vendor提供依賴項,我們可以使用dep這個go的依賴管理工具來做到這一點。
$ cd bcrypt $ dep initUsing master as constraint for direct dep golang.org/x/cryptoLocking in master (b3c9a1d) for direct dep golang.org/x/crypto $ cd -下一步是構建我們的函數,并將其部署到Nomad,在此之前,我們需要編輯bcrypt.yml文件,更改image字段來設置一個Docker倉庫。
provider:name: faasgateway: https://my.gateway.comfunctions:bcrypt:lang: gohandler: ./bcryptimage: my.docker.registry.com/bcrypt我們還更改了gateway字段并指向Nomad集群上運行的網關。
如果使用交互式終端,那么環境變量FAAS_GATEWAY和DOCKER_REGISTRY將包含要添加到bcrypt.yml文件中的正確值。
$ sed -i "s#^\(\s*image\s*:\s*\).*#\1${DOCKER_REGISTRY}/bcrypt#" bcrypt.yml $ sed -i "s#^\(\s*gateway\s*:\s*\).*#\1${FAAS_GATEWAY}#" bcrypt.yml現在我們來構建我們的函數:
$ faas-cli build --yaml bcrypt.yml [0] > Building: bcrypt. Clearing temporary build folder: ./build/bcrypt/ #... Removing intermediate container a5e0be2bfdc9 Successfully built 74cbd7f5e103 Successfully tagged bcrypt:latest Image: bcrypt built. [0] < Builder done.構建過程在Docker容器中執行,而不是Docker,并且faas-cli中不需要任何其他依賴項。在部署函數前需要將函數推到Docker倉庫,我們可以使用faas-cli push命令來完成此任務。
$ faas-cli push --yaml bcrypt.yml [0] > Pushing: bcrypt. The push refers to a repository [2886795314-5000-ollie01.environments.katacoda.com/bcrypt] 974e4f38d961: Layer already exists 8af4da1e470e: Layer already exists f6a874b4e2c7: Layer already exists ec8a829eb761: Layer already exists 60273f4e6fd4: Pushed 2aebd096e0e2: Layer already exists latest: digest: sha256:b253f51abbcc53b69c84eed015cc244871de6049e4410200230c2612408a4075 size: 1574 [0] < Pushing done.現在將該函數部署到Nomad集群上的OpenFaaS。
$ faas-cli deploy --yaml bcrypt.yml Deploying: bcrypt. Removing old function. Deployed. URL: https://2886795314-8080-ollie01.environments.katacoda.com/function/bcrypt200 OK當我們部署一個函數時,OpenFaaS網關將委托給在集群上創建作業的Nomad provider。您可以使用nomad status命令檢查函數是否正在運行。
$ nomad status ID Type Priority Status Submit Date OpenFaaS-bcrypt service 1 running 01/10/18 17:37:16 UTC faas-nomadd system 50 running 01/10/18 17:14:08 UTC為了測試我們的函數,我們可以使用faas-cli,或者使用它的HTTP接口調用函數。首先,讓我們使用faas-cli命令:
$ echo "password" | faas-cli invoke --yaml bcrypt.yml bcrypt $2a$10$zFYttFRKZorR3zHsoquQ5.qypL0/4vTbzjzM2bWdzOBtMq8XhXSZG我們還可以使用curl或使用網關URL的其他HTTP客戶端調用它:
$ curl -d 'Nic' $FAAS_GATEWAY/function/bcrypt $2a$10$FddcGwse0z0PlX6o3tr.SuGgUK9poanZLvqdGHAjz.L9Jp.J5qGI6這就是創建和部署最基本的函數所需的全部內容,以查看更全面的示例,包括如何使用測試驅動的方法創建函數,為什么不查看我的發送tweet的示例:https://github.com/nicholasjackson/openfaas -functions/tree/master/tweet???????
總結
我們希望你喜歡這篇文章,我們期待聽到你用Nomad和OpenFaaS創建的奇妙的東西。
如果您想深入了解,請查看OpenFaaS文檔:https://github.com/openfaas/faas/blob/master/guide/README.md
有關Nomad提供程序的更多信息,包括如何使用Prometheus配置監控,請參閱我們的GitHub repo文檔:https://github.com/hashicorp/faas-nomad
最后,如果你想從OpenFaaS中獲得一些靈感,請關注OpenFaaS的創始人Alex Ellis的博客:https://blog.alexellis.io???????
總結
以上是生活随笔為你收集整理的使用Nomad和OpenFaaS提供FaaS服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HashiCorp Nomad中的高级节
- 下一篇: 权限系统设计模型分析(DAC,MAC,R