1. 程式人生 > >學習基於 Kubernetes 的 Serverless 無服務架構 Fission

學習基於 Kubernetes 的 Serverless 無服務架構 Fission

目錄

1、Serverless & Fission 介紹

1.1、Serverless

Serverless AWS 官方對 Serverless 的介紹:伺服器架構是基於網際網路的系統,應用開發不使用常規的服務程序,而是依賴於第三方服務,客戶端邏輯和服務託管遠端過程呼叫的組合。簡單的講,Serverless 就是指應用的開發不再需要考慮伺服器的硬體基礎設施,而是依賴於第三提供的後端服務(Baas)和應用邏輯執行容器(FaaS),但是並不是意味著沒有伺服器,而是伺服器以特定功能的第三方服務的形式存在。

Serverless 帶來的好處:

  • 降低了硬體基礎設施的部署和維護成本
  • 方便應用服務的擴充套件和監控,因為依賴的第三方執行平臺基本都支援動態擴充套件和服務監控。
  • 降低了由於應用服務訪問流量變化而帶來的硬體資源的浪費。
  • 方便開發者專注應用的開發,更快速的釋出應用,而不需要關注基礎架構的問題。

1.2、Fission

Fission 是由 Platform9 維護的一個開源的專案,它是基於 Kubernetes 的無服務框架。通過它,我們可以編寫任何語言的 Function 程式碼,只需要一條簡單的命令既可以完成整個 Function 的部署及擴充套件,而且過程中不會建立任何容器,不需要管理任何 Docker 倉庫,最終將其對映(或其他 triggers)到 HTTP 請求供外部訪問。

Fission 的工作流程圖如下:
fission

通過官方提供的示意圖,我們可以瞭解一下各核心元件功能,Controller 負責提供 Fission API、追蹤函式、Http 路由、事件觸發以及環境映象;Router 負責接收 Http 請求,並將其路由到後端 Kubernetes 叢集中對應的 Function 例項上去,若後端無正在執行的例項,則會向 PoolImgr 池子請求新的例項;PoolImgr 負責管理一定數量的環境容器池子,並將部署的函式載入到這些容器中,來啟動例項,同時還會 Kill 掉空閒的例項來釋放資源。

其大概執行流程為,當 Router 接受到 HTTP 請求時,它會先從快取中查詢,查詢是否已存在一個路由過的服務,如果有,則直接對映過去,若沒有,則會查詢匹配請求的 Function,並向 PoolImgr 請求一個新的例項,PoolImgr 維護一定數量的空閒環境容器池子,它會選擇一個池子,將 Function 動態載入進去執行,並將 Pod 地址返回給 Router,Router 將請求代理到該 Pod,由該 Pod 執行並返回結果。執行完畢,該 Pod 也會被快取起來供後續請求使用,如果該 Pod 空閒了幾分鐘沒被呼叫,那麼 PoolImgr 就會將其 Kill 掉,而這整個過程所有元件都通過關注 Controller 提供的 API 來更新。

Fission 核心也是利用 CRD 自定義資源型別來實現其整個部署流程,上一篇文章 Kubernetes CRD (CustomResourceDefinition) 自定義資源型別 中我對 Kubernetes CRD 的工作原理和原始碼做了簡要的分析,可以先參考下該文章對其大概瞭解一下。

2、環境、軟體準備

本次演示環境,我是在本機 MAC OS 上操作,以下是安裝的軟體及版本:

  • Docker: 17.09.0-ce
  • Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2)
  • Minikube: v0.28.2
  • Kubernetes: v1.10.0
  • Fission: 0.10.0
  • Kubectl:
    • Client Version: v1.11.1
    • Server Version: v1.10.0

注意:這裡 Kubernetes 叢集搭建使用 Minikube 來完成,Minikube 啟動的單節點 k8s Node 例項是需要執行在本機的 VM 虛擬機器裡面,所以需要提前安裝好 VM,這裡我選擇 Oracle VirtualBox。k8s 執行底層使用 Docker 容器,所以本機需要安裝好 Docker 環境,這裡忽略 Docker、VirtualBox、Minikube、Kubectl 的安裝過程,可以參考之前文章 Minikube & kubectl 升級並配置, 這裡著重介紹下 Fission 安裝與部署。

3、Fission CLI 安裝

首先,我們需要下載一個類似 kubectl 工具的 Fission CLI 命令列客戶端,用來執行 Fission 相關命令操作,可以從這裡 Github Fission Release Page 選擇系統對應的最新版本檔案,這裡我選擇 fission-cli-osx 版本執行如下命令即可完成安裝。

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

