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

Container Compute Service:AHPA のデプロイと使用によるリソース需要の予測

最終更新日:Dec 27, 2024

Alibaba Cloud Container Service for Kubernetes (ACK) は、Advanced Horizontal Pod Autoscaler (AHPA) をサポートしています。AHPA は、履歴データの学習と分析によって将来のリソース需要を予測し、Pod レプリカの数を動的に調整します。AHPA は、予測される需要のピークに先立ち、Pod をスケールアウトし、リソースをプリフェッチします。これにより、ビジネスの応答速度と安定性が向上します。逆に、AHPA は、予測される需要の落ち込みに先立ち、リソースをスケールダウンしてリソースコストを節約します。

背景情報

AHPA コントローラーがアプリケーションの履歴メトリックデータを収集するために、Managed Service for Prometheus を有効にすることができます。AHPA コントローラーは、収集されたデータに基づいてスケーリングの決定を行います。AHPA コントローラーは、機械学習アルゴリズムを使用して、今後 24 時間以内にビジネスで必要となる可能性のある Pod の数を予測します。AHPA コントローラーは、ワークロードが動的に変化するシナリオに適しています。AHPA コントローラーは、プロアクティブおよびパッシブな予測ポリシーを提供し、タイムリーな Pod スケーリングとリソースのプリフェッチを保証することで、ビジネスがトラフィックの急増に耐えられるようにします。これにより、ビジネスの応答速度、パフォーマンス、安定性が向上し、リソースコストの削減にも役立ちます。詳細については、AHPA の概要を参照してください。

前提条件

ステップ 1: AHPA コントローラーをインストールする

  1. ACK コンソールにログインします。左側のナビゲーションペインで、クラスタをクリックします。

  2. クラスタページで、管理するクラスタを見つけ、その ID をクリックします。クラスタ詳細ページの左側のナビゲーションペインで、操作 > アドオンを選択します。

  3. アドオンページで、その他タブをクリックします。AHPA コントローラーを見つけて、インストールをクリックします。次に、画面の指示に従って AHPA コントローラーをインストールします。

ステップ 2: AHPA のデータソースとして Prometheus を追加する

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

  2. 左側のナビゲーションペインで、Managed Service for Prometheus > インスタンスを選択します。

  3. インスタンスページの上部で、Prometheus インスタンスがデプロイされているリージョンを選択します。ACK クラスタにちなんで名付けられた Prometheus インスタンスを選択します。汎用が、Prometheus インスタンスのインスタンスタイプ列に表示されます。[アクション] 列の設定をクリックします。HTTP API URL (grafana 読み取り URL)セクションで、以下の情報を記録します。

    • アクセストークンが有効になっている場合は、クラスタのアクセストークンを設定する必要があります。

    • 内部エンドポイントを表示して記録します。

  4. クラスタ設定で Prometheus インスタンスのエンドポイントを指定します。

    1. application-intelligence.yaml という名前のファイルを作成し、以下の内容をファイルにコピーします。

      • prometheusUrl: Prometheus インスタンスのエンドポイント。

      • token: Prometheus インスタンスのアクセストークン。

      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: application-intelligence
        namespace: kube-system
      data:
        prometheusUrl: "http://cn-hangzhou-intranet.arms.aliyuncs.com:9443/api/v1/prometheus/da9d7dece901db4c9fc7f5b9c40****/158120454317****/cc6df477a982145d986e3f79c985a****/cn-hangzhou"
        token: "eyJhxxxxx"
      説明

      AHPA ダッシュボードに表示される Prometheus メトリックを表示する場合は、Configmap に以下のパラメータを設定します。

      • prometheus_writer_url: Prometheus インスタンスの内部リモート書き込みエンドポイントを指定します。

      • prometheus_writer_ak: Alibaba Cloud アカウントの AccessKey ID を指定します。

      • prometheus_writer_sk: Alibaba Cloud アカウントの AccessKey シークレットを指定します。

    2. 以下のコマンドを実行して、application-intelligence ConfigMap を作成します。

      kubectl apply -f application-intelligence.yaml
  5. AHPA を監視するように Managed Service for Prometheus を設定します。

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

    2. 左側のナビゲーションペインで、Managed Service for Prometheus > インスタンスを選択します。

    3. 上部のナビゲーションバーで、他のコンポーネントを統合をクリックして、統合センターページに移動します。検索ボックスにAHPAと入力し、検索アイコンをクリックします。表示されたら、AHPA カードをクリックします。

    4. AHPA を監視するように Managed Service for Prometheus を設定します。

      1. ACK AHPA ページで、Kubernetes クラスターの選択 > クラスターの選択 を選択します。ドロップダウン リストから ACS クラスターを選択します。

      2. 以下の表に基づいて、設定情報セクションのパラメータを設定します。OKをクリックします。

        パラメータ

        説明

        エクスポーター名

        名前は、AHPA から監視データを収集するために使用されるエクスポーター間で一意である必要があります。

        メトリック収集間隔 (秒)

        サービスが監視データを収集する間隔。

    5. 統合ステータスチェックステップが完了したら、統合管理をクリックします。表示されるページで、AHPA に対して Managed Service for Prometheus が有効になっていることを確認できます。

