Container Service for Kubernetes (ACK) は Kubernetes ベースのイベント駆動型自動スケーリング (KEDA) をサポートしています。ACK コンソールに KEDA をインストールして、クラスタのイベント駆動型スケーリングを実装できます。このトピックでは、KEDA の概要、仕組み、使用方法について説明します。
概要
Kubernetes では、Horizontal Pod Autoscaler (HPA) がポッドの自動スケーリングに最もよく使用されるソリューションです。HPA は、リソース使用量と事前定義されたしきい値の差に基づいてスケーリング戦略を決定します。HPA は使いやすいツールであり、さまざまなリソースメトリックをサポートしています。ただし、リアルタイムスケーリングはサポートしていません。たとえば、HPA は特定のイベントが検出されたときにリソースをスケーリングできません。この問題に対処するには、ACK コンソールに KEDA をインストールします。ACK KEDA は、オフラインビデオおよびオーディオのトランスコーディング、イベント駆動型ジョブ、ストリーム処理など、さまざまなイベント駆動型シナリオで使用できるイベント駆動型スケーリングをサポートしています。
KEDA の仕組み
ACK KEDA は、オープンソースの KEDA の拡張バージョンです。イベント駆動型スケーリングをサポートしています。次の図は、ACK KEDA の仕組みを示しています。
ACK KEDA は、イベントソースから定期的にデータを取得します。保留中のメッセージが増加すると、ACK KEDA は数秒以内にバッチジョブをスケーリングするようにトリガーされます。次の期間が開始されると、次のバッチジョブが非同期的にスケーリングされます。ACK KEDA は、次の機能をサポートしています。
さまざまなイベントソースをサポート
ACK KEDA は、Kafka、MySQL、PostgreSQL、RabbitMQ、MongoDB など、さまざまなデータソースをサポートしています。詳細については、「RabbitMQ Queue」をご参照ください。
ジョブの同時実行性を制御
多数のジョブが送信されると、システムはリソース、クォータ、および API リクエストを全体的に制御する必要があるため、基盤となる制御システムの安定性に悪影響が及びます。ACK KEDA は、1 つ以上のバッチでジョブの同時実行性を制御して、システムの安定性を確保できます。
ジョブ完了後にメタデータをクリア
多数のジョブが完了した後、大量のメタデータが保持されます。メタデータの増加は、API サーバーの安定性を低下させます。クラスタのパフォーマンスと安定性も低下し、他のサービスに悪影響が及ぶ可能性があります。ACK KEDA は、ジョブ完了後にメタデータを自動的にクリアできます。
ケーススタディ
次のケースでは、単純なトランスコーディングジョブが使用されます。新しいジョブを受信すると、次の例のようなデータが MongoDB に挿入されます。{"type":"mp4","state":"waiting","createTimeStamp":"1610332940","fileName":"World and peace","endTimeStamp":"","uuid":"1fae72ff-3239-42f5-af97-04711d8007e8"}。ACK KEDA は、"state":"waiting" 条件を満たすデータエントリをデータベースで検索します。次に、ACK KEDA はポッドを作成してデータエントリを処理します。データエントリごとに 1 つのポッドが作成されます。トランスコーディングが完了すると、state フィールドの値が waiting から finished に変わります。ジョブが完了すると、メタデータが自動的にクリアされ、API サーバーの負荷が軽減されます。これにより、ジョブを便利な方法で管理できます。
ステップ 1:ACK KEDA をデプロイする
ACK コンソール にログインします。
ACK コンソールの左側のナビゲーションウィンドウで、 を選択します。
Marketplace ページで、[ack-keda] を見つけてクリックします。
[ack-keda] ページの右上隅にある デプロイ をクリックします。[基本情報] ステップで、クラスタを選択し、次へ をクリックします。
[パラメーター] ステップで、チャートバージョンを選択し、OK をクリックします。
左側のナビゲーションウィンドウで、[クラスタ] をクリックします。クラスターリスト ページで、ACK KEDA がデプロイされているクラスタを選択し、クラスタ名をクリックするか、アクション 列の 詳細 をクリックします。左側のナビゲーションウィンドウで、 を選択して、ACK KEDA を表示します。
ステップ 2:MongoDB をイベントソースとして追加する
MongoDB をデプロイします。
MongoDB をすでにデプロイしている場合は、このステップをスキップします。
重要データベースはテスト目的でのみ使用されます。本番環境ではデータベースを使用しないでください。
mongoDB.yaml という名前の YAML ファイルを作成し、次のコードをファイルに追加します。
apiVersion: apps/v1 kind: Deployment metadata: name: mongodb spec: replicas: 1 selector: matchLabels: name: mongodb template: metadata: labels: name: mongodb spec: containers: - name: mongodb image: mongo:4.2.1 imagePullPolicy: IfNotPresent ports: - containerPort: 27017 name: mongodb protocol: TCP --- kind: Service apiVersion: v1 metadata: name: mongodb-svc spec: type: ClusterIP ports: - name: mongodb port: 27017 targetPort: 27017 protocol: TCP selector: name: mongodbクラスタの mongodb 名前空間に MongoDB をデプロイします。
kubectl apply -f mongoDB.yaml -n mongodb
MongoDB にログインして、ユーザーアカウントを作成します。
ユーザーを作成します。
# ユーザーを作成する kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.createUser({ user:"test_user",pwd:"test_password",roles:[{ role:"readWrite", db: "test"}]})'MongoDB にログインします。
# 認証を完了する kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.auth("test_user","test_password")'コレクションを作成します。
# コレクションを作成する kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.createCollection("test_collection")'
TriggerAuthentication と ScaledJob をデプロイします。
ACK KEDA は、TriggerAuthentication を使用して、イベントソースへのログインリクエストを認証します。このケースでは、MongoDB がイベントソースとして追加されます。ACK KEDA は、TriggerAuthentication の
secretTargetRefフィールドを使用して、指定されたシークレットから接続情報を取得し、その接続情報を使用して MongDB へのリクエストを認証します。auth.yaml という名前の YAML ファイルを作成し、次のコードをファイルに追加します。
apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: mongodb-trigger spec: secretTargetRef: - parameter: connectionString name: mongodb-secret key: connect --- apiVersion: v1 kind: Secret metadata: name: mongodb-secret type: Opaque data: connect: bW9uZ29kYjovL3Rlc3RfdXNlcjp0ZXN0X3Bhc3N3b3JkQG1vbmdvZGItc3ZjLm1vbmdvZGIuc3ZjLmNsdXN0ZXIubG9jYWw6MjcwMTcvdGVzdA==クラスタの mongodb-test 名前空間に TriggerAuthentication をデプロイします。
kubectl apply -f auth.yaml -n mongodb-test
ScaledJob をデプロイします。
ScaledJob は、ジョブテンプレートを定義し、クエリ対象のデータベースとクエリ式を指定するために使用されます。次の例では、test データベースの test_collection コレクションをクエリし、
{"type":"mp4","state":"waiting"}条件を満たすデータエントリをトランスコードするジョブが作成されます。scaledJob.yaml という名前の YAML ファイルを作成し、次のコードをファイルに追加します。
apiVersion: keda.sh/v1alpha1 kind: ScaledJob metadata: name: mongodb-job spec: jobTargetRef: # ジョブテンプレート template: spec: containers: - name: mongo-update image: registry.cn-hangzhou.aliyuncs.com/carsnow/mongo-update:v6 args: - --connectStr=mongodb://test_user:test_password@mongodb-svc.mongodb.svc.cluster.local:27017/test - --dataBase=test - --collection=test_collection imagePullPolicy: IfNotPresent restartPolicy: Never backoffLimit: 1 pollingInterval: 15 maxReplicaCount: 5 successfulJobsHistoryLimit: 0 failedJobsHistoryLimit: 10 triggers: - type: mongodb metadata: dbName: test # クエリ対象のデータベース collection: test_collection # クエリ対象のコレクション query: '{"type":"mp4","state":"waiting"}' # タイプが mp4 で状態が waiting の各データエントリを処理するジョブを作成します。 queryValue: "1" authenticationRef: name: mongodb-triggerquery:条件を設定します。ACK KEDA が指定された条件を満たすデータエントリを検出すると、ジョブが開始されます。クラスタの mongodb-test 名前空間に ScaledJob をデプロイします。
kubectl apply -f scaledJob.yaml -n mongodb-test
MongoDB に 5 つのデータエントリを挿入します。
# MongoDB に 5 つのデータエントリを挿入する kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.test_collection.insert([ {"type":"mp4","state":"waiting","createTimeStamp":"1610352740","fileName":"My Love","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d8007e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610350740","fileName":"Harker","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d8007e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610152940","fileName":"The World","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d87767e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610390740","fileName":"Mother","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04799d8007e8"}, {"type":"mp4","state":"waiting","createTimeStamp":"1610344740","fileName":"Jagger","endTimeStamp":"","uuid":"1gae72ff-3239-42f5-af97-04711d80099e8"}, ])'
ステップ 3:ACK KEDA が期待どおりに動作するかどうかを確認する
次のコマンドを実行して、ジョブをクエリします。
# ジョブを監視する
watch -n 1 kubectl get job -n mongodb-test
5 つのジョブが作成されていることを確認します。MongoDB にログインして、挿入されたデータを確認します。挿入した各データエントリのステータスが waiting から finished に変わっていることを確認します。