KEDA+AKSでk8s上にFaaSを構築する

5月に発表されたKEDA(Kubernetes-based Event-driven Autoscaling)ですが、AKS(Azure Kubernetes Service)の上でサーバーレス のイベントドリブンコンテナーをサポートするものとしてオープンソースMicrosoftRedHatが共同で発表しました。

KubernetesのスケーリングはコンテナのCPUとメモリ消費率に関連付けされていますが、KEDAを使う事でAzure FunctionsなどのFaaSと同様にイベントに応じたリソースのプロビジョニングやスケーリングをする事が可能になります。 

現状(2019/9/30現在)サポートされているイベントソースとスケーラーは以下になります。

  • AWS CloudWatch
  • AWS Simple Queue Service
  • Azure Event Hub†
  • Azure Service Bus Queues and Topics
  • Azure Storage Queues
  • GCP PubSub
  • Kafka
  • Liiklus
  • Prometheus
  • RabbitMQ
  • Redis Lists

詳細などはGitHubや発表時のブログを参照してください。

cloudblogs.microsoft.com

github.com

実際に動かしてみる

AKSの構築

いずれかの方法でAKSを構築します。

docs.microsoft.com

docs.microsoft.com

 

KEDAのインストール

Kubernetesクラスターにhelmをインストール

helm init

Helm repoの作成

helm repo add kedacore https://kedacore.azureedge.net/helm

 Helm repoの更新

helm repo update

keda-edge chartのインストール

helm install kedacore/keda-edge --devel --set logLevel=debug --namespace keda --name keda

Azure Functions Core Toolsのインストール

func kubernetes install --namespace keda

 

ストレージの作成

キュートリガーで動くよう作るのでストレージアカウントとキューを作成

docs.microsoft.com

docs.microsoft.com

アプリケーションの作成

作業ディレクトリの作成

mkdir kedaapp & cd kedaapp

ディレクトリの初期化

optionはnode→javascriptを選択

func init . --docker

f:id:tsukatoh:20190930175434p:plain

Queueトリガーの作成

Azure Queue Storage triggerを選択

名称は適宜変更

func new

f:id:tsukatoh:20190930175542p:plain

 function.jsonの「queueName」をStorage Queueのキュー名と合わせる

{
  "bindings": [
    {
      "name": "myQueueItem",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "js-queue-items",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

local.settings.jsonのAzureWebJobsStorageへ作成したStorage accountのAccess keysよりConnection stringをコピーする(key1,key2どちらでもよい)

{
  "IsEncrypted": false,
  "Values": {
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=mystorageaccount;AccountKey=keykey==="
  }
}

 

KEDAへアプリケーションのデプロイ

コマンドにてdocker hubへプッシュし、Kubernetesへデプロイする

func kubernetes deploy --name kedaqueue --registry <docker-user-id>

 

 動作確認

リソースが作成されていることを確認する

f:id:tsukatoh:20190930182038p:plain

キューをポータルより作成し、Podが自動的に起動するのを確認する

f:id:tsukatoh:20190930182805p:plain
上記のように処理が完了してしばらくするとTerminatingされます

 

最後に

まだベータ版で開発中です。

今後CosmosDBやAzure Monitor、IoT Hubなどの連携も予定されているので今後がたのしみなプロダクトですね!

docs.microsoft.com