安裝完畢,通過 fission -h 檢視該工具相關命令列引數說明。

$ fission -h
AME:
   fission - Serverless functions for Kubernetes

USAGE:
   fission [global options] command [command options] [arguments...]

VERSION:
   0.10.0

COMMANDS:
     function, fn                  Create, update and manage functions
     httptrigger, ht, route        Manage HTTP triggers (routes) for functions
     timetrigger, tt, timer        Manage Time triggers (timers) for functions
     mqtrigger, mqt, messagequeue  Manage message queue triggers for functions
     replay                        Replay records
     environment, env              Manage environments
     watch, w                      Manage watches
     package, pkg                  Manage packages
     spec, specs                   Manage a declarative app specification
     upgrade                       Upgrade tool from fission v0.1
     plugin, plugins               Manage Fission CLI plugins
     help, h                       Shows a list of commands or help for one command

PLUGIN COMMANDS:

GLOBAL OPTIONS:
   --server value     Fission server URL
   --verbosity value  CLI verbosity (0 is quiet, 1 is the default, 2 is verbose.) (default: 1)
   --help, -h         show help
   --version, -v      print the version

4、Fission 部署

接下來,我們就可以部署 Fission 了。這裡官方提供多種方案部署,可以使用 Helm 部署或 Yaml 檔案部署。

Helm 部署:(注意 Helm 的安裝與初始化,可以參考之前文章 Kubernetes 叢集使用 Helm 搭建 GitLab 並配置 Ingress5、安裝並初始化 Helm 部分,這裡就不在演示了。)

$ helm install --namespace fission --set serviceType=NodePort,routerServiceType=NodePort https://github.com/fission/fission/releases/download/0.10.0/fission-all-0.10.0.tgz

注意:這裡 ServiceTyperouterServiceType 配置為 NodePort 型別,意思是該元件暴漏服務型別為 NodePort,來供外部訪問,如果我們不需要外部訪問該元件服務,可以設定為 ClusterIP。Fission 最新版安裝包 fission-all-0.10.0.tgz,這裡是包含所有元件安裝包(NATS message queue、influxDB、etc等),亦可以選擇 fission-core-0.10.0.tgz 簡潔版安裝包,它將不安裝部分元件,有需要使用時在自己安裝擴充套件。

Yaml 部署:(也可以直接使用 yaml 檔案配置,同樣分為包含完整元件版本和簡潔版,因為我們 Kubernetes 部署在 Minikube 中,所以選擇官方提供的針對 Minikube 版本 Yaml 檔案。)

# 針對 Minikube 完整版
$ kubectl create -f https://github.com/fission/fission/releases/download/0.10.0/fission-all-0.10.0-minikube.yaml

# 針對 Minikube 簡潔版
$ kubectl create -f https://github.com/fission/fission/releases/download/0.10.0/fission-core-0.10.0-minikube.yaml

由於我本地安裝了 Helm,所以本次演示採用 Helm 方式部署。注意:初次安裝可能會失敗,因為需要下載映象會消耗比較長時間,而導致部署超時失敗,這裡可以選擇提前在 Minikube 中下載好對應映象,亦或在 Helm 安裝時指定超時時間 --timeout 3600 久一些。該版本 0.10.0 完整版依賴的映象如下:

Type Images Tag
fission fission/fission-bundle 0.10.0
fission fission/fluentd 0.10.0
fission fission/fetcher 0.10.0
fission fission/alpinecurl latest
influxdb tutum/influxdb latest
nats nats-streaming latest
redis redis 3.2-alpine

部署完畢後,我們可以通過 kubectl 命令檢視下部署了那些資源。

$ kubectl get all -n fission
NAME                                  READY     STATUS      RESTARTS   AGE
buildermgr-6659979dd9-cg284           1/1       Running     0          1d
controller-6866555767-dg2bh           1/1       Running     0          1d
executor-8589dc8d87-m6nmj             1/1       Running     0          1d
influxdb-6799f75947-7t7mp             1/1       Running     0          1d
kubewatcher-776b94c675-h9br6          1/1       Running     0          1d
logger-h62qj                          1/1       Running     0          1d
mqtrigger-7c88844c45-cj42f            1/1       Running     2          1d
nats-streaming-7686cd7ff4-vhqcv       1/1       Running     0          1d
redis-0                               1/1       Running     0          1d
router-7ff4978fc9-69lcz               1/1       Running     0          1d
storagesvc-756954d956-vrcn4           1/1       Running     0          1d
sullen-bee-fission-all-0.10.0-kdbj6   1/1       Running     0          1d
timer-cf5f86697-w6wkb                 1/1       Running     0          1d

NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
controller       NodePort    10.96.39.6       <none>        80:31313/TCP     1d
executor         ClusterIP   10.110.107.87    <none>        80/TCP           1d
influxdb         ClusterIP   10.104.93.199    <none>        8086/TCP         1d
nats-streaming   NodePort    10.106.11.138    <none>        4222:31316/TCP   1d
redis            ClusterIP   10.105.120.217   <none>        6379/TCP         1d
router           NodePort    10.107.119.210   <none>        80:31314/TCP     1d
storagesvc       ClusterIP   10.110.55.9      <none>        80/TCP           1d

NAME      DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
logger    1         1         1         1            1           <none>          1d

NAME             DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
buildermgr       1         1         1            1           1d
controller       1         1         1            1           1d
executor         1         1         1            1           1d
influxdb         1         1         1            1           1d
kubewatcher      1         1         1            1           1d
mqtrigger        1         1         1            1           1d
nats-streaming   1         1         1            1           1d
router           1         1         1            1           1d
storagesvc       1         1         1            1           1d
timer            1         1         1            1           1d

NAME                        DESIRED   CURRENT   READY     AGE
buildermgr-6659979dd9       1         1         1         1d
controller-6866555767       1         1         1         1d
executor-8589dc8d87         1         1         1         1d
influxdb-6799f75947         1         1         1         1d
kubewatcher-776b94c675      1         1         1         1d
mqtrigger-7c88844c45        1         1         1         1d
nats-streaming-7686cd7ff4   1         1         1         1d
router-7ff4978fc9           1         1         1         1d
storagesvc-756954d956       1         1         0         1d
timer-cf5f86697             1         1         1         1d

NAME      DESIRED   CURRENT   AGE
redis     1         1         1d

NAME                            DESIRED   SUCCESSFUL   AGE
sullen-bee-fission-all-0.10.0   1         1            1d

還記得上邊講到,Fission 核心也是利用 CRD 自定義資源型別來實現其整個部署流程,我們可以檢視下其部署了那些自定義資源型別吧!

$ kubectl get crd |grep fission
NAME                                 AGE
environments.fission.io              1d
functions.fission.io                 1d
httptriggers.fission.io              1d
kuberneteswatchtriggers.fission.io   1d
messagequeuetriggers.fission.io      1d
packages.fission.io                  1d
recorders.fission.io                 1d
timetriggers.fission.io              1d

5、Fission Demo 演示

Fission 部署完畢,接下來,我們就可以使用 Fission CLI 來執行一個官方提供的簡單的示例,使用 Node 環境執行輸出 Hello world!。操作命令很簡單,如下:

# 下載 hello.js 示例程式碼
$ curl -LO https://raw.githubusercontent.com/fission/fission/master/examples/nodejs/hello.js
$ cat hello.js
module.exports = async function(context) {
    return {
        status: 200,
        body: "Hello, world!\n"
    };
}

# 製作 nodejs 環境
$ fission env create --name nodejs --image fission/node-env:0.10.0
environment 'nodejs' created

# 建立 hello function
$ fission function create --name hello --env nodejs --code hello.js
function 'hello' created

# 測試呼叫 hello function
$ fission function test --name hello
Hello, world!

是不是很簡單,就通過這麼三步就建立了一個基於 node 環境的 Function,而且可以正常呼叫返回。接下來,我們看下它每一步大致幹了些了啥。

5.1、製作 nodejs 環境

該步驟主要是為了建立一個基於 fission/node-env:0.10.0 映象的 Node 環境,後續部署呼叫 Function 時,動態載入 Function 程式碼到該環境中,既可直接執行。而這些環境映象就是上邊咱們提到的 PoolImgr,它提供一定數量空閒的環境映象池,同時 Kill 掉空閒超過幾分鐘的例項。

建立完畢,Fission 命令檢視下建立的 ENV 列表。

$ fission env list
NAME   UID                                  IMAGE                   POOLSIZE MINCPU MAXCPU MINMEMORY MAXMEMORY EXTNET GRACETIME
nodejs 1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce fission/node-env:0.10.0 3        0      0      0         0         false  360