ステップ 3: テストサービスをデプロイする

fib-deploymentという名前の Deployment とfib-svcという名前の Service で構成されるテストサービスをデプロイします。トラフィックの変動をシミュレートするためにテストサービスにリクエストを送信するために使用されるfib-loaderという名前のアプリケーションをデプロイします。次に、Horizontal Pod Autoscaler (HPA) をデプロイして、テストサービスをスケーリングします。このようにして、HPA スケーリング結果と AHPA 予測結果を比較できます。

  1. demo.yaml という名前のファイルを作成し、以下の内容をファイルにコピーします。

    YAML ファイルの内容を表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: fib-deployment
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: fib-deployment
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: fib-deployment
        spec:
          containers:
          - image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-server:20200820-171837
            imagePullPolicy: IfNotPresent
            name: user-container
            ports:
            - containerPort: 8080
              name: user-port
              protocol: TCP
            resources:
              limits:
                cpu: "1"
                memory: 2000Mi
              requests:
                cpu: "1"
                memory: 2000Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: fib-svc
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: fib-deployment
      sessionAffinity: None
      type: ClusterIP
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: fib-loader
      namespace: default
    spec:
      progressDeadlineSeconds: 600
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: fib-loader
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: fib-loader
        spec:
          containers:
          - args:
            - -c
            - |
              /ko-app/fib-loader --service-url="http://fib-svc.${NAMESPACE}?size=35&interval=0" --save-path=/tmp/fib-loader-chart.html
            command:
            - sh
            env:
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
            image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-loader:20201126-110434
            imagePullPolicy: IfNotPresent
            name: loader
            ports:
            - containerPort: 8090
              name: chart
              protocol: TCP
            resources:
              limits:
                cpu: "8"
                memory: 16000Mi
              requests:
                cpu: "2"
                memory: 4000Mi
    ---
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: fib-hpa
      namespace: default
    spec:
      maxReplicas: 50
      minReplicas: 1
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: fib-deployment
      targetCPUUtilizationPercentage: 50
    ---
  2. 以下のコマンドを実行して、テストサービスをデプロイします。

    kubectl apply -f demo.yaml

ステップ 4: 宣言的な方法で AHPA ポリシーを作成する

