チェシャ猫の消滅定理

数学にプログラミング、素敵なもの何もかも。

Serverless Meetup Tokyo #6 で Kubernetes について話してきました

先日行われた Serverless Meetup Tokyo #6 で、Kubernetes 上で動作する Serverless フレームワーク Fission について発表してきました。

www.slideshare.net

先週も 似たようなブログ を書いたような気がしなくもないですが、KubelessFission を比較した前回の発表に対し、今回は話題を Fission に限定しています。一方で追加要素として、複数の Function を組み合わせるためのアドオン Fission Workflows を紹介してみました。

コンテナの再利用

スライド中でも言及している通り、一度「特殊化」されたコンテナは一定時間そのまま起動しており、再度同じ Function が呼び出された際に再利用されます。すなわち Function がコンテナ内部の環境に対して副作用を持つ場合、良くも悪くも次の呼び出しに影響するはずです。これを実際に確認してみましょう。

以下ではすでに 公式手順 に従って Fission が Kubernetes クラスタ上にデプロイされ、手元で fission コマンドが使用可能になっているとします。

Environment の作成

スライド中で挙げられていたコマンド例は Python でしたが、単純にするためにここではシェルスクリプトを使います。

$ fission env create --name binary --image fission/binary-env:0.3.0
Use default environment v1 API interface
environment 'binary' created

$ fission env list
NAME   UID                                  IMAGE
binary 00386979-b3c2-11e7-b4db-fa163ed87208 fission/binary-env:0.3.0

Function と Route の作成

コンテナが再利用されていることを確かめるために、コンテナ内の状態を変化させるような恣意的な Function を作成します。

以下のコードを counter.sh として保存します。なお公式で用意されている実行環境 fission/binary-env では Bash は使用できず、shebang に sh を指定する必要があるので地味に気をつけましょう。

#!/bin/sh

date >> /tmp/counter.txt
cat /tmp/counter.txt | wc -l

これで呼び出しごとにコンテナ内のファイルに追記が行われるはずです。このソースコードを指定して Function を作成します。

$ fission function create --name counter --env binary --code counter.sh
function 'counter' created

$ fission function list
NAME    UID                                  ENV
counter 217af646-b3c2-11e7-b4db-fa163ed87208 binary

さらに、この Function を呼び出すためのトリガーを作成します。

$ fission route create --method PATCH --url /counter --function counter
trigger '70a978a9-8cf9-42c3-a018-be0234785bc8' created

$ fission route list
NAME                                 METHOD URL      FUNCTION_NAME
70a978a9-8cf9-42c3-a018-be0234785bc8 PATCH  /counter counter

これでエンドポイントが定義されました。fission route create --help で出てくるオプション --method の候補に PATCH は入っていませんが、今回の例では期待した通りに動作します。

Function の実行

さて、この Function を実行してみると、

$ curl -X PATCH http://$FISSION_ROUTER/counter
1
$ curl -X PATCH http://$FISSION_ROUTER/counter
2
$ curl -X PATCH http://$FISSION_ROUTER/counter
3
$ curl -X PATCH http://$FISSION_ROUTER/counter
4

となり、実際に以前の実行の影響が残っていることがわかります。ちなみに 3 分ほど放置すると特殊化されたコンテナが消えるため、カウンタの値はリセットされます。

Kubernetes 側から直接確認してみましょう。プールされている 3 個 + 特殊化された 1 個で計 4 個の Pod があることが分かります。

kubectl -n fission-function get pods
NAME                                                              READY     STATUS    RESTARTS   AGE
binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-189128r9t8   2/2       Running   0          6m
binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-18912fhfp0   2/2       Running   0          2m
binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-18912fpjtc   2/2       Running   0          8m
binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-18912r3qwl   2/2       Running   0          8m

ひとつだけ AGE が若い Pod は、特殊化されて Deployment の管理下から抜けた Pod の穴を埋めるために新しく立ち上がったものです。今回の場合、Function counter 用に特殊化された Pod は 4 番目に表示されているもので、kubectl describe コマンドで確認するとラベルがひとつだけ付け替えられています。

$ kubectl -n fission-function describe pods/binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-18912r3qwl
Name:       binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-18912r3qwl
Namespace:  fission-function
Node:       calico-1/192.168.235.231
Start Time: Wed, 18 Oct 2017 05:05:48 +0000
Labels:     functionName=counter
        functionUid=217af646-b3c2-11e7-b4db-fa163ed87208
        poolmgrInstanceId=T2bveCV8
        unmanaged=true
...

実際にコンテナの中を覗くと、これまでの Function の呼び出しによって生成されたファイルが残っているはずです。

$ kubectl -n fission-function exec binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-18912r3qwl cat /tmp/counter.txt
Defaulting container name to binary.
Use 'kubectl describe pod/binary-00386979-b3c2-11e7-b4db-fa163ed87208-glxmo1iv-18912r3qwl' to see all of the containers in this pod.
Wed Oct 18 05:12:20 UTC 2017
Wed Oct 18 05:12:38 UTC 2017
Wed Oct 18 05:12:39 UTC 2017
Wed Oct 18 05:12:40 UTC 2017

まとめ

Kubernetes 上の Serverless フレームワーク Fission について、間をおかず同じ Function が呼ばれた場合にコンテナの再利用が行われることを簡単な実験で確認しました。

なお発表中ではスライド 1 枚で済ませてしまいましたが、複数の Function でピタゴラスイッチできる Fission Workflows はなかなか面白い仕組みです。いずれちょっとしたサンプルを公開したいと思っていますが、それはまた別の話。