<commit_before>---
layout: post
title: Fission（FaaS）介绍
description: 来自Planform9的开源项目
category: blog
---

声明：  
本博客欢迎转发，但请保留原作者信息!  
新浪微博：[@孔令贤HW](http://weibo.com/lingxiankong)；   
博客地址：<http://lingxiankong.github.io/>  
内容系本人学习、研究和总结，如有雷同，实属荣幸！

> 这篇博客需要你懂Kubernetes和Docker

之前就一直关注FaaS，简单分析过[AWS Lambda][]和其他几个FaaS项目。我最初关注FaaS是因为我想在Mistral（OpenStack项目）中引入执行自定义代码的能力，来增强Mistral的可用性。AWS Lambda是Amazon在2016年对外发布的项目，发布之后就一直是serverless领域的标杆，后来的的FaaS项目基本都是参照AWS Lambda设计和实现。

恰逢我在学习Golang语言，就一点一点的把[iron-functions][]的代码啃完了，发现iron.io对于开源FaaS还是不太有诚意，至少从他开源的这部分代码看，跟他们的商业软件还是差的很远，他们开源也许仅仅是为了吸引更多的注意力而已，毕竟他们仅靠FaaS活着。时间进入2017年，Planform9也对外开源了一个项目：[fission][]，是基于Kubernetes平台实现的FaaS。又恰逢我在阅读Kubernetes的文档，而且fission也是Go语言实现，所以我就又读了一下它的源代码。作为一个新项目，fission的实现还是比较简单，但代码看着却比[iron-functions][]清爽许多。所以还是秉承做笔记的态度，介绍一下fission的架构和实现。

目前只能从fission的代码库中找到一点相关的文档，我也是读完代码才做出如下总结。

## Fission Services

fission基于Kubernetes平台，它的安装很简单，就是使用kubectl命令创建一系列fission管理资源，所有的资源都创建在名为`fission`的namespace中（而通过fission创建的资源都在`fission-function`命名空间中）。其中包含4个service：

- etcd

- controller，是fission对外提供管理API的组件。除了用户创建function时需要存储代码文件之外，其他的操作都只在etcd中存储数据结构。

- router，fission通过router这一个独立的service来实现真正FaaS，router实现了根据用户的http请求运行code的能力。
  router会与controller和poolmgr打交道。router定期从controller获取最新的triggers和functions列表，动态的更新web service的route定义。router内部以缓存的形式维护了一个从function到一个url的映射，这样对于调用过的function，router会很快的拿到返回值。

- poolmgr，维护environment与Kubernetes中deployment的映射关系。poolmgr与controller和kubernetes打交道，同时对外（主要是对router）提供API。

  对于用户创建的environment，poolmgr中有循环的线程自动在kubernetes中根据env的镜像创建包含三副本pod的deployment，每个pod中有两个container，一个使用env的镜像创建，另一个是fission中的辅助container，镜像是fission/fetcher。两个container共享一个volume。因为env是定义基础镜像，而一个env可能会关联许多function，所以需要fetcher根据具体的function在通用的container里运行不同的code。

  poolmgr会维护几个映射缓存：function到service，function到environment，environment到pool(也就是deployment)。

  poolmgr还会定期清理“不活跃”的deployment，比如env被删了。还会定期删除不活跃的pod，让kubernetes自动创建新的、干净的pod供其他function使用。

  poolmgr提供的API只有两个，一个是根据function获取对应的service url，另一个是类似心跳API帮助维护缓存。因为router里也维护有function到service url的缓存，所以当function被调用时，router会通知poolmgr更新一下对应service对象的时间，避免被误删。

所以，在fission中，不同的function可能对应同一个environment，这个environment对应kubernetes中的一个deployment，deployment中有一些pod，每一个pod会服务于某一个function。为了快速响应，一个function被调用后，pod并不会立即被清理。如果某个function长时间没有被调用，它对应的pod就会被自动清理掉。

通过命令查看安装完后fission命名空间的服务：

    $ kubectl --namespace fission get services
    NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    controller   10.0.0.99    <nodes>       80:31313/TCP   11d
    etcd         10.0.0.229   <none>        2379/TCP       11d
    poolmgr      10.0.0.83    <none>        80/TCP         11d
    router       10.0.0.63    <nodes>       80:31314/TCP   11d
    $ kubectl --namespace fission get deployments
    NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    controller    1         1         1            1           11d
    etcd          1         1         1            1           11d
    kubewatcher   1         1         1            1           11d
    poolmgr       1         1         1            1           11d
    router        1         1         1            1           11d
<commit_msg>Test code highlight<commit_after>---
layout: post
title: Fission（FaaS）介绍
description: 来自Planform9的开源项目
category: blog
---

声明：  
本博客欢迎转发，但请保留原作者信息!  
新浪微博：[@孔令贤HW](http://weibo.com/lingxiankong)；   
博客地址：<http://lingxiankong.github.io/>  
内容系本人学习、研究和总结，如有雷同，实属荣幸！

> 这篇博客需要你懂Kubernetes和Docker

之前就一直关注FaaS，简单分析过[AWS Lambda][]和其他几个FaaS项目。我最初关注FaaS是因为我想在Mistral（OpenStack项目）中引入执行自定义代码的能力，来增强Mistral的可用性。AWS Lambda是Amazon在2016年对外发布的项目，发布之后就一直是serverless领域的标杆，后来的的FaaS项目基本都是参照AWS Lambda设计和实现。

恰逢我在学习Golang语言，就一点一点的把[iron-functions][]的代码啃完了，发现iron.io对于开源FaaS还是不太有诚意，至少从他开源的这部分代码看，跟他们的商业软件还是差的很远，他们开源也许仅仅是为了吸引更多的注意力而已，毕竟他们仅靠FaaS活着。时间进入2017年，Planform9也对外开源了一个项目：[fission][]，是基于Kubernetes平台实现的FaaS。又恰逢我在阅读Kubernetes的文档，而且fission也是Go语言实现，所以我就又读了一下它的源代码。作为一个新项目，fission的实现还是比较简单，但代码看着却比[iron-functions][]清爽许多。所以还是秉承做笔记的态度，介绍一下fission的架构和实现。

目前只能从fission的代码库中找到一点相关的文档，我也是读完代码才做出如下总结。

## Fission Services

fission基于Kubernetes平台，它的安装很简单，就是使用kubectl命令创建一系列fission管理资源，所有的资源都创建在名为`fission`的namespace中（而通过fission创建的资源都在`fission-function`命名空间中）。其中包含4个service：

- etcd

- controller，是fission对外提供管理API的组件。除了用户创建function时需要存储代码文件之外，其他的操作都只在etcd中存储数据结构。

- router，fission通过router这一个独立的service来实现真正FaaS，router实现了根据用户的http请求运行code的能力。
  router会与controller和poolmgr打交道。router定期从controller获取最新的triggers和functions列表，动态的更新web service的route定义。router内部以缓存的形式维护了一个从function到一个url的映射，这样对于调用过的function，router会很快的拿到返回值。

- poolmgr，维护environment与Kubernetes中deployment的映射关系。poolmgr与controller和kubernetes打交道，同时对外（主要是对router）提供API。

  对于用户创建的environment，poolmgr中有循环的线程自动在kubernetes中根据env的镜像创建包含三副本pod的deployment，每个pod中有两个container，一个使用env的镜像创建，另一个是fission中的辅助container，镜像是fission/fetcher。两个container共享一个volume。因为env是定义基础镜像，而一个env可能会关联许多function，所以需要fetcher根据具体的function在通用的container里运行不同的code。

  poolmgr会维护几个映射缓存：function到service，function到environment，environment到pool(也就是deployment)。

  poolmgr还会定期清理“不活跃”的deployment，比如env被删了。还会定期删除不活跃的pod，让kubernetes自动创建新的、干净的pod供其他function使用。

  poolmgr提供的API只有两个，一个是根据function获取对应的service url，另一个是类似心跳API帮助维护缓存。因为router里也维护有function到service url的缓存，所以当function被调用时，router会通知poolmgr更新一下对应service对象的时间，避免被误删。

所以，在fission中，不同的function可能对应同一个environment，这个environment对应kubernetes中的一个deployment，deployment中有一些pod，每一个pod会服务于某一个function。为了快速响应，一个function被调用后，pod并不会立即被清理。如果某个function长时间没有被调用，它对应的pod就会被自动清理掉。

通过命令查看安装完后fission命名空间的服务：

```shell
$ kubectl --namespace fission get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
controller   10.0.0.99    <nodes>       80:31313/TCP   11d
etcd         10.0.0.229   <none>        2379/TCP       11d
poolmgr      10.0.0.83    <none>        80/TCP         11d
router       10.0.0.63    <nodes>       80:31314/TCP   11d
$ kubectl --namespace fission get deployments
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
controller    1         1         1            1           11d
etcd          1         1         1            1           11d
kubewatcher   1         1         1            1           11d
poolmgr       1         1         1            1           11d
router        1         1         1            1           11d
```

{'fraction_non_alphanumeric': 0.06846904495280755, 'fraction_numerical': 0.03007518796992481, 'mean_word_length': 4.627362736273628, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 8, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 20, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7644210', 'n_tokens_mistral': 3431, 'n_tokens_neox': 3747, 'n_words': 221}