先日行われた Serverless Meetup Tokyo #6 で、Kubernetes 上で動作する Serverless フレームワーク Fission について発表してきました。
www.slideshare.net
先週も 似たようなブログ を書いたような気がしなくもないですが、Kubeless と Fission を比較した前回の発表に対し、今回は話題を 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 はなかなか面白い仕組みです。いずれちょっとしたサンプルを公開したいと思っていますが、それはまた別の話。