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のデプロイ
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にログインし、ユーザーアカウントを作成します。
ユーザーを作成します。
# Create a user kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.createUser({ user:"test_user",pwd:"test_password",roles:[{ role:"readWrite", db: "test"}]})'
MongoDBにログインします。
# Complete authentication kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.auth("test_user","test_password")'
コレクションを作成します。
# Create a collection kubectl exec -n mongodb mongodb-xxxxx -- mongo --eval 'db.createCollection("test_collection")'
TriggerAuthenticationとScaledJobをデプロイします。
ACK KEDAはTriggerAuthenticationを使用して、イベントソースへのログオン要求を認証します。 この場合、イベントソースとしてMongoDBが追加されます。 ACK KEDAは、TriggerAuthenticationの
secretTargetRef
フィールドを使用して指定されたSecretから接続情報を取得し、その接続情報を使用して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==
TriggerAuthenticationをクラスターのmongodb-test名前空間にデプロイします。
kubectl apply -f auth.yaml -n mongodb-test
ScaledJobをデプロイします。
ScaledJobは、ジョブテンプレートを定義し、クエリするデータベースとクエリ式を指定するために使用されます。 次の例では、テストデータベースのtest_collectionコレクションを照会し、
{"type":"mp4" 、"state":"waiting"}
の条件を満たすデータエントリをトランスコードするジョブが作成されます。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が検出すると、ジョブが開始されます。ScaledJobをクラスターのmongodb-test名前空間にデプロイします。
kubectl apply -f scaledJob.yaml -n mongodb-test
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
5つのジョブが作成されたことを確認します。 MongoDBにログインし、挿入されたデータを確認します。 挿入した各データエントリのステータスが待機中
から終了
に変わることを確認します。