KEDA を使用した Kubernetes での Azure Functions

Azure Functions ランタイムにより、必要な場所と方法でのホスティングにおける柔軟性が提供されます。 KEDA (Kubernetes ベースのイベント ドリブン自動スケーリング) は、Azure Functions ランタイムおよびツールにシームレスに組み合わされ、Kubernetes でのイベント ドリブンな自動スケーリングを提供します。

Kubernetes ベースの関数の動作

Azure Functions サービスは 2 つの主要コンポーネントで構成されています。ランタイムとスケール コントローラーです。 Functions ランタイムでは、ご自分のコードを実行します。 ランタイムには、関数の実行をトリガー、ログ、および管理する方法のロジックが含まれています。 Azure Functions ランタイムは、どこでも 実行できます。 もう 1 つのコンポーネントは、スケール コントローラーです。 スケール コントローラーによって、関数をターゲットにしているイベントの割合が監視され、アプリを実行しているインスタンスの数がプロアクティブにスケーリングされます。 詳細については、「Azure Functions のスケールとホスティング」を参照してください。

Kubernetes ベースの Functions では、KEDA によるイベント ドリブン スケーリングを使用して、Docker コンテナー内に Functions ランタイムが提供されます。 KEDA では、0 インスタンスまでのスケールイン (インスタンスが発生していないとき) と n インスタンスまでのスケールアウトが可能です。 これは、Kubernetes 自動スケーラー (ポッドの水平自動スケーラー) 用のカスタム メトリックを公開することによって行われます。 KEDA で Functions のコンテナーを使用すると、任意の Kubernetes クラスターにおいてサーバーレス関数の機能をレプリケートできるようになります。 これらの関数は、サーバーレス インフラストラクチャ用の Azure Kubernetes Services (AKS) 仮想ノード機能を使用してデプロイすることもできます。

Kubernetes での KEDA と関数の管理

Kubernetes クラスター上で Functions を実行するには、KEDA コンポーネントをインストールする必要があります。 このコンポーネントは、次のいずれかの方法でインストールできます。

  • Azure Functions Core Tools: func kubernetes install コマンドを使用します。

  • Helm: Kubernetes クラスターに KEDA をインストールするには、Helm を使用する方法を含め、さまざまな方法があります。 デプロイ オプションについては、KEDA サイトをご覧ください。

Kubernetes への関数アプリのデプロイ

KEDA を実行する Kubernetes クラスターには、あらゆる関数アプリをデプロイできます。 対象の関数は Docker コンテナー内で実行されるため、プロジェクトには Dockerfile が必要です。 Dockerfile は、func init を呼び出してプロジェクトを作成するときに --docker オプションを使用することで作成できます。 これを忘れた場合は、Functions プロジェクトのルートからいつでも func init を再度呼び出すことができます。ただし、その際は、次の例に示すように --docker-only オプションを使用します。

func init --docker-only

Dockerfile の生成の詳細については、func init のリファレンスを参照してください。

イメージをビルドして関数を Kubernetes にデプロイするには、次のコマンドを実行します。

func kubernetes deploy --name <name-of-function-deployment> --registry <container-registry-username>

この例では、<name-of-function-deployment> をお使いの関数アプリの名前に置き換えます。

deploy コマンドによって、次の処理が実行されます。

  1. 先ほど作成した Dockerfile は、関数アプリのローカル イメージを構築するために使用されます。
  2. ローカル イメージにタグが付けられ、ユーザーがログインしたコンテナー レジストリにプッシュされます。
  3. マニフェストが作成され、Kubernetes Deployment リソース、ScaledObject リソース、local.settings.json からインポートされた環境変数を含む Secrets を定義するクラスターに適用されます。

詳細については、func kubernetes deploy コマンドに関するセクションを参照してください。

プライベート レジストリから関数アプリをデプロイする

前述のフローは、プライベート レジストリにも使用できます。 コンテナー イメージをプライベート レジストリからプルする場合は、func kubernetes deploy を実行する際に --pull-secret フラグを指定して、プライベート レジストリの資格情報を保持する Kubernetes シークレットを参照します。

Kubernetes からの関数アプリの削除

デプロイ後は、作成された関連する DeploymentScaledObjectSecrets を削除することによって、関数を削除できます。

kubectl delete deploy <name-of-function-deployment>
kubectl delete ScaledObject <name-of-function-deployment>
kubectl delete secret <name-of-function-deployment>

Kubernetes からの KEDA のアンインストール

次のいずれかの方法で、対象のクラスターから KEDA を削除できます。

KEDA でサポートされているトリガー

KEDA は、次の Azure Function トリガーをサポートしています。

HTTP トリガーのサポート

HTTP トリガーを公開する Azure Functions は使用することはできますが、KEDA では直接管理されません。 KEDA prometheus トリガーを利用すると、HTTP Azure Functions を 1 から n インスタンスにスケーリングできます

次の手順

詳細については、次のリソースを参照してください。