DigitalOceanKubernetesでOpenFaaSを使用してサーバーレス機能を実行する方法

提供:Dev Guides
移動先:案内検索

著者は、 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-fnfunctionNamespace変数に割り当てることにより、関数が格納される名前空間を指定します。 generateBasicAuthtrueに設定すると、HelmにOpenFaaS Web UIにアクセスするときに必須の認証を設定し、管理者のユーザー名とパスワードのログインの組み合わせを生成するように指示します。

次に、Ingressの作成を有効にし、さらにNginx Ingress Controllerを使用して、ドメインでgatewayOpenFaaSサービスを提供するように構成します。

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-prodClusterIssuerが発行します。 通常、指定されたシークレットは、クラスター内のすべての入力で異なる必要があります。

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に移動するか、関数情報の下にある関数の呼び出しパネルから呼び出します。

TextJSON 、および 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.jspackage.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機能について詳しく知りたい場合は、公式ドキュメントにアクセスしてください。