AKS/ACA+KEDAでイベントドリブンにコンテナを起動しよう

5.7K Views

March 29, 23

スライド概要

2023/03/29 第43回 Tokyo Jazug Night での登壇資料です。
https://jazug.connpass.com/event/275503/

profile-image

SIer所属のインフラ屋さんです

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

AKS/ACA+KEDAで イベントドリブンに コンテナを起動しよう 2023/03/29 第43回 Tok yo Ja zug N igh t Shunsuk e Yoshik a wa

2.

自己紹介 Shunsuke Yoshikawa Twitter: https://twitter.com/ussvgr Qiita: https://qiita.com/ussvgr ⚫ 所属: 株式会社エーピーコミュニケーションズ ⚫ 普段の仕事: Azure×コンテナ中心のインフラ構築(AKSとかContainer Appsとか) ⚫ MICUG クラウドネイティブ/内製開発分科会オーガナイザー https://micug.jp/ ⚫ 愛知県在住

3.

KEDA? Kubernetes Event-driven Autoscaling Kubernetesでイベント駆動なアプリケーションを実行するのに便利なコンポーネント Microsoft主導で開発→現在はCNCFに寄贈されているIncubatingプロジェクト

4.

なにができる? その名のとおり、外部の イベントソース の状態に従って Podのスケーリング を行うことができる イベントが発生していないときにはPodを0までスケールインできるので リソースの使用量やコストを低減できる イベントソースの監視 イベントソース Podのスケーリング

5.

つまりこんな利用シーン ⚫ キューにデータが入ってきたことをトリガーに処理する Queue Storage、Service Busなど ⚫ ストレージにデータが置かれたことをトリガーに処理する Blob Storageなど ⚫ データベースに特定条件のレコードが追加されたことをトリガーに処理する SQL Database、SQL Server、PostgreSQL、MySQLなど ⚫ HTTPリクエスト数に応じてPodを増やす ※AKS/Kubernetesの場合別途アドオンの導入が必要 公式サイトに対応サービスが記載されている(60種類以上) https://keda.sh/

6.

AKSへのインストール AKSクラスター作成時に --enable-keda を指定する $ az aks create -g $RG_NAME -n $AKS_NAME --enable-keda 既存のクラスターに導入する際は以下のように update オプションで実行する $ az aks update -g $RG_NAME -n $AKS_NAME --enable-keda 詳細は公式ドキュメント参照 https://learn.microsoft.com/ja-jp/azure/aks/keda-deploy-add-on-cli

7.
[beta]
AKSへのインストール(余談)
ドキュメント上では 2.7.0 がインストールされると書いてあるが…

実際には 2.9.3 がインストールされました。(2023/03/27時点)
$ kubectl get deployment keda-operator -n kube-system \
> -o jsonpath="{..image}“

mcr.microsoft.com/oss/kedacore/keda:2.9.3

8.

AKS以外へのインストール 他クラウド/オンプレミスのKubernetesクラスターには Helm を使ってインストール $ helm repo add kedacore https://kedacore.github.io/charts $ helm repo update $ helm install keda kedacore/keda OpenShiftだったら OperatorHub でインストール Azure Container Apps(ACA)にはあらかじめ組み込まれているため、 特にインストールする必要はない

9.

2つのカスタムリソース (1) KEDAをインストールすると ⚫ ScaledObject (scaledobjects.keda.sh) ⚫ ScaledJob (scaledjobs.keda.sh) という2つのカスタムリソース※が作成される なにが違う?どう使い分ける?🤔 ※実際には認証周りのもの含めて4つ作られますが、説明が長くなるので割愛

10.

2つのカスタムリソース (2) ScaledObject と ScaledJob の違いは スケールさせる対象の Kubernetesリソースの種別 ScaledObject ScaledJob Deployment, StatefulSet Job Horizontal Pod Autoscaler

11.

2つのカスタムリソース (3) キューからデータを取り出して処理するアプリケーションを想定したとき… ⚫ キューが空になるまで順次データを取り出して処理し続ける、 キュー長が長くなったらPod数を増やして並列で処理させるようなアプリケーション → ScaledObject を使う ⚫ キュー内のデータ1つに対し1つのPodを起動し、 1つのデータを処理し終わったらPodは終了するようなアプリケーション → ScaledJob を使う ※ ACAは現状ScaledJobに対応しておらず、ScaledObjectのみに対応

12.

サンプル構成

13.

ScaledObject のマニフェスト apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: keda-servicebus-scaledobject spec: scaleTargetRef: スケール対象のDeploymentを指定 name: keda-servicebus minReplicaCount: 0 スケール数の下限・上限を指定 maxReplicaCount: 5 triggers: スケールのトリガーとしてService Busを指定 - type: azure-servicebus metadata: queueName: <Service Busのキュー名> Service Busへの接続情報 connectionFromEnv: CONNECTION_STRING

14.

Horizontal Pod Scaler(HPA) ScaledObjectを作成すると、合わせてHorizontal Pod Scaler(HPA) も作成される $ kubectl get hpa -o=custom-columns='NAME:metadata.name’ NAME keda-hpa-keda-servicebus-scaledobject スケール動作は以下のような役割分担になっている ⚫ Pod数を 0→1 or 1→0 にするとき … KEDAが担当 ⚫ Pod数を 1→n or n→1 にするとき … HPAが担当 (KEDAがHPAに対しメトリックを提供し、そのメトリックを基にHPAが動作する)

15.

ACAにおけるScaledObject ACAではマニフェスト使わないのでポータルで設定する (CLIなどでも設定可能) スケールルールの設定は、 マニフェストの triggers と以下のように対応する triggers: - type: azure-servicebus metadata: queueName: <Service Busのキュー名> connectionFromEnv: CONNECTION_STRING

16.

スケーリング動作 Service Bus Active Messages ①Service Busキューに 1000件のメッセージを 投入 ②Service Busキューを 検知しPodを起動 AKS Pods Count ③処理完了後、 一定時間待機してから Podを停止

17.

Functions対応 KEDAを利用することで、Kubernetes上でAzure Functionsを動かすことができる 引用元: https://keda.sh/

18.

Functionsが動かせるとなにがうれしい? Functionsをホストする基盤の選択肢が増えた 例:WebアプリをAKS/バックグラウンドジョブをFunctionsと使い分けていた場合 KEDAの導入により、ワークロード全てをAKSに寄せることができる

19.

まとめ ⚫ KEDAを使うと、イベントドリブンなアプリケーションを Kubernetes上で実行できます ⚫ 導入は簡単です AKSならアドオンを有効化するのみ、ACAなら最初から組み込まれています ⚫ AKS・ACAでWebアプリだけではなく、 バックグラウンドジョブも実行してみましょう! 弊社の技術ブログでも何度かKEDAを取り上げてます よかったら見てみてください APC 技術ブログ https://techblog.ap-com.co.jp/

20.

Thank You!