機能としてのサービスまたはOpenFaaS-コンテナ上にサーバーレス機能を作成するためのフレームワーク。 Docker SwarmでAlexaスキルまたはAWS Lambda関数を実行できるかどうかを理解したい昨年の10月に、概念実証としてプロジェクトを開始しました。 最初の成功により、その年の12月にGitHubでGolang コードの最初のバージョンを公開することになりました。
この投稿では、サーバーレスコンピューティングの簡単な紹介と、過去500件のコミットでFaaSに登場した3つの主な機能について説明します。
最初のコミット以来、FaaSは人気を博しました:GitHubで4,000以上の星を獲得しました(現在7,000以上- 約Transl ) 。 。 私にとって重要なイベントは、4月にオースティンのDockerconで開催されたMoby Cool Hacksのメインセッションに参加することでした。 これらのパフォーマンスが直面する課題は、Dockerが作成された目的の境界を広げるようなものでした 。
サーバーレスとは何ですか?
アーキテクチャは進化しています
サーバーレスは悪い名前です。 イベント駆動型システムの新しいアーキテクチャパターンについて話している。 サーバーレス機能は、多くの場合、他のサービス間のブリッジとして、またはイベント駆動型アーキテクチャで使用されます。 以前はサービスバスと呼んでいました。
サーバーレスは進化
サーバーレス機能
サーバーレス関数とは、小さく、独立した、再利用可能なコードです。
- 長生きしない
- デーモンではない(長時間実行される)、
- TCPサービスを開始しません。
- ステートフルではない、
- 既存のサービスまたはサードパーティのリソースを使用し、
- 数秒で実行されます(AWS Lambdaのデフォルト)。
IaaSプロバイダーのサーバーレス製品とオープンソースソフトウェアプロジェクトを区別することも重要です。
一方では、Lambda、Google Cloud Functions、Azure機能などのIaaSプロバイダーからのサーバーレス実装があり、他方では、Docker SwarmやKubernetesなどのオーケストレーションプラットフォームでのハードワークを可能にするOpenFaaSなどのフレームワークがあります。
クラウドネイティブ:お気に入りのクラスターを使用します。
IaaSベンダーのサーバーレス製品は完全に管理されているため、高レベルの使いやすさと支払いを数秒/分で提供します。 逆に言えば、リリースとサポートのサイクルに非常に執着しています。 多様性と選択肢を提供するオープンソースFaaSが存在します。
OpenFaaSの特徴は何ですか?
OpenFaaSは、クラウドネイティブ世界の業界標準であるテクノロジーに基づいて構築されています。
OpenFaaSスタック
OpenFaaSプロジェクトの特徴は、ウォッチドッグコンポーネントとDockerコンテナーを使用して、各プロセスがサーバーレス機能になることです。 これは3つのことを意味します。
- 任意のプログラミング言語でコードを実行できます。
- 必要に応じていつでも;
- どこでも。
サーバーレスに切り替えても、コードを別のプログラミング言語に書き換える必要があることを意味するものではありません。 あなたのビジネスとチームが必要とするものを利用してください。
例:
cat
または
sha512sum
は、stdin / stdoutを介して相互作用するため、変更を必要としない関数である場合があります。 Windowsの機能はDocker CEでもサポートされています。
これは、FaaSと、サポートされている各言語の特別なランタイムに依存する他のオープンソースサーバーレスフレームワークの主な違いです。
DockerCon (2017年4月から8月- およそTransl。 )以降に登場した3つの最も重要な機能を見てみましょう:関数、Kubernetesサポート、非同期処理のCLIとテンプレート。
1.新しいCLI
簡単な展開
コンソールインターフェイス(CLI)がFaaSプロジェクトに追加され、展開機能が簡素化され、スクリプトサポートが追加されました。 これまでのところ、これらの目的のために、Gatewayまたはcurl APIのユーザーインターフェイス(UI)を使用できました。 表示されたCLIを使用すると、YAMLファイルで関数を定義し、それらを同じGateway APIにデプロイできます。
Finnian Andersonは、 Practical Dev / dev.toで FaaS CLIの素晴らしい紹介を書きました。
ユーティリティスクリプトと醸造
CLIをインストールするための特別なスクリプトがあり、John McCabeはbrewのレシピを支援しました。
$ brew install faas-cli
または:
$ curl -sL https://cli.get-faas.com/ | sudo sh
パターン
CLIでテンプレートを使用すると、お好みのプログラミング言語でハンドラーを作成するだけで十分です。その後、CLIはテンプレートを使用して、FaaSのすべての魔法を備えたDockerコンテナーにこのハンドラーを構築します。
PythonとNode.js用の2つのテンプレートが用意されていますが、独自のテンプレートを簡単に作成できます。
CLIは3つのアクションをサポートします。
-
-action build
テンプレートからDockerイメージをローカルで作成します。 -
-action push
push-選択したレジストリまたはハブに画像をアップロード(プッシュ)します。 -
-action deploy
-FaaS機能を-action deploy
ます。
1つのノードのクラスターがある場合、イメージを展開する前にプッシュする必要はありません。
YAML形式のサンプルCLI設定ファイル(
sample.yml
)は次のとおりです。
provider: name: faas gateway: http://localhost:8080 functions: url_ping: lang: python handler: ./sample/url_ping image: alexellis2/faas-urlping
Pythonの関数の最小(空)ハンドラーは次のとおりです。
def handle(req): print(req)
HTTP
./sample/url_ping/handler.py
URL(
./sample/url_ping/handler.py
)のステータスコードを確認する例:
import requests def print_url(url): try: r = requests.get(url,timeout = 1) print(url +" => " + str(r.status_code)) except: print("Timed out trying to reach URL.") def handle(req): print_url(req)
追加のPIPモジュールが必要な場合は、
requirements.txt
ファイルをハンドラー(
handler.py
)に追加し
requirements.txt
。
$ faas-cli -action build -f ./sample.yml
このようなコマンドの後、
alexellis2/faas-urlping
というDockerイメージ
alexellis2/faas-urlping
。これは、
-action push
を使用してDocker Hubにロードし、
-action deploy
ます。
FaaSのCLIは、 このリポジトリで利用できます 。
2. Kubernetesのサポート
Dockerのキャプテンとして、主にDocker Swarmとそれに関する記事を研究していますが、Kubernetesには常に興味があります。 LinuxとMacでKubernetesをセットアップする方法を学び始めて、これについてすでに3つのガイドを書いており、コミュニティで好評を博しました。
Kubernetesのエンジニアリングサポート
Docker Swarmの概念をKubernetesに移植する方法を十分に理解したので、プロトタイプを準備し、数日ですべてのコードを移植しました。 FaaSメインコードベースに追加の依存関係を追加する代わりに、Kubernetesと対話する新しいマイクロサービスデーモンを作成することを選択しました。
FaaSプロキシは、Deploy / List / Delete / Invoke and Scaleなどの操作のために、標準のRESTfulインターフェイスを介して新しいデーモンを呼び出します。
このアプローチは、ユーザーインターフェイス、CLI、および自動スケーリングが、変更を加えることなくそのまま使用できることを意味します。 結果のマイクロサービスは、 FaaS-netesと呼ばれる新しいGitHubリポジトリでサポートされ、Docker Hubで利用できます。 クラスターでのセットアップには約60秒かかります。
Kubernetesサポートデモ
このビデオでは、 FaaSが空のクラスターに展開された後、ユーザーインターフェイス、Prometheus、および自動スケーリングの操作方法を示しています。
しかし、待ってください... Kubernetesで動作する他のフレームワークはありますか?
Kubernetesのサーバーレスフレームワークには、おそらく2つのカテゴリがあります。サポートされるプログラミング言語ごとに非常に特定のランタイムに依存するものと、FaaSのように任意のコンテナーを機能にできるものです。
FaaSには、Docker SwarmおよびKubernetesのネイティブAPIのバインディングがあります。つまり、既に使用したオブジェクトを使用してDeployments and Servicesを管理します 。 これは、新しいアプリケーションの作成に関して、デコードが必要な魔法とコードが少ないことを意味します。
フレームワークを選択するときは、プロジェクトに新しい機能や修正を追加するかどうかを検討してください。 たとえば、OpenWhiskはScalaで記述されており、他のほとんどはGolangで記述されています。
3.非同期処理
サーバーレス機能の機能の1つは、小さくて高速で、同期して通常数秒で実行されることです。 しかし、非同期に機能させたい理由はいくつかあります。
- これはイベントであり、呼び出し元は結果を必要としません。
- 実行または初期化に時間がかかる-たとえば、TensorFlow / Machine Learning。
- バッチジョブの一部として多数の要求が受け入れられます。
- あなたは速度を制限したい。
非同期処理のプロトタイプは、分散キューから始まりました。 実装はNATSストリーミングを使用しますが、Kafkaまたはキューのように見えるその他の抽象化で動作するように拡張できます。
FaaSの非同期モードのTwitterアナウンスからの図
バックエンドとしてNATSストリーミングを使用した非同期呼び出しは、プロジェクトコードベースに含まれています。 それを使用するための指示はここにあります 。
変更は大歓迎です。
...そして、問題、コードの機能、プロジェクトリリース、スクリプト、テスト、パフォーマンス測定、ドキュメント、サンプルの更新、さらにはプロジェクトについてのブログを支援したい場合でも、問題はありません。
誰にとっても常に何かがあり、これらすべてがプロジェクトの前進に役立ちます。
フィードバック、アイデア、提案を@alexellisukに送信するか、GitHubリポジトリのいずれかを使用して送信してください。
どこから始めたらいいか分からない?
TensorFlowによる機械学習、ASCIIアート、簡単な統合など、 ディスカッションやコミュニティ機能に触発されます 。
翻訳者からのPS
1か月前、この資料の著者は、Minikubeを使用してKubernetes 1.8でOpenFaaSを開始するための手順も公開しました。
Kubernetesのサーバーレストピックに興味がある場合は、(少なくとも) KubelessプロジェクトとFissionプロジェクトにも注意を払う必要があります。上記の記事の著者は、より完全なリストを提供しています。 おそらくブログでそれらについて書きますが、今のところ-過去の資料を読んでください: