KEDA+AKSでk8s上にFaaSを構築する
5月に発表されたKEDA(Kubernetes-based Event-driven Autoscaling)ですが、AKS(Azure Kubernetes Service)の上でサーバーレス のイベントドリブンコンテナーをサポートするものとしてオープンソースでMicrosoftとRedHatが共同で発表しました。
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や発表時のブログを参照してください。
実際に動かしてみる
AKSの構築
いずれかの方法でAKSを構築します。
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
ストレージの作成
キュートリガーで動くよう作るのでストレージアカウントとキューを作成
アプリケーションの作成
作業ディレクトリの作成
mkdir kedaapp & cd kedaapp
ディレクトリの初期化
optionはnode→javascriptを選択
func init . --docker
Queueトリガーの作成
Azure Queue Storage triggerを選択
名称は適宜変更
func new
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>
動作確認
リソースが作成されていることを確認する
キューをポータルより作成し、Podが自動的に起動するのを確認する
上記のように処理が完了してしばらくするとTerminatingされます
最後に
まだベータ版で開発中です。
今後CosmosDBやAzure Monitor、IoT Hubなどの連携も予定されているので今後がたのしみなプロダクトですね!