Serverless之Fission

2020-12-23 13:34:33

背景

当前网上关于Fission的介绍和其他serverless产品比起来要少很多,中文资料就更少了,网上的活跃程度也感觉明显不够,这里我也当做是做了一个简单的总结笔记吧。

摘要

Fission 是由私有云服务提供商领导开源的 serverless 产品,它借助 kubernetes 灵活强大的编排能力完成容器的管理调度工作,而将重心投入到 FaaS 功能的开发上,其发展目标是成为 AWS lambda 的开源替代品。Fission 非常有趣,因为它介于 Kubeless 和 OpenWhisk 中间。它很大程度上了依赖了 Kubernetes 的很多特性,但又没有完全集成。这种方法的好处是它可以利用 Kubernetes 的长处(比如自动弹性伸缩),但在需要做一些其他不同的事情的时候可以获得更好的性能。例如,它有一个相当复杂的冷启动池机制。
Fission 由 Platform9 支持,可以通过 Helm 来安装。使用了 Influxdb 来处理状态,以及提供了 FluentD 来收集日志,以便开箱即用。消息机制使用的是 Nats,缓存使用的是 Redis。如你所见,其他框架都没有提供开箱即用的缓存和日志功能,虽然手动添加这些功能也非常简单。

特性

当前Fission的最新版本是v1.11.2,官方宣传的相比其他产品最大特性为:100msec cold start:就是首次仅仅只需要100msec的启动时间,当然,这个时间只是实验室时间,就像车子的工信部油耗一样,和你写的函数复杂程度也是有一定关系的。

概念

Fission 主要有三个概念:

  • Functions
  • Environments
  • Triggers
    它们三者个关系见下图:
    f_e_t_relation

Functions

这个其实就是我们Faas里面的最小执行单元,函数体,可以支持多种不同的开发语言。

Triggers

Function如果要被访问到,就需要Trigger的触发机制,Triggers的机制有:

  • HTTP Triggers 基于HTTP的Path路由触发
  • Timer Triggers 基于时间触发
  • Message Queue Triggers 消息队列触发
  • Kubernetes Watch Triggers 事件监听触发

使用

具体的安装步骤我们可以直接参考官网的说明
安装好后一个简单的例子:

$ fission env create --name nodejs --image fission/node-env:latest

$ curl -LO https://raw.githubusercontent.com/fission/fission/master/examples/nodejs/hello.js

$ fission function create --name hello --env nodejs --code hello.js

$ fission function test --name hello
Hello, world!

上面的几个步骤包含了创建env、创建fun以及fun的测试。我们正常的流程也应该是:

  1. environment 创建运行环境,其实就是docker里面的image镜像,指定一个运行镜像;
  2. package 函数代码包,这个可以为一个zip类型的代码包;
  3. function 入口函数,指明函数运行的入口。
    在创建env环境时,我们可以指定基础镜像资源的基本信息,比如:
$ fission env create --name node \
                     --image fission/node-env \
                     --mincpu 40 --maxcpu 80 \
                     --minmemory 64 --maxmemory 128 \
                     --poolsize 4

而传感fun时是在env的基础上进行的,所以通过CLI创建时,需要指定env:

$ fission function create --name hello --env nodejs --code hello.js

在这个命令里面主要有两个操作,一个是创建pkg,另外一个则是创建fun。如果上面的步骤执行完了则可以进行fission function test操作,但是按照最上面说的,我们要想被外部访问的话还需要创建trigger触发事件:

$ fission route create --function hello --url /hello

trigger '5327e9a7-6d87-4533-a4fb-c67f55b1e492' created

$ curl http://${FISSION_ROUTER}/hello

Hello, world!

更多命令可以直接调用fission 查看。当然,一个完整平台仅仅通过CLI来访问明显是不够的,

API

如果我们想自己封装一个平台的话怎么办呢?没问题,Fission也提供有对应的API,自己封装调用一下就OK了。

  • /v2/apidocs.json: The OpenAPI 2.0 (Swagger) doc of all CRUD APIs for Fission CRDs.
  • /proxy/*: The proxy APIs to internal services.
  • /v2//*: The CRUD APIs for Fission CRDs.
  • /healthz: The health check endpoint.

小结

上面的介绍其实对Fission来说说的很浅,具体更详细的还需要各位自己去看看官网的说明。Fission这个框架其实挺优秀的,但其中也有很多不足的地方,比如SDK是自己的,不像其它开源产品都是利用serverless framework统一框架来处理。社区活跃度也不够,导致产品不能很好的推广出去。

记踩Etcd的一个坑

背景 最近一个服务引入了etcd,用于主从,编译能够正常通过,但是在run阶段出现如下panic: 2020-12-14 13:36:42.799342 I | WARNING: proto: message authpb.User is already registered A future release will panic on registration conflicts. See: https://developers.google.com/protocol-buffers/docs/reference/go/faq#namespace-conflict 2020-12-14 13:36:42.799365 I | WARNING: proto: message authpb.Permission is