AHPA ポリシーを設定するには、以下の手順を実行します。

  1. ahpa-demo.yaml という名前のファイルを作成し、以下の内容をファイルにコピーします。

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: AdvancedHorizontalPodAutoscaler
    metadata:
      name: ahpa-demo
    spec:
      scaleStrategy: observer
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 40
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: fib-deployment 
      maxReplicas: 100
      minReplicas: 2
      stabilizationWindowSeconds: 300
      prediction:
        quantile: 95
        scaleUpForward: 180
      instanceBounds:
      - startTime: "2021-12-16 00:00:00"
        endTime: "2031-12-16 00:00:00"
        bounds:
        - cron: "* 0-8 ?  * MON-FRI"
          maxReplicas: 15
          minReplicas: 4
        - cron: "* 9-15 ?  * MON-FRI"
          maxReplicas: 15
          minReplicas: 10
        - cron: "* 16-23 ?  * MON-FRI"
          maxReplicas: 20
          minReplicas: 15

    次の表は、上記のコードブロックで指定されているパラメータの一部について説明しています。

    パラメータ

    必須

    説明

    scaleTargetRef

    はい

    管理する Deployment。

    metrics

    はい

    AHPA ポリシーが実装される基準となるメトリック。CPU、GPU、メモリ、1 秒あたりのクエリ数 (QPS)、応答時間 (RT) などのメトリックがサポートされています。

    target

    はい

    スケーリングのしきい値。averageUtilization: 40 を指定した場合、CPU 使用率のスケーリングのしきい値は 40% です。

    scaleStrategy

    いいえ

    AHPA のスケーリングモード。デフォルト値: observer。有効な値:

    • auto: AHPA は自動的にスケーリングアクティビティを実行します。

    • observer: AHPA はリソースの使用状況を観察し、スケーリングアクティビティを実行しません。オブザーバーモードを使用して、AHPA が期待どおりに動作するかどうかを確認できます。

    • scalingUpOnly: AHPA はスケールアウト操作のみを実行し、スケールイン操作は実行しません。

    • proactive: アクティブな予測のみが有効になります。

    • reactive: パッシブな予測のみが有効になります。

    maxReplicas

    はい

    アプリケーションにプロビジョニングできるレプリケートされた Pod の最大数。

    minReplicas

    はい

    アプリケーションで実行する必要があるレプリケートされた Pod の最小数。

    stabilizationWindowSeconds

    いいえ

    スケールインアクティビティのクールダウン期間。デフォルト値: 300。単位: 秒。

    prediction.quantile

    はい

    実際のメトリック値がスケーリングのしきい値に達しない確率を示す分位数。値が大きいほど、確率が高くなります。有効な値: 0 から 1。デフォルト値: 0.99。値は小数点以下 2 桁まで正確です。パラメータを 0.90 から 0.99 の値に設定することをお勧めします。

    prediction.scaleUpForward

    はい

    コールドスタートの期間。この値は、Pod が作成された時点から Pod が Ready 状態になるまでの期間を表します。

    instanceBounds

    いいえ

    Pod の数が、AHPA によって定義された Pod の最大数と最小数によって制限される期間。

    • startTime: スケーリング操作の開始時刻。

    • endTime: スケーリング操作の終了時刻。

    instanceBounds.bounds.cron

    いいえ

    このパラメータは、スケジュールされたスケーリングジョブを作成するために使用されます。cron 式は、スペースで区切られた 5 つのフィールドで構成されます。たとえば、cron 式 - cron: "* 0-8 ? * MON-FRI" は、毎月月曜日から金曜日の 00:00:00 から 08:00:00 までの期間を指定します。

    次の表は、cron 式に含まれるフィールドについて説明しています。詳細については、Cron 式を参照してください。

    フィールド

    必須

    有効な値

    有効な特殊文字

    はい

    0~59

    * / , -

    はい

    0~23

    * / , -

    はい

    1~31

    * / , – ?

    はい

    1 から 12 または JAN から DEC

    * / , -

    曜日

    いいえ

    0 から 6 または SUN から SAT

    * / , – ?

    説明
    • 月と曜日のフィールドでは、大文字と小文字は区別されません。たとえば、SUNSun、または sun を指定できます。

    • 曜日フィールドのデフォルト値は * です。

    • 以下は、特殊文字の説明です。

      • *: 任意の値を指定します。

      • /: 増分を指定します。

      • ,: 値のリストを区切ります。

      • -: 範囲を指定します。

      • ?: プレースホルダーを指定します。

  2. 以下のコマンドを実行して、AHPA ポリシーを適用します。

    kubectl apply -f ahpa-demo.yaml

