功能即服務介紹
功能即服務是在容器之上構建無伺服器功能的框架。我在去年10月份開始這個項目,用來理念論證,理解是否可以在Docker Swarm上運行Alexa skills或者Lambda功能。在一開始的一些成功之後,我在12月份將第一個版本的Go代碼發布到GitHub(https://github.com/alexellis/faas/commits/master)上。
本文直接介紹無伺服器計算,然後介紹在之前500次commit里FaaS的3大特性,最後展望未來。
從第一次commit開始,FaaS持續推進,在GitHub上獲得了2500多個star,同時還出現了一個開發者和黑客的小型社區(https://github.com/alexellis/faas/blob/master/community.md),我們會在聚會中發表演講,編寫自己的很cool的功能,並且貢獻代碼。我自己的一大收穫是在4月份Austin舉辦的Dockercon上獲得了Moby『s Cool Hacks keynote分會場的一個席位。大家想要將Docker設計用來完成的事情的邊界進一步擴展。
無伺服器是什麼?
架構還在演進
「無伺服器」這個詞並不是很恰當——我們實際討論的是事件驅動系統的一種全新架構模式。基於此,無伺服器功能常常被用來作為服務間的連接,或者用在事件驅動的架構里。在過去,我們稱之為服務匯流排。
無伺服器功能
無伺服器是一段小型的,無關聯的,並且可重用的代碼:
它是短暫的
它不是daemon(長期運行的)
它不發布TCP服務
它沒有狀態
利用已有服務或者第三方資源
幾秒內完成執行(基於AWS的Lambda)
我們還需要區分開無伺服器產品和IaaS供應商以及開源軟體項目。
一方面,IaaS供應商提供無伺服器產品,比如Lambda,Google Cloud Functions以及Azure Functions。另一方面,有FaaS這樣的框架,讓編排平台,比如Docker Swarm或者Kubernetes做重量的事情。
IaaS供應商提供的無伺服器產品是完全受控的,因此它提供了高度的便捷性和基於秒/分鐘的計費方案。另一面是,用戶需要跟蹤供應商的發布和支持周期。開源的FaaS想要提供一些多樣性以供大家選擇。
FaaS的差異化在哪裡?
FaaS基於業界標準的Cloud Native技術構建:
FaaS項目的差異化在於,任意流程都可以通過watchdog(https://github.com/alexellis/faas/tree/master/watchdog)組件和Docker容器成為無伺服器的功能。這意味著如下三點:
用戶可以運行任意語言編寫的代碼
可以運行任意時間
可以在任何地方運行
轉向無伺服器化並不意味著用另一種編程語言重寫代碼。只需繼續使用業務和團隊需要的東西即可。
示例:比如,cat或者sha512sum可以作為一種不需要變更的功能,通過stdin/stdout通信。Windows功能也可以通過Docker CE支持。
這是FaaS和其他開源無伺服器框架的主要區別,它們依賴於每種所支持的語言的特定運行時。
下面介紹DockerCon之後的三大主要特性,包括CLI
(https://github.com/alexellis/faas-cli)和功能模板,Kubernetes支持以及非同步處理。
1. 全新的CLI
易於部署
我給FaaS項目添加了CLI,讓部署功能更為簡易和腳本化。在這之前,用戶可以使用API Gateway的UI或者curl。CLI讓大家可以在YAML文件里定義功能,隨後部署到API Gateway上。
Finnian Anderson在Practical Dev/dev.to上(http://t.cn/RNejhxu)寫了一篇介紹FaaS CLI的很好的文章。
Utility腳本和Brew
有安裝腳本可以用,John McCabe在brew上維護了項目的recipe。
$ brew install faas-cli
或者
$ curl -sL https://cli.get-faas.com/ sudo sh
模板
CLI的模板是你唯一需要用所選的編程語言編寫handler的地方,CLI會使用模板將其打包成Docker容器——FaaS會處理所需的步驟。
提供了Python和Node.js的模板,但是你可以輕鬆創建自己的。
CLI支持三種操作:
-action build:從模板在本地創建Docker鏡像
-action push:將模板推送到指定的registry或者Hub上
-action deploy:部署FaaS功能。
如果有一個單節點的集群,那麼不需要推送鏡像就可以部署。
YAML格式的CLI配置配置示例:
provider: name: faasgateway: http://localhost:8080functions: url_ping:lang: pythonhandler: ./sample/url_pingimage: alexellis2/faas-urlping
Python功能的最簡潔的handler:
def handle(req): print(req)
通過HTTPpingsURL獲得返回代碼的示例:
import requestsdef print_url(url): try: r = requests.get(url,timeout = 1) print(url +" => " + str(r.status_code))except: print("Timed out trying to reach URL.")def handle(req): print_url(req)
如果需要添加額外的pip模塊,那麼除了提供handler.py文件之外還需要提供requirements.txt文件。
$ faas-cli -action build -f ./sample.yml
之後可以找到一個稱為alexellis2/faas-urlping的Docker鏡像,可以使用-action push將其推送到DockerHub上,使用-action deploy將其部署。
2. Kubernetes支持
作為一名Docker Captain,我主要關注與學習和宣傳Docker Swarm,但是我需要持續關注Kubernetes。我從在Linux和Mac上搭建Kubernetes開始,並且寫了三篇介紹性文章(https://blog.alexellis.io/tag/k8s/),在社區也造成了一定的影響。
架構Kubernetes的支持
當我理解了如何將Docker Swarm的理念映射到Kubernetes之後,我就在幾天之內實現了技術原型。我選擇了創建一個新的微服務daemon和Kubernetes交互,而不是給主要的FaaS代碼及引入額外的依賴條件。
FaaS通過標準的RESTful介面將調用路由到新的daemon上,完成各種操作,比如:Deploy,List,Delete,Invoke和Scale。
這樣的方案意味著UI,CLI和自動擴展都不需要改動就可以使用。新的微服務在一個新的GitHub repository,名為FaaS-netes(https://github.com/alexellis/faas-netes)的項目里維護。你可以在60秒內在你的集群里使用起來。
Kubernetes支持的演示
在這個演示里,我將FaaS部署到一個空集群里,然後介紹如何使用UI,Prometheus(https://prometheus.io/)並且觸發自動擴展。
但是等一下……其他三種框架在Kubernetes上可以用么?
Kubernetes的無伺服器框架大概分為兩大類——一種對於每種所支持的編程語言都需要依賴於特定的運行時,一種像FaaS一樣,可以讓任意容器成為功能。
FaaS綁定到Docker Swarm和Kubernetes的原生API上,意味著它使用你已經使用的第一級對象來管理Deployment和Service。也就是說,這裡沒什麼代碼去理解你的新應用程序的邏輯。
選擇框架時的一個考慮是是否想要貢獻特性或者fix。比如,OpenWhisk,是用Scala編寫的,大部分其他框架使用Golang寫的。
Funktion(https://github.com/funktionio/funktion)
Iron Functions(https://github.com/iron-io/functions)
OpenWhisk(https://github.com/apache/incubator-openwhisk)
Kubeless(https://github.com/kubeless/kubeless)
Fission(https://github.com/fission/fission)
FaaS-netes(https://github.com/alexellis/faas-netes)
3. 非同步處理
無伺服器功能的一大特徵是小而快,通常在幾秒之內就非同步完成了。想要非同步處理功能的幾點理由是:
它是一個事件並且調用者不需要結果
它需要很長時間執行或者初始化——比如,TensorFlow/機器學習
在批量job里消費大量請求
想要限制速度
我通過分散式隊列做了個非同步處理的原型。實現使用的是NATS Streaming(http://nats.io/documentation/streaming/nats-streaming-intro/)項目,但是無法擴展使用Kafka或者其他看上去像隊列的抽象方式。
嘗試非同步代碼的Gist:
燒腦式Kubernetes實戰訓練營
本次培訓理論結合實踐,主要包括:Kubernetes架構和資源調度原理、Kubernetes DNS與服務發現、基於Kubernetes和Jenkins的持續部署方案 、Kubernetes網路部署實踐、監控、日誌、Kubernetes與雲原生應用、在CentOS中部署Kubernetes集群、Kubernetes中的容器設計模式、開發Kubernetes原生應用步驟介紹等,點擊識別下方二維碼加微信好友了解具體培訓內容。


※Kubernetes可以為容器編排做點什麼?
※58 趕集基於 Docker 的自動化部署實踐
TAG:Docker |