学习基于 Kubernetes 的 Serverless 无服务架构 Fission

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aixiaoyang168/article/details/82684204

目录

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 存储队列的消息队列。

参考资料

猜你喜欢

转载自blog.csdn.net/aixiaoyang168/article/details/82684204