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

Container Service for Kubernetes:ACKケダ

最終更新日:Dec 13, 2024

Container Service for Kubernetes (ACK) は、Kubernetesベースのイベント駆動オートスケーリング (KEDA) をサポートしています。 ACKコンソールにKEDAをインストールして、クラスターのイベント駆動型スケーリングを実装できます。 このトピックでは、KEDAとは何か、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キュー」をご参照ください。

  • ジョブの同時実行性を制御する

    多数のジョブが送信されると、システムはリソース、クォータ、および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コンソールの左側のナビゲーションウィンドウで、[Marketplace] > [Marketplace] を選択します。

  3. Marketplaceページで、ack-kedaをクリックします。

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

    左側のナビゲーションペインで、[クラスター] をクリックします。 クラスターリスト ページで、ACK KEDAがデプロイされているクラスターを選択し、クラスター名をクリックするか、アクション 列の 詳細 をクリックします。 左側のナビゲーションウィンドウで、[アプリケーション] > [ヘルム] を選択して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. ユーザーを作成します。

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

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

      # Create a collection
      kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval  'db.createCollection("test_collection")'
  3. TriggerAuthenticationとScaledJobをデプロイします。

    ACK KEDAはTriggerAuthenticationを使用して、イベントソースへのログオン要求を認証します。 この場合、イベントソースとしてMongoDBが追加されます。 ACK KEDAは、TriggerAuthenticationのsecretTargetRefフィールドを使用して指定されたSecretから接続情報を取得し、その接続情報を使用して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. TriggerAuthenticationをクラスターのmongodb-test名前空間にデプロイします。

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

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

    1. scaledJob. YAMLという名前のyamlファイルを作成し、次のコードをファイルに追加します。

      apiVersion: keda.sh/v1alpha1
      kind: ScaledJob
      metadata:
        name: mongodb-job
      spec:
        jobTargetRef:
          # Job template
          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                               # The database to be queried.
              collection: test_collection                # The collection to be queried.
              query: '{"type":"mp4","state":"waiting"}'  # Create a job to process each data entry whose type is mp4 and state is waiting.
              queryValue: "1"
            authenticationRef:
              name: mongodb-trigger

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

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

      kubectl apply -f scaledJob.yaml -n mongodb-test
  5. MongoDBに5つのデータエントリを挿入します。

    # Insert five data entries to MongoDB
    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 job
watch -n 1 kubectl get job -n mongodb-test

Job

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

関連ドキュメント