著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
通常、インターネット上でソフトウェアアプリケーションをホストするには、モノリシックシステムのインフラストラクチャの管理、計画、および監視が必要です。 この従来のアプローチとは異なり、サーバーレスアーキテクチャ(サービスとしての機能、またはFaaSとも呼ばれます)は、アプリケーションを機能に分割します。 これらの機能は、基盤となるハードウェアや明示的なインフラストラクチャプロビジョニングではなく、管理するAPIを介して通信する、ステートレス、自己完結型、イベントトリガー、機能的に完全なエンティティです。 関数は、設計によりスケーラブルで、ポータブルで、セットアップが速く、通常のアプリよりもテストが簡単です。 サーバーレスアーキテクチャが原則として機能するには、プラットフォームに依存しない方法で機能をパッケージ化および調整する必要があります。
OpenFaaS は、関数の保存と実行にDockerコンテナーを使用して、Kubernetesにサーバーレスアーキテクチャを実装するためのオープンソースフレームワークです。 これにより、任意のプログラムをコンテナーとしてパッケージ化し、コマンドラインまたは統合されたWebUIを介して関数として管理できます。 OpenFaaSはメトリックの優れたサポートを備えており、需要が増加したときに関数の自動スケーリングを提供します。
このチュートリアルでは、OpenFaaSをドメインのDigitalOcean Kubernetesクラスターにデプロイし、無料のLet’sEncryptTLS証明書を使用して保護します。 また、公式のコマンドラインツールである faas-cli を使用して、そのWeb UIを調べ、既存の関数と新しい関数を展開します。 最終的には、サーバーレス機能を導入するための柔軟なシステムができあがります。
前提条件
- 接続が次のように構成されたDigitalOceanKubernetesクラスター
kubectl
デフォルト。 クラスターには、OpenFaaSで使用可能な少なくとも8GBのRAMと4つのCPUコアが必要です(より頻繁に使用する場合は、さらに多くのコアが必要になります)。 設定方法の説明kubectl
クラスターを作成すると、クラスターに接続ステップの下に表示されます。 DigitalOceanでKubernetesクラスタを作成するには、 KubernetesQuickstartを参照してください。 - ローカルマシンにインストールされたDocker。 ディストリビューションの手順1と2に従って、Dockerのインストール方法を参照してください。
- このチュートリアルで作成するDockerイメージを保存するためのDockerHubのアカウント。
- faas-cli は、OpenFaaSを管理するための公式CLIツールであり、ローカルマシンにインストールされています。 複数のプラットフォームの手順については、公式ドキュメントにアクセスしてください。
- ローカルマシンにインストールされているHelmパッケージマネージャー。 これを行うには、ステップ1を完了し、
stable
Helm 3 PackageManagerチュートリアルを使用してKubernetesクラスターにソフトウェアをインストールする方法のステップ2のリポジトリ。 - Ingressリソースを使用してOpenFaaSを公開するために、Helmを使用してクラスターにインストールされたNginxIngressControllerとCert-Manager。 ガイダンスについては、Helmを使用してDigitalOceanKubernetesでNginxIngressを設定する方法に従ってください。
- Nginx Ingressで使用されるロードバランサーを指す、OpenFaaSをホストするための完全に登録されたドメイン名。 このチュートリアルでは、
openfaas.your_domain
全体を通して。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。
注:このチュートリアルで使用するドメイン名は、「DigitalOceanKubernetesでNginxIngressを設定する方法」の前提条件チュートリアルで使用されているドメイン名とは異なる必要があります。
ステップ1—Helmを使用したOpenFaaSのインストール
このステップでは、Helmを使用してOpenFaaSをKubernetesクラスターにインストールし、ドメインで公開します。
Nginx Ingress Controllerの前提条件の一部として、サンプルのサービスとイングレスを作成しました。 このチュートリアルではそれらは必要ないため、次のコマンドを実行して削除できます。
- kubectl delete -f hello-kubernetes-first.yaml
- kubectl delete -f hello-kubernetes-second.yaml
- kubectl delete -f hello-kubernetes-ingress.yaml
関数をKubernetesオブジェクトとしてデプロイするので、それらとOpenFaaS自体をクラスター内の別々の名前空間に保存すると便利です。 OpenFaaS名前空間は呼び出されます openfaas
、および関数の名前空間は openfaas-fn
. 次のコマンドを実行して、クラスター内にそれらを作成します。
- kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml
次の出力が表示されます。
Outputnamespace/openfaas created
namespace/openfaas-fn created
次に、OpenFaaSチャートをホストするOpenFaaSHelmリポジトリを追加する必要があります。 これを行うには、次のコマンドを実行します。
- helm repo add openfaas https://openfaas.github.io/faas-netes/
Helmは次の出力を表示します。
Output"openfaas" has been added to your repositories
Helmのチャートキャッシュを更新します。
- helm repo update
次の出力が表示されます。
OutputHang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "openfaas" chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
OpenFaaSをインストールする前に、いくつかのチャートパラメータをカスタマイズする必要があります。 それらをローカルマシンのという名前のファイルに保存します values.yaml
. テキストエディタでファイルを作成して開きます。
- nano values.yaml
次の行を追加します。
functionNamespace: openfaas-fn
generateBasicAuth: true
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
hosts:
- host: openfaas.your_domain
serviceName: gateway
servicePort: 8080
path: /
まず、関数を格納する名前空間を指定します。 openfaas-fn
に functionNamespace
変数。 設定することにより generateBasicAuth
に true
、OpenFaaS Web UIにアクセスするときに必須の認証を設定し、管理者のユーザー名とパスワードのログインの組み合わせを生成するようにHelmに指示します。
次に、Ingressの作成を有効にし、さらにNginxIngressControllerを使用してサービスを提供するように構成します。 gateway
ドメインでのOpenFaaSサービス。
交換することを忘れないでください openfaas.your_domain
前提条件から希望のドメインで。 完了したら、ファイルを保存して閉じます。
最後に、OpenFaaSをにインストールします openfaas
カスタマイズされた値を持つ名前空間:
- helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml
次の出力が表示されます。
OutputRelease "openfaas" does not exist. Installing it now.
NAME: openfaas
LAST DEPLOYED: ...
NAMESPACE: openfaas
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
To retrieve the admin password, run:
echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)
出力は、インストールが成功したことを示しています。 次のコマンドを実行して、 admin
アカウント:
- echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode) | tee openfaas-password.txt
デコードされたパスワードは、出力と次のファイルに書き込まれます。 openfaas-password.txt
同時に使用 tee
. 出力に注意してください。これは、 admin
アカウント。
次のコマンドを実行すると、OpenFaaSコンテナが使用可能になるのを確認できます。
- kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
リストされているすべての展開が ready
、 タイプ CTRL + C
出る。
これで、Webブラウザで指定したドメインに移動できます。 入力 admin
プロンプトが表示されたら、ユーザー名とそれに付随するパスワードとして。 OpenFaaSWebUIが表示されます。
OpenFaaSが正常にインストールされ、ドメインでそのコントロールパネルが公開されました。 次に、Let’sEncryptの無料のTLS証明書を使用してセキュリティで保護します。
ステップ2—ドメインでTLSを有効にする
このステップでは、cert-managerが提供するLet’sEncrypt証明書を使用して公開ドメインを保護します。
これを行うには、で入力設定を編集する必要があります values.yaml
. 編集のために開きます:
- nano values.yaml
強調表示された行を追加します。
generateBasicAuth: true
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: letsencrypt-prod
tls:
- hosts:
- openfaas.your_domain
secretName: openfaas-crt
hosts:
- host: openfaas.your_domain
serviceName: gateway
servicePort: 8080
path: /
The tls
ブロックは、サイトの証明書をどのシークレットに定義するかを定義します( hosts
)証明書を保存します。 letsencrypt-prod
ClusterIssuerの問題。 通常、指定されたシークレットは、クラスター内のすべての入力で異なる必要があります。
交換することを忘れないでください openfaas.your_domain
目的のドメインでファイルを保存して閉じます。
次のコマンドを実行して、変更をクラスターに適用します。
- helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml
次の出力が表示されます。
OutputRelease "openfaas" has been upgraded. Happy Helming!
NAME: openfaas
LAST DEPLOYED: ...
NAMESPACE: openfaas
STATUS: deployed
REVISION: 2
TEST SUITE: None
NOTES:
To verify that openfaas has started, run:
kubectl -n openfaas get deployments -l "release=openfaas, app=openfaas"
To retrieve the admin password, run:
echo $(kubectl -n openfaas get secret basic-auth -o jsonpath="{.data.basic-auth-password}" | base64 --decode)
Let’sEncryptサーバーがドメインの証明書を発行するまで数分待つ必要があります。 それまでの間、次のコマンドの出力を調べることで、進行状況を追跡できます。
- kubectl describe certificate openfaas-crt -n openfaas
出力の終わりは次のようになります。
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal GeneratedKey 24m cert-manager Generated a new private key
Normal Requested 16m cert-manager Created new CertificateRequest resource "openfaas-crt-1017759607"
Normal Issued 16m cert-manager Certificate issued successfully
出力の最後の行が Certificate issued successfully
、を押して終了できます CTRL + C
. ブラウザでドメインを更新してテストします。 ブラウザのアドレスバーの左側に南京錠が表示され、接続が安全であることを示します。
Let’sEncryptの無料のTLS証明書を使用してOpenFaaSドメインを保護しました。 次に、Web UIを使用して、そこから機能を管理します。
ステップ3—WebUIを介した関数のデプロイ
このセクションでは、OpenFaaS Web UIについて説明し、そこから関数をデプロイ、管理、および呼び出します。
OpenFaaS Web UIには、2つの主要な部分があります。左側には、デプロイされた関数が一覧表示される列と、選択した関数に関する詳細情報が表示され、関数と対話できる中央のパネルがあります。
新しい機能をデプロイするには、左上のOpenFaaSロゴの下にある新しい関数のデプロイボタンをクリックします。 関数を選択するように求めるダイアログが表示されます。
FROM STORE タブには、すぐに展開できる公式のOpenFaaS関数ストアから作成された関数が一覧表示されます。 各関数は簡単な説明とともに表示され、関数の右側にあるリンクアイコンを選択して、そのソースコードを確認できます。 このリストからストア機能をデプロイするには、それを選択し、DEPLOYボタンをクリックします。
CUSTOM タブに切り替えて、独自の機能を提供することもできます。
ここでは、OpenFaaS用に特別に構成され、Dockerレジストリ(Docker Hubなど)で利用できる関数のDockerイメージを指定する必要があります。 このステップでは、OpenFaaSストアから事前に作成された関数をデプロイし、次のステップでカスタム関数を作成してDockerHubにデプロイします。
を展開します NodeInfo
関数。CPUアーキテクチャ、コア数、使用可能なRAMメモリの合計、稼働時間(秒単位)など、デプロイされているマシンに関する情報を返します。
ストア機能のリストから、 NodeInfo を選択し、DEPLOYをクリックします。 すぐにデプロイされた機能のリストに表示されます。
それを選択します。 画面の中央部分に、デプロイされた関数に関する基本情報が表示されます。
関数のステータスはリアルタイムで更新され、すぐに次のようになります。 Ready
. それがとどまるなら Not Ready
長期間にわたって、クラスターに新しいポッドを受け入れるためのリソースが不足している可能性があります。 これを修正する方法については、液滴のサイズを変更する方法に従ってください。
一度 Ready
、デプロイされた関数は、表示されたURLからアクセスできます。 テストするには、ブラウザでURLに移動するか、関数情報の下にある関数の呼び出しパネルから呼び出します。
Text 、 JSON 、および Download から選択して、期待する応答のタイプを示すことができます。 リクエストを POST
それ以外の GET
、リクエスト本文フィールドにリクエストデータを入力できます。
を呼び出すには nodeinfo
機能が必要な場合は、INVOKEボタンをクリックしてください。 OpenFaaSは、選択されたオプションに従ってHTTPリクエストを作成して実行し、受信したデータを応答フィールドに入力します。
応答状況は HTTP 200 OK
、これは、要求が正常に実行されたことを意味します。 応答本文には、NodeInfo関数が収集するシステム情報が含まれています。つまり、適切にアクセスでき、正しく機能しています。
関数を削除するには、リストから関数を選択し、ページの右上隅にあるごみ箱アイコンをクリックします。 プロンプトが表示されたら、OKをクリックして確認します。 関数のステータスは次のようになります Not Ready
(これは、クラスターから削除されていることを意味します)、関数はすぐにUIから完全に消えます。
このステップでは、OpenFaaS Web UIを使用し、そこから機能をデプロイおよび管理しました。 これで、コマンドラインを使用してOpenFaaS関数をデプロイおよび管理する方法がわかります。
ステップ4—faas-cliを使用した関数の管理
このセクションでは、クラスターで動作するようにfaas-cliを構成します。 次に、コマンドラインを使用して既存の機能を展開および管理します。
faas-cliを実行するたびにOpenFaaSドメインを指定する必要がないように、ドメインをと呼ばれる環境変数に格納します。 OPENFAAS_URL
、その値は、実行中にfaas-cliが自動的に取得して使用します。
開ける .bash_profile
編集用のホームディレクトリ:
- nano ~/.bash_profile
次の行を追加します。
. . .
export OPENFAAS_URL=https://openfaas.your_domain
交換することを忘れないでください openfaas.your_domain
ドメインを使用して、ファイルを保存して閉じます。
再度ログインする必要がないようにするには、ファイルを手動で評価します。
- . ~/.bash_profile
ここで、ローカルマシンにfaas-cliがインストールされていることを確認します。 まだインストールしていない場合は、公式ドキュメントに記載されている手順に従ってインストールしてください。
次に、次のコマンドを実行してログイン資格情報を設定します。
- cat ~/openfaas-password.txt | faas-cli login --username admin --password-stdin
出力は次のようになります。
OutputCalling the OpenFaaS server to validate the credentials...
credentials saved for admin https://openfaas.your_domain
ストアから関数をデプロイするには、次のコマンドを実行します。
- faas store deploy function_name
デプロイしてみることができます nodeinfo
実行することによって:
- faas store deploy nodeinfo
次のような出力が表示されます。
OutputDeployed. 202 Accepted.
URL: https://openfaas.your_domain/function/nodeinfo
デプロイされた関数を一覧表示するには、 faas list
:
- faas list
既存の機能が表示されます。
OutputFunction Invocations Replicas
nodeinfo 0 1
デプロイされた関数に関する詳細情報を取得するには、 faas describe
:
- faas describe nodeinfo
出力は次のようになります。
Name: nodeinfo
Status: Ready
Replicas: 1
Available replicas: 1
Invocations: 0
Image: functions/nodeinfo-http:latest
Function process:
URL: https://openfaas.your_domain/function/nodeinfo
Async URL: https://openfaas.your_domain/async-function/nodeinfo
Labels: faas_function : nodeinfo
uid : 514253614
Annotations: prometheus.io.scrape : false
次の関数を呼び出すことができます faas invoke
:
- faas invoke nodeinfo
次のメッセージが表示されます。
OutputReading from STDIN - hit (Control + D) to stop.
その後、リクエスト本文を提供できます。 そうした場合、その方法は次のようになります。 POST
それ以外の GET
. データの入力が終了したとき、またはリクエストを GET
、 押す CTRL + D
. 次に、faas-cliは、Web UIと同様に、推測された要求を実行し、応答を出力します。
関数を削除するには、 faas remove
:
- faas remove nodeinfo
次の出力が得られます。
OutputDeleting: nodeinfo.
Removing old function.
走る faas list
もう一度それを見るために nodeinfo
除去された:
OutputFunction Invocations Replicas
このステップでは、faas-cliを使用して、クラスター内の関数をコマンドラインからデプロイ、一覧表示、呼び出し、および削除しました。 次のステップでは、独自の関数を作成し、それをクラスターにデプロイします。
ステップ5—新しい関数の作成と展開
次に、faas-cliを使用してサンプルのNode.JS関数を作成し、クラスターにデプロイします。
作成する関数は、Dockerコンテナーとしてパッケージ化され、DockerHubで公開されます。 コンテナを公開できるようにするには、次のコマンドを実行してログインする必要があります。
- docker login
ログインプロセスを終了するように求められたら、DockerHubのユーザー名とパスワードを入力します。
サンプルのNode.JS関数をという名前のフォルダーに保存します sample-js-function
. 次のコマンドを使用して作成します。
- mkdir sample-js-function
そこに移動します:
- cd sample-js-function
次のコマンドを実行して、ディレクトリにJS関数のテンプレートを入力します。
- faas new sample-js --lang node
出力は次のようになります。
Output2020/03/24 17:06:08 No templates found in current directory.
2020/03/24 17:06:08 Attempting to expand templates from https://github.com/openfaas/templates.git
2020/03/24 17:06:10 Fetched 19 template(s) : [csharp csharp-armhf dockerfile go go-armhf java11 java11-vert -x java8 node node-arm64 node-armhf node12 php7 python python-armhf python3 python3-armhf python3-debian ru by] from https://github.com/openfaas/templates.git
Folder: sample-js created.
___ _____ ____
/ _ \ _ __ ___ _ __ | ___|_ _ __ _/ ___|
| | | | '_ \ / _ \ '_ \| |_ / _` |/ _` \___ \
| |_| | |_) | __/ | | | _| (_| | (_| |___) |
\___/| .__/ \___|_| |_|_| \__,_|\__,_|____/
|_|
Function created in folder: sample-js
Stack file written: sample-js.yml
...
出力に記述されているように、関数自体のコードはフォルダーにあります sample-js
、関数のOpenFaaS構成がファイルにある間 sample-js.yaml
. 下 sample-js
ディレクトリ(通常のNode.JSプロジェクトに似ています)は2つのファイルです。 handler.js
と package.json
.
handler.js
関数が呼び出されたときに応答を返す実際のJSコードが含まれています。 ハンドラーの内容は次のようになります。
"use strict"
module.exports = async (context, callback) => {
return {status: "done"}
}
ラムダ関数を2つのパラメーターでエクスポートします。 context
リクエストデータと callback
単に返すのではなく、応答データを返すために使用できます。
このファイルを開いて編集します。
- nano sample-js/handler.js
強調表示された行を次のように変更します。
"use strict"
module.exports = async (context, callback) => {
return {status: "<h1>Hello Sammy!</h1>"}
}
完了したら、ファイルを保存して閉じます。 このOpenFaaS関数は、呼び出されると、次のように記述されます。 Hello Sammy!
応答に。
次に、編集用の構成ファイルを開きます。
- nano sample-js.yml
次のようになります。
version: 1.0
provider:
name: openfaas
gateway: https://openfaas.your_domain
functions:
sample-js:
lang: node
handler: ./sample-js
image: sample-js:latest
のために provider
、指定します openfaas
およびデフォルトゲートウェイ。 次に、それは sample-js
関数、その言語を指定します(node
)、そのハンドラー、およびDockerイメージ名。次のようにDockerHubアカウントのユーザー名を含めるように変更する必要があります。
version: 1.0
provider:
name: openfaas
gateway: http://127.0.0.1:8080
functions:
sample-js:
lang: node
handler: ./sample-js
image: your_docker_hub_username/sample-js:latest
ファイルを保存して閉じます。
次に、次のコマンドを実行して、Dockerイメージをビルドし、Docker Hubにプッシュして、クラスターにデプロイします。
- faas up -f sample-js.yml
多くの出力(主にDockerから)があり、次のように終了します。
Output. . .
[0] < Pushing sample-js [your_docker_hub_username/sample-js:latest] done.
[0] Worker done.
Deploying: sample-js.
Deployed. 202 Accepted.
URL: https://openfaas.your_domain/function/sample-js
新しくデプロイした関数を呼び出して、機能していることを確認します。
- faas invoke sample-js
プレス CTRL + D
. 次の出力が表示されます。
Output<h1>Hello Sammy!</h1>
これは、関数が正しくパッケージ化およびデプロイされたことを意味します。
次のコマンドを実行して、関数を削除できます。
- faas remove sample-js
これで、クラスター内のOpenFaaSインスタンスにカスタムNode.JS関数が正常に作成およびデプロイされました。
結論
OpenFaaSをDigitalOceanKubernetesクラスターにデプロイし、既成の関数とカスタム関数の両方をデプロイしてアクセスする準備が整いました。 これで、Function as a Serviceアーキテクチャを実装できるようになりました。これにより、リソースの使用率が向上し、アプリのパフォーマンスが向上します。
デプロイされた関数の自動スケーリングやそのパフォーマンスの監視などの高度なOpenFaaS機能について詳しく知りたい場合は、公式ドキュメントにアクセスしてください。