開発者ドキュメント

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を調べ、既存の関数と新しい関数を展開します。 最終的には、サーバーレス機能を導入するための柔軟なシステムができあがります。

前提条件

注:このチュートリアルで使用するドメイン名は、「DigitalOceanKubernetesでNginxIngressを設定する方法」の前提条件チュートリアルで使用されているドメイン名とは異なる必要があります。

ステップ1—Helmを使用したOpenFaaSのインストール

このステップでは、Helmを使用してOpenFaaSをKubernetesクラスターにインストールし、ドメインで公開します。

Nginx Ingress Controllerの前提条件の一部として、サンプルのサービスとイングレスを作成しました。 このチュートリアルではそれらは必要ないため、次のコマンドを実行して削除できます。

  1. kubectl delete -f hello-kubernetes-first.yaml
  2. kubectl delete -f hello-kubernetes-second.yaml
  3. kubectl delete -f hello-kubernetes-ingress.yaml

関数をKubernetesオブジェクトとしてデプロイするので、それらとOpenFaaS自体をクラスター内の別々の名前空間に保存すると便利です。 OpenFaaS名前空間は呼び出されます openfaas、および関数の名前空間は openfaas-fn. 次のコマンドを実行して、クラスター内にそれらを作成します。

  1. kubectl apply -f https://raw.githubusercontent.com/openfaas/faas-netes/master/namespaces.yml

次の出力が表示されます。

Output
namespace/openfaas created namespace/openfaas-fn created

次に、OpenFaaSチャートをホストするOpenFaaSHelmリポジトリを追加する必要があります。 これを行うには、次のコマンドを実行します。

  1. helm repo add openfaas https://openfaas.github.io/faas-netes/

Helmは次の出力を表示します。

Output
"openfaas" has been added to your repositories

Helmのチャートキャッシュを更新します。

  1. helm repo update

次の出力が表示されます。

Output
Hang 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. テキストエディタでファイルを作成して開きます。

  1. 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、OpenFaaS Web UIにアクセスするときに必須の認証を設定し、管理者のユーザー名とパスワードのログインの組み合わせを生成するようにHelmに指示します。

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

交換することを忘れないでください openfaas.your_domain 前提条件から希望のドメインで。 完了したら、ファイルを保存して閉じます。

最後に、OpenFaaSをにインストールします openfaas カスタマイズされた値を持つ名前空間:

  1. helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml

次の出力が表示されます。

Output
Release "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 アカウント:

  1. 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コンテナが使用可能になるのを確認できます。

  1. 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. 編集のために開きます:

  1. 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: /

The tls ブロックは、サイトの証明書をどのシークレットに定義するかを定義します( hosts)証明書を保存します。 letsencrypt-prod ClusterIssuerの問題。 通常、指定されたシークレットは、クラスター内のすべての入力で異なる必要があります。

交換することを忘れないでください openfaas.your_domain 目的のドメインでファイルを保存して閉じます。

次のコマンドを実行して、変更をクラスターに適用します。

  1. helm upgrade openfaas --install openfaas/openfaas --namespace openfaas -f values.yaml

次の出力が表示されます。

Output
Release "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サーバーがドメインの証明書を発行するまで数分待つ必要があります。 それまでの間、次のコマンドの出力を調べることで、進行状況を追跡できます。

  1. kubectl describe certificate openfaas-crt -n openfaas

出力の終わりは次のようになります。

Output
Events: 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 編集用のホームディレクトリ:

  1. nano ~/.bash_profile

次の行を追加します。

〜/ .bash_profile
. . .
export OPENFAAS_URL=https://openfaas.your_domain

交換することを忘れないでください openfaas.your_domain ドメインを使用して、ファイルを保存して閉じます。

再度ログインする必要がないようにするには、ファイルを手動で評価します。

  1. . ~/.bash_profile

ここで、ローカルマシンにfaas-cliがインストールされていることを確認します。 まだインストールしていない場合は、公式ドキュメントに記載されている手順に従ってインストールしてください。

次に、次のコマンドを実行してログイン資格情報を設定します。

  1. cat ~/openfaas-password.txt | faas-cli login --username admin --password-stdin