注意:如果我們建立 ENV 時未指定 PoolSize 時,預設為 3,即建立數量為 3 的環境池子,我們可以通過 kubectl get pod -n fission-function 檢視下是否確實如此。

$ kubectl get pods -n fission-function
NAME                                                              READY     STATUS    RESTARTS   AGE
nodejs-1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce-guhjfbvr-5c5655w9hd   2/2       Running   0          11m
nodejs-1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce-guhjfbvr-5c565hvxr9   2/2       Running   0          11m
nodejs-1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce-guhjfbvr-5c565zwtvt   2/2       Running   0          9m

我們還可以看到,列表中存在 MINCPU MAXCPU MINMEMORY MAXMEMORY 列,這些列會顯示該環境配置分配的最小/最大 CPU、Memory,這些都是在建立時可以在命令列指定的。

$ fission env create --name nodejs --image fission/node-env:0.10.0 --mincpu 40 --maxcpu 80 --minmemory 64 --maxmemory 128 --poolsize 4

如果刪除該環境,可以通過 fission env delete --name <ENV_NAME> 來刪除。

5.2、建立 hello Function

該步驟主要是為了部署 Function 程式碼到指定 ENV 中,動態建立並提供外部呼叫返回結果。

建立完畢,Fission 命令檢視下建立的 Function 列表。

$ fission fn list
NAME  UID                                  ENV    EXECUTORTYPE MINSCALE MAXSCALE MINCPU MAXCPU MINMEMORY MAXMEMORY TARGETCPU
hello 46bdfa33-b4c9-11e8-bbbb-080027c7f5ce nodejs poolmgr      0        1        0      0      0         0         80

注意:我們看到 EXECUTORTYPE 列建立時未指定型別,預設為 poolmgr,這裡 Fission 提供兩種 Executors,一種為 Pool-based executor,一種為 New-deployment executor,具體兩種型別分別有什麼作用和區別,下邊會講到。MINSCALE MAXSCALE MINCPU MAXCPU MINMEMORY MAXMEMORY TARGETCPU TARGETCPU 這些列分別顯示該 Function 分配的最小/最大 Scale、CPU、Memory 以及目標 CPU 值,這些下邊也會講到。而這些配置在建立時可以在命令列指定。

$ fission fn create --name hello --code hello.js --env nodejs --minscale 1 --maxscale 5 --mincpu 40 --maxcpu 80 --minmemory 64 --maxmemory 128 --executortype newdeploy

如果刪除該 Function,可以通過 fission fn delete --name <ENV_NAME> 來刪除。

5.3、測試呼叫 hello Function

這一步主要是為了測試呼叫部署的 Function,這裡有兩種方法呼叫上邊部署的 hello Function。

方式一:通過 fission function test --name <FUNCTION_NAME> 測試呼叫 Function。

$ fission function test --name hello
Hello world!

此時,我們檢視下 poolImgr 控制的 nodejs 環境池子,新增加了一個 Pod,而且呼叫完畢後,該 Pod 會預設被快取 5 分鐘,來提供後續請求直接呼叫,若一直未被呼叫,則 5 分鐘後將被 poolImgr 清理掉釋放資源。

$ kubectl get pods -n fission-function
NAME                                                              READY     STATUS    RESTARTS   AGE
nodejs-1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce-guhjfbvr-5c5655w9hd   2/2       Running   0          19h
nodejs-1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce-guhjfbvr-5c565hvxr9   2/2       Running   0          19h
nodejs-1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce-guhjfbvr-5c565jppb7   2/2       Running   0          2s
nodejs-1fdd8aa0-b4c9-11e8-bbbb-080027c7f5ce-guhjfbvr-5c565zwtvt   2/2       Running   0          19h

方式二:通過建立 Router 來對映 HTTP 請求到對應的 Function。

方式一直接使用 fission 提供的命令列來測試呼叫,非常方便,但是僅僅適用於測試階段,真正服務要被外部呼叫的話,我們更希望通過 HTTP 請求方式呼叫,當然 Fission 也提供了 Triggers 機制來完成,非常便捷。它預設提供了好幾種類型的 Trigger 來完成不同的功能,這裡我們可以使用 HTTP Trigger 來完成。

$ fission httptrigger create --url /hello --function hello
trigger '85b8bdec-a3a8-4502-8642-c7e1768c614b' created
$ fission ht list
NAME                                 METHOD HOST URL    INGRESS FUNCTION_NAME
85b8bdec-a3a8-4502-8642-c7e1768c614b GET         /hello false   hello

