DigitalOceanKubernetesでOpenFaaSを使用してサーバーレス機能を実行する方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
通常、インターネット上でソフトウェアアプリケーションをホストするには、モノリシックシステムのインフラストラクチャの管理、計画、および監視が必要です。 この従来のアプローチとは異なり、サーバーレスアーキテクチャ(サービスとしての機能、またはFaaSとも呼ばれます)は、アプリケーションを機能に分割します。 これらの機能は、基盤となるハードウェアや明示的なインフラストラクチャプロビジョニングではなく、管理するAPIを介して通信する、ステートレス、自己完結型、イベントトリガー、機能的に完全なエンティティです。 関数は、設計によりスケーラブルで、ポータブルで、セットアップが速く、通常のアプリよりもテストが簡単です。 サーバーレスアーキテクチャが原則として機能するには、プラットフォームに依存しない方法で機能をパッケージ化および調整する必要があります。
OpenFaaS は、関数の保存と実行にDockerコンテナーを使用して、Kubernetesにサーバーレスアーキテクチャを実装するためのオープンソースフレームワークです。 これにより、任意のプログラムをコンテナーとしてパッケージ化し、コマンドラインまたは統合されたWebUIを介して関数として管理できます。 OpenFaaSはメトリックの優れたサポートを備えており、需要が増加したときに関数の自動スケーリングを提供します。
このチュートリアルでは、OpenFaaSをドメインのDigitalOcean Kubernetesクラスターにデプロイし、無料のLet'sEncryptTLS証明書を使用して保護します。 また、公式のコマンドラインツールである faas-cli を使用して、そのWeb UIを調べ、既存の関数と新しい関数を展開します。 最終的には、サーバーレス機能を導入するための柔軟なシステムができあがります。
前提条件
- 接続が
kubectl
デフォルトとして構成されたDigitalOceanKubernetesクラスター。 クラスターには、OpenFaaSで使用可能な少なくとも8GBのRAMと4つのCPUコアが必要です(より頻繁に使用する場合は、さらに多くのコアが必要になります)。kubectl
を構成する方法の説明は、クラスターを作成するときのクラスターへの接続ステップの下に表示されます。 DigitalOceanでKubernetesクラスタを作成するには、 KubernetesQuickstartを参照してください。 - ローカルマシンにインストールされたDocker。 ディストリビューションの手順1と2に従って、Dockerのインストール方法を参照してください。
- このチュートリアルで作成するDockerイメージを保存するためのDockerHubのアカウント。
- faas-cli は、OpenFaaSを管理するための公式CLIツールであり、ローカルマシンにインストールされています。 複数のプラットフォームの手順については、公式ドキュメントにアクセスしてください。
- ローカルマシンにインストールされているHelmパッケージマネージャー。 これを行うには、ステップ1を完了し、 Helm 3 PackageManagerチュートリアルを使用してKubernetesクラスターにソフトウェアをインストールする方法のステップ2から
stable
リポジトリを追加します。 - 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
次の行を追加します。
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
に設定すると、HelmにOpenFaaS Web UIにアクセスするときに必須の認証を設定し、管理者のユーザー名とパスワードのログインの組み合わせを生成するように指示します。
次に、Ingressの作成を有効にし、さらにNginx Ingress Controllerを使用して、ドメインで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
デコードされたパスワードは、tee
を使用して、出力とopenfaas-password.txt
というファイルに同時に書き込まれます。 admin
アカウントのOpenFaaSパスワードである出力に注意してください。
次のコマンドを実行すると、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
強調表示された行を追加します。
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: /
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 から選択して、期待する応答のタイプを示すことができます。 リクエストをGET
ではなくPOST
にする場合は、リクエスト本文フィールドにリクエストデータを入力できます。
nodeinfo
関数を呼び出すには、INVOKEボタンをクリックします。 OpenFaaSは、選択されたオプションに従ってHTTPリクエストを作成して実行し、受信したデータを応答フィールドに入力します。
応答ステータスはHTTP 200 OK
です。これは、要求が正常に実行されたことを意味します。 応答本文には、NodeInfo関数が収集するシステム情報が含まれています。つまり、適切にアクセスでき、正しく機能しています。
関数を削除するには、リストから関数を選択し、ページの右上隅にあるごみ箱アイコンをクリックします。 プロンプトが表示されたら、OKをクリックして確認します。 関数のステータスはNot Ready
に変わり(つまり、クラスターから削除されます)、関数は間もなくUIから完全に消えます。
このステップでは、OpenFaaS Web UIを使用し、そこから機能をデプロイおよび管理しました。 これで、コマンドラインを使用してOpenFaaS関数をデプロイおよび管理する方法がわかります。
ステップ4—faas-cliを使用した関数の管理
このセクションでは、クラスターで動作するようにfaas-cliを構成します。 次に、コマンドラインを使用して既存の機能を展開および管理します。
faas-cliを実行するたびにOpenFaaSドメインを指定する必要がないように、faas-cliが実行中に自動的に取得して使用する値をOPENFAAS_URL
という環境変数に格納します。
編集のためにホームディレクトリで.bash_profile
を開きます。
nano ~/.bash_profile
次の行を追加します。
〜/ .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.
その後、リクエスト本文を提供できます。 その場合、メソッドはGET
ではなくPOST
になります。 データの入力が終わったら、またはリクエストを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プロジェクトに似ています)の下には、handler.js
とpackage.json
の2つのファイルがあります。
handler.js
には、関数が呼び出されたときに応答を返す実際のJSコードが含まれています。 ハンドラーの内容は次のようになります。
sample-js-function / sample-js / handler.js
"use strict" module.exports = async (context, callback) => { return {status: "done"} }
ラムダ関数を2つのパラメーターでエクスポートします。context
はリクエストデータを含み、callback
は応答データを返すだけでなく返すために使用できます。
このファイルを開いて編集します。
nano sample-js/handler.js
強調表示された行を次のように変更します。
sample-js-function / sample-js / handler.js
"use strict" module.exports = async (context, callback) => { return {status: "<h1>Hello Sammy!</h1>"} }
完了したら、ファイルを保存して閉じます。 このOpenFaaS関数は、呼び出されると、応答にHello Sammy!
を書き込みます。
次に、編集用の構成ファイルを開きます。
nano sample-js.yml
次のようになります。
sample-js-function / 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アカウントのユーザー名を含めるように変更する必要があります。 :
sample-js-function / sample-js.yml
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機能について詳しく知りたい場合は、公式ドキュメントにアクセスしてください。