すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:イベント駆動型自動スケーリング

最終更新日:Apr 16, 2025

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 をデプロイする

  1. ACK コンソール にログインします。

  2. ACK コンソールの左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。

  3. Marketplace ページで、[ack-keda] を見つけてクリックします。

  4. [ack-keda] ページの右上隅にある デプロイ をクリックします。[基本情報] ステップで、クラスタを選択し、次へ をクリックします。

  5. [パラメーター] ステップで、チャートバージョンを選択し、OK をクリックします。

    左側のナビゲーションウィンドウで、[クラスタ] をクリックします。クラスターリスト ページで、ACK KEDA がデプロイされているクラスタを選択し、クラスタ名をクリックするか、アクション 列の 詳細 をクリックします。左側のナビゲーションウィンドウで、[アプリケーション] > [Helm] を選択して、ACK KEDA を表示します。

ステップ 2:MongoDB をイベントソースとして追加する

  1. MongoDB をデプロイします。

    MongoDB をすでにデプロイしている場合は、このステップをスキップします。

    重要

    データベースはテスト目的でのみ使用されます。本番環境ではデータベースを使用しないでください。

    1. 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
    2. クラスタの mongodb 名前空間に MongoDB をデプロイします。

       kubectl apply -f mongoDB.yaml -n mongodb
  2. MongoDB にログインして、ユーザーアカウントを作成します。

    1. ユーザーを作成します。

      # ユーザーを作成する
      kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.createUser({ user:"test_user",pwd:"test_password",roles:[{ role:"readWrite", db: "test"}]})'
    2. MongoDB にログインします。

      # 認証を完了する
      kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval  'db.auth("test_user","test_password")'
    3. コレクションを作成します。

      # コレクションを作成する
      kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval  'db.createCollection("test_collection")'
  3. TriggerAuthentication と ScaledJob をデプロイします。

    ACK KEDA は、TriggerAuthentication を使用して、イベントソースへのログインリクエストを認証します。このケースでは、MongoDB がイベントソースとして追加されます。ACK KEDA は、TriggerAuthentication の secretTargetRef フィールドを使用して、指定されたシークレットから接続情報を取得し、その接続情報を使用して MongDB へのリクエストを認証します。

    1. 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==
    2. クラスタの mongodb-test 名前空間に TriggerAuthentication をデプロイします。

      kubectl apply -f auth.yaml -n mongodb-test
  4. ScaledJob をデプロイします。

    ScaledJob は、ジョブテンプレートを定義し、クエリ対象のデータベースとクエリ式を指定するために使用されます。次の例では、test データベースの test_collection コレクションをクエリし、{"type":"mp4","state":"waiting"} 条件を満たすデータエントリをトランスコードするジョブが作成されます。

    1. 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-trigger

      query:条件を設定します。ACK KEDA が指定された条件を満たすデータエントリを検出すると、ジョブが開始されます。

    2. クラスタの mongodb-test 名前空間に ScaledJob をデプロイします。

      kubectl apply -f scaledJob.yaml -n mongodb-test
  5. 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

Job

5 つのジョブが作成されていることを確認します。MongoDB にログインして、挿入されたデータを確認します。挿入した各データエントリのステータスが waiting から finished に変わっていることを確認します。数据库

関連情報