ステップ 5: 予測結果を表示する

統合管理ページで、コンテナサービスタブのクラスタの名前をクリックします。アドオンタイプセクションでACK AHPAを選択します。ダッシュボードタブをクリックします。次に、ahpa-dashboardをクリックします。表示されるページで、AHPA ダッシュボードのデータを表示できます。

AHPA ダッシュボードに表示されるサービスメトリックには、CPU 使用率、現在の Pod 数、予測される Pod 数が表示されます。

  • CPU 使用率と実際の PODチャートには、Deployment の平均 CPU 使用率と現在の Pod 数が表示されます。

  • 実際の CPU 使用率と予測される CPU 使用率チャートには、Deployment 内の Pod の CPU 使用率と予測される CPU 使用率が表示されます。予測される CPU 使用率が現在の CPU 使用率よりも高い場合、AHPA によって予測された CPU 容量はアプリケーションを実行するのに十分です。

  • Pod のトレンドセクションでは、現在の Pod 数、推奨される Pod 数、プロアクティブに予測される Pod 数を表示できます。

    • 現在の Pod 数: 実行中の Pod の数。

    • 推奨される Pod 数: AHPA によってアプリケーションに推奨される Pod の数。この値は、プロアクティブな予測の結果、パッシブな予測の結果、および現在の期間内の Pod の最大数と最小数に基づいて生成されます。

    • プロアクティブに予測される Pod 数: 履歴メトリックデータとワークロード変動のパターンに基づいて AHPA によってプロアクティブに予測される Pod の数。

説明

AHPA の予測結果は、過去 7 日間の履歴データに基づいて生成されます。したがって、AHPA ポリシーを適用してから 7 日間待つ必要があります。AHPA ポリシーを既存のアプリケーションに適用するには、AHPA ダッシュボードでアプリケーションの実行に使用される Deployment を選択します。

この例では、AHPA ポリシーはobserverスケーリングモードを使用しています。次の図は、AHPA 予測結果と HPA スケーリング結果を比較したものです。比較結果を使用して、AHPA 予測結果が期待どおりかどうかを確認できます。

次の図は、AHPA 予測結果と HPA スケーリング結果を比較したものです。

image.png

この図は、以下の情報を提供します。

  • 実際の CPU 使用率と予測される CPU 使用率: HPA に基づく実際の CPU 使用率は緑色の線で表されます。AHPA によって予測される CPU 使用率は黄色の線で表されます。

    • 上の図は、予測される CPU 使用率が実際の CPU 使用率よりも高いことを示しています。これは、予測された CPU 容量が十分であることを示しています。

    • 上の図は、予測される CPU 使用率が特定の値に実際の CPU 使用率よりも早く達することを示しています。これは、必要なリソースが事前に準備されていることを示しています。

  • Pod のトレンド: HPA によって実際にプロビジョニングされた Pod の数は緑色の線で表されます。AHPA によって予測される Pod の数は黄色の線で表されます。

    • 上の図は、黄色の線で表される値が緑色の線で表される値よりも小さいことを示しています。これは、予測される Pod 数が実際の Pod 数よりも少ないことを示しています。

    • 上の図は、黄色の曲線が緑色の曲線よりも滑らかであることを示しています。これは、AHPA スケーリングサービスを使用することで Pod 数の変化が緩やかになり、ビジネスの安定性が向上することを示しています。

結果は、AHPA が予測スケーリングを使用して変動するワークロードを期待どおりに処理できることを示しています。予測結果を確認した後、AHPA ポリシーの scaleStrategy パラメータを auto に設定して、AHPA が Pod を自動的にスケーリングできるようにすることができます。

AHPA の主要メトリック

メトリック

説明

ahpa_proactive_pods

プロアクティブに予測される Pod 数。

ahpa_reactive_pods

パッシブに予測される Pod 数。

ahpa_requested_pods

推奨される Pod 数。

ahpa_max_pods

Pod の最大数。

ahpa_min_pods

Pod の最小数。

ahpa_target_metric

スケーリングのしきい値。