KEDA によるスケーリング

完了

Kubernetes イベント駆動型自動スケーリング

KEDA は、Kubernetes イベント駆動型自動スケーラーの略称です。 これはオープンソースの CNCF ソリューションで、アプリケーションの自動スケーリングを簡略化する軽量コンポーネントです。 KEDA を任意の Kubernetes クラスターに追加し、それを標準の Kubernetes コンポーネント (ポッドの水平オートスケーラー (HPA) やクラスター オートスケーラーなど) と共に使用して、機能を拡張できます。 KEDA を利用すると、特定のアプリをイベント駆動型スケーリングの活用の対象にして、他のアプリでは異なるスケーリング方法を利用するようにできます。 KEDA は、任意の数の Kubernetes アプリケーションまたはフレームワークと共に実行できる、柔軟で安全なオプションです。

主な機能と特徴

  • ゼロへのスケーリング機能を備えた、持続可能でコスト効率の高いアプリケーションを構築する
  • KEDA スケーラーを使い、需要に合わせてアプリケーションのワークロードをスケーリングする
  • ScaledObjects によるアプリケーションの自動スケーリング
  • ScaledJobs によるジョブの自動スケーリング
  • 自動スケーリングと認証をワークロードから切り離して、運用環境グレードのセキュリティを使う
  • 独自の外部スケーラーで、カスタマイズされた自動スケーリング構成を使う

Architecture

KEDA には、次の 2 つの主要コンポーネントが用意されています。

  • KEDA オペレーターを使うと、エンド ユーザーは、Kubernetes の Deployment、Job、StatefulSet や、/scale サブリソースを定義する任意の顧客リソースをサポートする、"ゼロから N 個" のインスタンスにワークロードをスケーリングできます。
  • メトリック サーバーは、Kafka トピック内のメッセージや Azure Event Hubs 内のイベントといった外部メトリックを HPA に公開し、自動スケーリング アクションを駆動します。 アップストリームの制限により、KEDA メトリック サーバーのクラスターにはメトリック アダプターのみインストールされている必要があります。

次の図は、KEDA がどのように Kubernetes HPA、外部イベント ソース、Kubernetes API サーバーと統合して自動スケーリング機能を提供するかを示しています。

A diagram that depicts the KEDA architecture in Kubernetes.

ヒント

詳細については、KEDA の公式ドキュメントを参照してください。

イベント ソースとスケーラー

KEDA スケーラーでは、Deployment をアクティブ化するか非アクティブ化する必要があるかを検出することも、特定のイベント ソースのカスタム メトリックをフィードすることもできます。 Deployment と StatefulSet は、KEDA を使用してワークロードをスケーリングする最も一般的な方法です。 また、/scale サブリソースを実装するカスタム リソースをスケーリングすることも可能です。 これにより、KEDA でスケール トリガーに基づいてスケーリングする Kubernetes Deployment または StatefulSet を定義できます。 KEDA はこれらのサービスを監視し、発生したイベントに基づいて自動的にスケーリングします。

KEDA はバックグラウンドでイベント ソースを監視し、そのデータを Kubernetes と HPA にフィードして、リソースのスケーリングを迅速に実行します。 リソースの各レプリカでは、イベント ソースから項目をアクティブにプルします。 KEDA と Deployments/StatefulSets を使用すると、イベント ソースとの豊富な接続と処理セマンティクスを維持しながら、イベントに基づいてスケーリングできます (たとえば、順序付けされた処理、再試行、配信不能、チェックポイント処理)。

スケーリングされたオブジェクトの仕様

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: {scaled-object-name}
spec:
  scaleTargetRef:
    apiVersion:    {api-version-of-target-resource}  # Optional. Default: apps/v1
    kind:          {kind-of-target-resource}         # Optional. Default: Deployment
    name:          {name-of-target-resource}         # Mandatory. Must be in the same namespace as the ScaledObject
    envSourceContainerName: {container-name}         # Optional. Default: .spec.template.spec.containers[0]
  pollingInterval: 30                                # Optional. Default: 30 seconds
  cooldownPeriod:  300                               # Optional. Default: 300 seconds
  minReplicaCount: 0                                 # Optional. Default: 0
  maxReplicaCount: 100                               # Optional. Default: 100
  advanced:                                          # Optional. Section to specify advanced options
    restoreToOriginalReplicaCount: true/false        # Optional. Default: false
    horizontalPodAutoscalerConfig:                   # Optional. Section to specify HPA related options
      behavior:                                      # Optional. Use to modify HPA's scaling behavior
        scaleDown:
          stabilizationWindowSeconds: 300
          policies:
          - type: Percent
            value: 100
            periodSeconds: 15
  triggers:
  # {list of triggers to activate scaling of the target resource}

スケーリングされたジョブの仕様

イベント駆動型コードを Deployment としてスケーリングする代替方法として、Kubernetes ジョブとしてコードを実行およびスケーリングすることもできます。 このオプションを検討する主な理由は、長時間の実行を処理する必要がある場合です。 Deployment 内で複数のイベントを処理するのではなく、検出されたイベントごとに独自の Kubernetes ジョブをスケジュールします。 この方法によって、各イベントを別個に処理し、キュー内のイベント数に基づいて同時実行する数をスケーリングできます。

apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
  name: {scaled-job-name}
spec:
  jobTargetRef:
    parallelism: 1                            # [max number of desired pods](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#controlling-parallelism)
    completions: 1                            # [desired number of successfully finished pods](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#controlling-parallelism)
    activeDeadlineSeconds: 600                #  Specifies the duration in seconds relative to the startTime that the job may be active before the system tries to terminate it; value must be positive integer
    backoffLimit: 6                           # Specifies the number of retries before marking this job failed. Defaults to 6
    template:
      # describes the [job template](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/)
  pollingInterval: 30                         # Optional. Default: 30 seconds
  successfulJobsHistoryLimit: 5               # Optional. Default: 100. How many completed jobs should be kept.
  failedJobsHistoryLimit: 5                   # Optional. Default: 100. How many failed jobs should be kept.
  envSourceContainerName: {container-name}    # Optional. Default: .spec.JobTargetRef.template.spec.containers[0]
  maxReplicaCount: 100                        # Optional. Default: 100
  scalingStrategy:
    strategy: "custom"                        # Optional. Default: default. Which Scaling Strategy to use. 
    customScalingQueueLengthDeduction: 1      # Optional. A parameter to optimize custom ScalingStrategy.
    customScalingRunningJobPercentage: "0.5"  # Optional. A parameter to optimize custom ScalingStrategy.
  triggers:
  # {list of triggers to create jobs}

自分の知識をチェックする

1.

Kubernetes 内で KEDA が果たす主な役割は何ですか?

2.

KEDA でスケーリングできるワークロードの種類は何ですか?

3.

スケーリングされたジョブを使用する主な理由は何ですか?