通過上述命令我們為 hello Function 建立一個 Http Trigger,建立時還可以指定其他引數如下:

  • –method 指定 Http 請求型別,支援 GET | POST | PUT | DELETE | HEAD (預設 GET)
  • –url 指定對映成的 URL 地址,外部呼叫時指定該 URL
  • –function 指定要對映的 Function 名稱,上邊示例是為 hello Function 做對映。
  • –host 指定帶主機名和域名的網路主機路由
  • –createingress 指定是否建立 Ingress,注意需要提前安裝好 Ingress 才可以使用,預設不建立。
  • –fnNamespace 指定 Function 對應執行的名稱空間,預設是 default
  • –spec 指定儲存到規範的目錄而不是在叢集中建立

接下來,就可以通過 HTTP Get 請求一下該地址,看下返回結果吧。

$ curl http://$FISSION_ROUTER/hello
Hello world!

注意:這裡的 FISSION_ROUTER 為 Router Server 地址,因為我們安裝時指定了 routerServiceType=NodePort,所以可以通過 <CLUSTER_IP>:<NODE_PORT> 方式訪問 Router URL(當然也可以配置成 Cluser_IP 方式,配合 Ingress 域名訪問即可),那麼 FISSION_ROUTER 獲取方式如下:

$ export FISSION_ROUTER_PORT=$(kubectl get svc -l "svc=router" -n fission -o jsonpath="{.items[0].spec.ports[0].nodePort}")
$ export MINIKUBE_IP=$(minikube ip)
$ export FISSION_ROUTER=http://$MINIKUBE_IP:$FISSION_ROUTER_PORT

那麼我本機訪問該 Router 地址為:http://192.168.99.100:31314/hello,瀏覽器訪問一下也是正常返回的。

fission-router

上邊提到 --createingress 引數,預設是不建立 Ingress,接下來演示一下自動建立 Ingress 看下吧。要演示該功能,前提是 Kubernetes 系統中已經部署好了 Ingress,這裡忽略 Ingress 部署,可以參考 這裡 文件建立。

$ kubectl get pod,service
NAME                                                      READY     STATUS    RESTARTS   AGE
my-nginx-nginx-ingress-controller-b5fdcdf96-lqzj6         1/1       Running   0          10d
my-nginx-nginx-ingress-default-backend-799d796cf7-lrg75   1/1       Running   0          10d

NAME                                     TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
kubernetes                               ClusterIP   10.96.0.1     <none>        443/TCP                      34d
my-nginx-nginx-ingress-controller        NodePort    10.97.97.7    <none>        80:32080/TCP,443:32443/TCP   10d
my-nginx-nginx-ingress-default-backend   ClusterIP   10.96.11.26   <none>        80/TCP                       10d

我本地之前已經部署過了,那麼直接建立 Http Router 即可。

$ fission httptrigger create --url /hellox --method GET --function hello --createingress --host fission.local.com
trigger '4613af28-e4f2-4aa0-9500-91ec9a4acab5' created
$ fission ht list
NAME                                 METHOD HOST              URL     INGRESS FUNCTION_NAME
4613af28-e4f2-4aa0-9500-91ec9a4acab5 GET    fission.local.com /hellox true    hello
85b8bdec-a3a8-4502-8642-c7e1768c614b GET                      /hello  false   hello

$ kubectl get ingress --all-namespaces
NAMESPACE   NAME                                   HOSTS                 ADDRESS           PORTS     AGE
fission     4613af28-e4f2-4aa0-9500-91ec9a4acab5   fission.local.com     192.168.99.100    80        9s

我們可以看到 Fission 自動建立的 Ingress,本地繫結一下 Host 即可體驗啦!是不是很方便。

6、Fission 元件介紹

6.1、Environments

Fission 一個重要元件就是 Environments,一個環境容器包含一種語言和特定 Function 程式碼執行時環境,本質上它是包含了 WebServer 和動態載入 Function 程式碼功能的容器。WebServer 用來對外提供 Server 服務,我們提供的 Function 程式碼不是一上來就載入到環境容器中,而是在呼叫時動態載入進去的,Fission 這一點做的非常好。還記得我們上一篇文章 學習 Kubernetes 原生 Serverless 無服務架構 Kubeless 中對 Kubeless 的分析,它是在建立時直接將程式碼掛載到容器裡面去,然後啟動一個 WebServer,通過類載入器載入對應方法呼叫返回。

