Fission（Serverless Functions for Kubernetes）を触ってみる

こちらの記事を書きましたが、似たようなFissionというOSSがあるので触ってみます

https://qiita.com/ryutoyasugi/items/49fee8a90c5a2965a776

## Fissionとは
Kubelessと同様にKubernetes上でサーバーレスが構築できるフレームワーク
比較すると、サポート言語は大体同じで、トリガーはFissionの方が多いようです

https://fission.io/

> Fission is a framework for serverless functions on Kubernetes.

https://docs.fission.io/docs/

> Performance: 100msec cold start

https://docs.fission.io/docs/languages/

https://docs.fission.io/docs/triggers/

ざっくりの紹介ですが、早速試していきます

## 環境
macOS Big Sur 11.4

## Fissionの環境構築
ここに沿ってやっていきます
https://docs.fission.io/docs/installation/

Kubelessの時と同様にminikubeを使用します

```sh
$ kubectl config current-context
minikube
```

Helmを使って構築するためインストールしておく（Helmを使わない方法もある）

```sh
$ brew install helm
```

ではFissionを入れます

```sh
$ export FISSION_NAMESPACE="fission"
$ kubectl create namespace $FISSION_NAMESPACE
$ helm install --namespace $FISSION_NAMESPACE --name-template fission \
    https://github.com/fission/fission/releases/download/1.12.0/fission-all-1.12.0.tgz
```

たくさんリソースが作成されてます

```sh
$ kubectl get ns | grep fission
fission                Active   24m
fission-builder        Active   23m
fission-function       Active   23m

$ kubectl get all -n fission
NAME                                                        READY   STATUS    RESTARTS   AGE
pod/buildermgr-6848c94888-dj6s9                             1/1     Running   0          26m
pod/controller-56575d8fc5-jph4b                             1/1     Running   0          26m
pod/executor-57655f44df-2dm8g                               1/1     Running   0          26m
...
```

## CLIのインストール

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

## アプリケーションのデプロイと実行
Environmentの作成

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

$ fission environment list
NAME   IMAGE                   BUILDER_IMAGE POOLSIZE MINCPU MAXCPU MINMEMORY MAXMEMORY EXTNET GRACETIME
nodejs fission/node-env:latest               3        0      0      0         0         false  0

# poolされたコンテナが作成される
$ kubectl get po -n fission-function
NAME                                            READY   STATUS        RESTARTS   AGE
poolmgr-nodejs-default-26746-7d4f448fc9-9wl5k   2/2     Running       0          36s
poolmgr-nodejs-default-26746-7d4f448fc9-dbb6x   2/2     Running       0          36s
poolmgr-nodejs-default-26746-7d4f448fc9-vssm9   2/2     Running       0          36s
```

Functionの作成

```sh
$ curl -LO https://raw.githubusercontent.com/fission/examples/master/nodejs/hello.js
$ fission function create --name hello --env nodejs --code hello.js

$ fission function get --name=hello
module.exports = async function(context) {
    return {
        status: 200,
        body: "hello, world!\n"
    };
}

# packagesというカスタムリソースがあり、そこにデプロイしたコードがbase64エンコードされて入ってる
$ kubectl describe packages.fission.io hello-24160fbf-cd38-4b17-b0e2-ae967aa66450 | grep Literal
    Literal:  Cm1vZHVsZS5leHBvcnRzID0gYXN5bmMgZnVuY3Rpb24oY29udGV4dCkgewogICAgcmV0dXJuIHsKICAgICAgICBzdGF0dXM6IDIwMCwKICAgICAgICBib2R5OiAiaGVsbG8sIHdvcmxkIVxuIgogICAgfTsKfQo=
```

実行

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

ログ

```sh
$ fission fn logs --name hello

# Podのログも直接みれる
$ stern -n fission-function poolmgr-nodejs-default
```

## 感想
Kubelessと同様に簡単に試せた
ドキュメントを見た感じだとFissionの方が機能が豊富で、Kubelessの方が軽量なフレームワークの印象
また、Kubelessはfunctionに対してPodが立ち上がるのに対して、Fissionはpoolしたコンテナでfunctionを実行するというアーキテクチャの違いもあった

Triggerなども後々試していきたい