當前位置:
首頁 > 最新 > 功能即服務介紹

功能即服務介紹

功能即服務是在容器之上構建無伺服器功能的框架。我在去年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原生應用步驟介紹等,點擊識別下方二維碼加微信好友了解具體培訓內容

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Docker 的精彩文章:

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

TAG:Docker |