Fission 跟 Kubeless 區別之一就在此,我覺得 Fission 處理方式更好一些,因為它將環境容器跟程式碼分離開,有需要時直接動態載入,其次,它的 poolImgr 機制,存在一定數量的環境容器池,當請求量增加時,避免了冷啟動帶來的時間延遲。

試想一下,當請求 Function 增多時,對於 Kubeless 來說,它勢必會啟動多個 Pod 執行來提供服務,但是因為它的執行機制,它需要重新建立一個或多個新的包含環境和程式碼的 Pod,至少需要好幾秒的時間來建立,更不用說下載映象耗時等等,那麼帶來的冷啟動延時是我們所不能接受的。而 Fission 執行機制為每個環境保持著一個執行容器池,當 Function 請求增多時,Fission 不需要部署一個新容器,只需要選擇一個已經執行的快取容器,將 Function 動態載入進去,然後將請求路由到該例項即可,整個過程耗時毫秒級別。同時它還能檢測到空閒例項,Kill 掉這些例項來釋放資源。

目前 Fission 官方已經預構建好的環境容器有:

Environment Image
CBinary (for executables or scripts) fission/binary-env
Go fission/go-env
.NET fission/dotnet-env
.NET 2.0 fission/dotnet20-env
NodeJS (Alpine) fission/node-env
NodeJS (Debian) fission/node-env-debian
Perl fission/perl-env
PHP 7 fission/php-env
Python 3 fission/python-env
Ruby fission/ruby-env

6.2、Controlling Function Execution

當我們建立 Function 時,可以為該 Function 指定一個執行型別,Fission 提供了兩種型別:Pool-based executorNew-deployment executor

  • Pool-based executor 也即是上邊說的 poolmgr,當我們在建立 ENV 時,它會建立一定數量的 ENV Pods 池子,這個池子中 Pod 數量可以根據使用者的需求指定(預設為 3),每個 ENV 容器包含一個動態載入器來載入 Function 以及對應的語言可執行環境,一旦我們建立並呼叫了一個 Function,Fission 將會從 Env 池子中取出一個 Pod 並使用該 Pod 來動態載入並執行指定 Function,執行完畢,它會將該 Pod 快取一段時間,如果這段時間內,有請求過來,則 Router 會優先呼叫該 Pod 來執行,若快取時間內,沒有新的呼叫,那麼該 Pod 將會被清理掉釋放資源。Pool-based executor 對於低延時的 Function 比較合適,但是缺點就是不能根據訪問需求自動調整池子大小,需要我們是先評估大小。

  • New-deployment executor (Newdeploy) 型別,當我們指定該型別執行器時,它會為該 Function 執行建立 Deployment、Service、HorizontalPodAutoscaler 等資源,這樣就可以針對 Function Pods 自動縮放以及負載均衡 Pods 之間的請求。該型別針對沒有特殊低延時要求時,可以設定 minscale 為 0,這樣它只會在被首次呼叫時才回被建立,而且會自動清理掉空閒 Pod,可以確保按需進行資源消耗,非常適合非同步請求場景。對於對低延時要求比較高的請求,可以設定 minscale > 0,它會維持一定數量的執行中的 Pod,當呼叫 Function 時,沒有延時,因為已經存在直接呼叫即可,而且即使該 Function 未被呼叫時也不會被清理掉,當然當請求量激增時,它也會自動擴容來滿足需求。如何使用可以參考 Controlling Function Execution Autoscaling 示例演示。

6.3、Trigger

Fission 另一個元件為 Trigger,觸發器可以理解為呼叫函式的事件,Fission 目前提供了三種類型的觸發器:Http TriggerTime TriggerMQ Trigger

  • Http Trigger:HTTP 觸發器允許通過 HTTP 請求方式呼叫 Functions,支援 GET, POST, PUT, DELETE, HEAD 請求方式(預設 GET),同時它也支援自動建立 Ingress,上邊示例有演示到。
  • Time Trigger:時間觸發器允許週期性呼叫某一函式,它遵循我們熟知的 CRON 規範,並基於 CRON 排程方式來呼叫函式。該型別適用於執行排程任務,定期清理任務,定期輪訓呼叫等場景。
  • MQ Trigger:訊息佇列觸發器允許監聽某一個物件並呼叫每個訊息的函式,目前支援 NATS 流和 Azure 儲存佇列的訊息佇列。

參考資料