きっかけ
Rancher Meetup Tokyo #11( https://rancherjp.connpass.com/event/68806/ ) に参加した際、OpenFaaSというオープンソースなFaaS基盤が紹介されていた。
導入は簡単らしいので、試してみる。
参考資料
https://speakerdeck.com/player/a594805a003d40eeb50e7b37b9e80021#
https://www.slideshare.net/ukitiyan/openfaas-on-rancher-java
OpenFaaSって何?
分かりやすくいってしまえば、Amazon Lambda+API Gatewayと同じ機能を提供するオープンソースソフトウェア
※機能を模倣しているわけではないので、正確ではない
Docker SwarmおよびK8sをベースに動作する
各クラウド事業者が提供するマネージドサービスにロックインする事が無いため、マルチクラウド時代を見据えたFaaS基盤、という位置づけ(だと思う)
コンポーネント
関数事にDockerコンテナを作成、Docker SwarmないしK8sで管理できる。
API Gateway: 動作を受け付けるゲートウェイ
Function Watchdog: 各関数のコンテナの入出力を制御するデーモン
Prometheus: 各関数コンテナのメトリックを取得、可視化
TestDriveする
まずは一番楽な方法がいい、、ということでdocker playgroudで試す。
OpenFaaSスタックのインストール
下記を実行。楽ちん
# docker swarm init --advertise-addr eth0 && \
git clone https://github.com/openfaas/faas && \
cd faas && \
git checkout 0.6.7 && \
./deploy_stack.sh && \
docker service ls
CLIインストール
$ curl -sL cli.openfaas.com | sh
CLIのヘルプ
$ faas-cli --help
CLIでサンプル関数(マークダウンtoHTML)を実行:
$ echo "# Test Drive"| faas-cli invoke func_markdown
登録されている関数をリスト
$ faas-cli list
Pythonの関数をデプロイする
CLIでセットアップ
$ faas-cli new --lang python <関数名>
ソースコード作成
<関数名>/handler.py に実行する処理を記述
def handle(req):
print("Hello! You said: " + req)
<関数名>.ymlに実行環境を記述
provider:
name: faas
gateway: http://localhost:8080 # ゲートウェイのURL。必要であれば、リモートを指定すること。
functions: # この中に指定する実行環境を記述
hello-python:
lang: python # どの言語を使うか?
handler: ./hello-python # ハンドラ関数や他のコードのパスを指定
image: hello-python # Dockerイメージ名。もしDockerHubを利用する場合は、DockerHubアカウントを前につけること。
関数をビルド
faas-cli build -f ./hello-python.yml
イメージ一覧を表示
docker images | grep hello-python
マルチノードクラスタの場合、
イメージをリモートのレジストリへpushする
Docker Hubを使う場合は、image: でDocker Hubアカウント名をつけておき、下記を実行
$ faas-cli push -f ./hello-python.yml
※ --parallelを指定すると、複数関数をプッシュする時、早くなる(らしい)
デプロイ
faas-cli deploy -f ./hello-python.yml
関数一覧を確認
faas-cli list
curlで試す
curl localhost:8080/function/hello-python -d "it's Alex here"
CLIで試す
echo "Hello!" | faas-cli invoke hello-python
標準以外のライブラリを読み込みたい場合
<関数名>/requirements.txt に記述
handler.pyでimport
ビルド、デプロイ
ロギング、トラブルシューティング
デプロイされているかどうか?
$ docker service ls
関数のコンテナについて確認
docker service ps
関数のコンテナのログを確認
docker service logs
※ ログが多い場合、--tail オプションをつけて確認。-fをつければ、標準出力へ流しっぱなしにできる
メトリック
Prometheusのコンテナが組み込まれているので、そこで確認可能。
トラブルシューティング
「Can't reach service」のようなエラーが出る場合、下記を確認
- マルチノードクラスタであれば、デプロイ前に、Docker Hubなどのレジストリへpushすること
- docker service logs --no-trunc=true でより詳細なログを見てみる
- 再デプロイしてみる。
気になる
現状、どの言語が使える?
$ fass-cli new --list
で確認可能
- Node.js
- Python(Python 2)
- Python 3
- Ruby
- C#
- Go
- Dockerfile
Goでのデプロイ例
https://blog.alexellis.io/serverless-golang-with-openfaas/
OpenFaaSはWindows系OSでも動く?
明確な記述は見つけられなかったが、インストール方法などが公表されていないため、恐らく現時点(2017/11/19)では不可。
Docker Swarmとk8sの違い
対象システム
Docker Swarm:
小規模向け(IoTデバイス上でも動く)
K8s:
大規模向け
クラスタリング
Docker Swarm:
構成は独自形式で記述
Serviceという単位でクラスタリング、一つ一つのコンテナはtask
K8s:
構成はYAML形式で記述
deploymentという単位でクラスタリング
Podという単位で複数コンテナをグルーピング(同じディスクボリュームを共有する)
CLI
Docker Swarm:
DockerのCLIに組み込まれてる
docker swarm COMMAND
docker service COMMAND
直接マスターのコンテナを操作する形
K8s:
kubectlを使用(DebianベースのOSで利用可能
kubectlはクラスタ、Deployment管理のみ行う。
クラスタ作成はサードパーティ製ツールを使う。kops,GKE,kubeadmなど
ホスト間ネットワーク
Docker Swarm:
オーバーレイネットワークがデフォルトで使用される。
更に、macvlanによる設定や、他のベンダが出しているドライバも利用可
https://docs.docker.com/engine/swarm/networking/#create-an-overlay-network
K8s:
デフォルトでは組み込まれていないため、サードパーティ製のものを使う。
CoreOS Flannelなど
API/Integration
Docker Swarm:
mobyプロジェクトの中で作成されている
K8s:
プロジェクト公式のGo製クライアントがGithu上にある。
スケール
Docker Swarm:
明確な上限は公表されていない。
2000~以上のノードで動いた実例あり。
現在、3000~以上のノードで動かすプロジェクトが動いており、すでに目標数は突破済み
https://github.com/swarmzilla/swarm3k
K8s:
公式な値で5000クラスタノードまで(v1.8の場合)とされる。
https://kubernetes.io/docs/admin/cluster-large/