出力は次のようになります。

Output
Calling the OpenFaaS server to validate the credentials... credentials saved for admin https://openfaas.your_domain

ストアから関数をデプロイするには、次のコマンドを実行します。

  1. faas store deploy function_name

デプロイしてみることができます nodeinfo 実行することによって:

  1. faas store deploy nodeinfo

次のような出力が表示されます。

Output
Deployed. 202 Accepted. URL: https://openfaas.your_domain/function/nodeinfo

デプロイされた関数を一覧表示するには、 faas list:

  1. faas list

既存の機能が表示されます。

Output
Function Invocations Replicas nodeinfo 0 1

デプロイされた関数に関する詳細情報を取得するには、 faas describe:

  1. 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:

  1. faas invoke nodeinfo

次のメッセージが表示されます。

Output
Reading from STDIN - hit (Control + D) to stop.

その後、リクエスト本文を提供できます。 そうした場合、その方法は次のようになります。 POST それ以外の GET. データの入力が終了したとき、またはリクエストを GET、 押す CTRL + D. 次に、faas-cliは、Web UIと同様に、推測された要求を実行し、応答を出力します。

関数を削除するには、 faas remove:

  1. faas remove nodeinfo

次の出力が得られます。

Output
Deleting: nodeinfo. Removing old function.

走る faas list もう一度それを見るために nodeinfo 除去された:

Output
Function Invocations Replicas

このステップでは、faas-cliを使用して、クラスター内の関数をコマンドラインからデプロイ、一覧表示、呼び出し、および削除しました。 次のステップでは、独自の関数を作成し、それをクラスターにデプロイします。

ステップ5—新しい関数の作成と展開

次に、faas-cliを使用してサンプルのNode.JS関数を作成し、クラスターにデプロイします。

作成する関数は、Dockerコンテナーとしてパッケージ化され、DockerHubで公開されます。 コンテナを公開できるようにするには、次のコマンドを実行してログインする必要があります。

  1. docker login

ログインプロセスを終了するように求められたら、DockerHubのユーザー名とパスワードを入力します。

サンプルのNode.JS関数をという名前のフォルダーに保存します sample-js-function. 次のコマンドを使用して作成します。

  1. mkdir sample-js-function

そこに移動します:

  1. cd sample-js-function

次のコマンドを実行して、ディレクトリにJS関数のテンプレートを入力します。

  1. faas new sample-js --lang node

出力は次のようになります。

Output
2020/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.jspackage.json.

handler.js 関数が呼び出されたときに応答を返す実際のJSコードが含まれています。 ハンドラーの内容は次のようになります。

sample-js-function / sample-js / handler.js
"use strict"

module.exports = async (context, callback) => {
    return {status: "done"}
}

ラムダ関数を2つのパラメーターでエクスポートします。 context リクエストデータと callback 単に返すのではなく、応答データを返すために使用できます。

このファイルを開いて編集します。

  1. 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! 応答に。

次に、編集用の構成ファイルを開きます。

  1. 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にプッシュして、クラスターにデプロイします。

  1. 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

新しくデプロイした関数を呼び出して、機能していることを確認します。

  1. faas invoke sample-js

プレス CTRL + D. 次の出力が表示されます。

Output
<h1>Hello Sammy!</h1>

これは、関数が正しくパッケージ化およびデプロイされたことを意味します。

次のコマンドを実行して、関数を削除できます。

  1. faas remove sample-js

これで、クラスター内のOpenFaaSインスタンスにカスタムNode.JS関数が正常に作成およびデプロイされました。

結論

OpenFaaSをDigitalOceanKubernetesクラスターにデプロイし、既成の関数とカスタム関数の両方をデプロイしてアクセスする準備が整いました。 これで、Function as a Serviceアーキテクチャを実装できるようになりました。これにより、リソースの使用率が向上し、アプリのパフォーマンスが向上します。

デプロイされた関数の自動スケーリングやそのパフォーマンスの監視などの高度なOpenFaaS機能について詳しく知りたい場合は、公式ドキュメントにアクセスしてください。

モバイルバージョンを終了