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

Container Service for Kubernetes:Alibaba Cloudメトリクスに基づく水平自動スケーリングの実装

最終更新日:Nov 14, 2024

このトピックでは、Alibaba Cloudの環境でアプリケーションの水平自動スケーリングを実装するために、Kubernetesでサポートされている外部メトリック (HTTPリクエストレートやQPS (Ingress queries per second) など) を設定する方法について説明します。

前提条件

Container Service for Kubernetes (ACK) クラスターが作成されました。 詳細については、「ACKマネージドクラスターの作成」「ACK専用クラスターの作成」、および「ACKサーバーレスクラスターの作成」をご参照ください。

alibaba-cloud-metrics-adapterのデプロイ

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

  2. クラスターページで、管理するクラスターの名前をクリックし、左側のナビゲーションウィンドウのアプリケーション > ヘルムを選択します。

  3. [Helm] ページで、[デプロイ] をクリックします。 [基本情報] ステップで、次の表に基づいてパラメーターを設定します。

    パラメーター

    アプリケーション名

    ack-alibaba-cloud-metrics-adapter

    名前空間

    kube-system

    ソース

    デフォルト値: Marketplace

    チャート

    • Use Scenariosパラメータに [すべて] を選択します。

    • サポートされるアーキテクチャパラメーターにamd64を選択します。

    • 検索ボックス:ack-alibaba-cloud-metrics-adapter.

    [ack-alibaba-cloud-metrics-adapter] を選択し、[次へ] をクリックします。

  4. [パラメーター] ステップで、[グラフバージョン] パラメーターを設定し、[OK] をクリックします。

HPAの例

次の例は、両方ともNginxという名前のデプロイメントとサービスを作成してHPAを設定する方法を示しています。

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

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[ワークロード] > [デプロイ] を選択します。

  3. [デプロイメント] ページで、右上隅の [YAMLから作成] をクリックします。

  4. サンプルテンプレート[カスタム] に設定します。 次のYAMLテンプレートを使用して、デプロイとClusterIPサービスを作成します。 次に、作成 をクリックします。

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9 
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      ports:
        - port: 80
          protocol: TCP
          targetPort: 80
      selector:
        app: nginx
      type: ClusterIP
  5. 左側のナビゲーションウィンドウで、[ネットワーク] > [Ingress] を選択します。 [Ingress] ページで、右上隅の [Ingressの作成] をクリックします。

  6. [Ingressの作成] ダイアログボックスでパラメーターを設定し、[OK] をクリックします。 Ingressの作成後、Ingressページが表示されます。

  7. [名前] 列で、新しく作成したIngressの名前を見つけてクリックし、Ingressに関する情報を表示します。

  8. HPAを設定します。

    1. 左上隅の返回アイコンをクリックして、[クラスター] ページに戻ります。

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

    3. [テンプレート] ページで、右上隅の [作成] をクリックします。

    4. [作成] ダイアログボックスでテンプレートを設定し、[保存] をクリックします。

      • 名前: テンプレートの名前を入力します。 この例では、HPAが使用される。

      • 説明: テンプレートの説明を入力します。 このパラメーターはオプションです。

      • テンプレート: KubernetesのYAML構文に準拠したオーケストレーションテンプレートを設定します。 詳細については、次のテンプレートをご参照ください。

      apiVersion: autoscaling/v2
      kind: HorizontalPodAutoscaler
      metadata:
        name: ingress-hpa
      spec:
        scaleTargetRef:
          apiVersion: apps/v1
          kind: Deployment
          name: nginx-deployment-basic
        minReplicas: 2
        maxReplicas: 10
        metrics:
          - type: External
            external:
              metric:
                name: sls_ingress_qps
                selector:
                  matchLabels:
                    sls.project: "***" # Specify the Simple Log Service project that you want to use. 
                    sls.logstore: "nginx-ingress"
                    sls.ingress.route: "default-nginx-80"
              target:
                type: AverageValue
                averageValue: 10
          - type: External
            external:
              metric:
                name: sls_ingress_latency_p9999
                selector:
                  matchLabels:
                    # default ingress log project is k8s-log-clusterId
                    sls.project: "***" 
                    # default ingress logstre is nginx-ingress
                    sls.logstore: "nginx-ingress"
                    # namespace-svc-port
                    sls.ingress.route: "default-nginx-80"
                    # sls vpc endpoint, default true
                    # sls.internal.endpoint:true
              target:
                type: Value
                # sls_ingress_latency_p9999 > 10ms
                value: 10

      次の表に、HPAの設定に使用されるパラメーターを示します。

      パラメーター

      説明

      sls.ingress.route

      <namespace>-<svc>-<port> 形式で値を設定します。 例: default-nginx-80 This parameter is required.

      説明

      <namespace> は、Ingressが属する名前空間を指定します。 <svc> は、Ingressの作成時に選択したサービスの名前を指定します。 <port> は、サービスのポートを指定します。

      sls.logstore

      Simple Log ServiceのLogstoreの名前。 This parameter is required. sls.logstoreのデフォルト値はnginx-ingressです。

      sls.project

      Simple Log Serviceプロジェクトの名前。 This parameter is required. sls.projectのデフォルト値はk8s-log-cluster IDです。

      sls.internal.endpoint

      内部ネットワーク経由でSimple Log Serviceにアクセスするかどうかを指定します。 デフォルト値: true。 値をtrueに設定すると、内部ネットワーク経由でSimple Log Serviceにアクセスできます。 値をfalseに設定すると、インターネット経由でSimple Log Serviceにアクセスできます。

      説明

      この例では、HPAはsls_ingress_qpsおよびsls_ingress_latency_p9999メトリックに基づいてスケーリングアクティビティをトリガーします。 ターゲットセクションでは、各メトリックのタイプ値が異なります。

      • sls_ingress_qpsメトリックのタイプ値はAverageValueに設定されています。 これは、メトリック値が合計QPSをポッドの数で割った結果であることを示しています。

      • sls_ingress_latency_p9999メトリックのタイプ値はvalueに設定されています。 これは、レイテンシがポッドの数で除算されないことを示します。

      2つのタイプ値は、HPA設定で一般的に使用されます。

    5. [テンプレート] ページで、[HPA] を選択し、[アプリケーションの作成] をクリックします。

    6. HPAページで、[作成] をクリックします。

  9. HPAを設定したら、次のスクリプトを実行してストレステストを実行します。

    #!/bin/bash
    ##Use Apache Benchmark to send requests to the Service exposed by the Ingress. The test lasts 300 seconds and 10 concurrent requests are sent per second. 
    ab -t 300 -c 10 <The domain name of the Ingress>
  10. HPAが期待どおりに機能するかどうかを確認します。

    1. ACK コンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。 [クラスター] ページで、管理するクラスターを見つけ、[操作] 列の [詳細] > [クラウドシェルを開く] を選択します。

    2. 次のコマンドを実行して、HPAのステータスを確認します。

      kubectl get hpa ingress-hpa

      期待される結果

      NAME            REFERENCE                              TARGETS           MINPODS    MAXPODS    REPLICAPS   AGE
      ingress-hpa     Depolyment/nginx-deployment-basic      21/10 (avg)       2          10         10          7m49s

      REPLICASの値がMAXPODSの値と同じ場合、HPAが期待どおりにアプリケーションをスケールアウトしたことを示します。

CLIを使用してデータを照会する

次のコマンドを実行してデータを照会します。 この例では、sls_ingress_qpsメトリックが照会されます。

kubectl get --raw  /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress

{{SLS_Project}} は、ACKクラスターで使用されるSimple Log Serviceプロジェクトの名前です。 ACKクラスターで使用されるSimple Log Serviceプロジェクトのデフォルト名はk8s-log-{{ClusterId}} です。 {{ClusterId}} はクラスターのIDです。

期待される出力:

Error from server: {
    "httpCode": 400,
    "errorCode": "ParameterInvalid",
    "errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is  in your log,please wrap : with quotation mark \"",
    "requestID": "xxxxxxx"
}

前の出力が返された場合、メトリックは無効です。 ALB Ingressが作成されていないため、sls_alb_ingress_qpsメトリックのデータは返されません。

よくある質問

  • kubectl get hpaコマンドを実行した後、TARGETS列に <unknow> が表示された場合はどうすればよいですか?

    問題をトラブルシューティングするには、次の操作を実行します。

    1. kubectl describe hpa <hpa_name> コマンドを実行して、HPAが正常に機能しない理由を確認します。

      • [条件] フィールドのAbleToScaleの値がFalseの場合、デプロイが通常どおり作成されているかどうかを確認します。

      • ConditionsフィールドのScalingActiveの値がFalseの場合は、次の手順に進みます。

    2. kubectl get -- raw "/apis/external.metrics.k8s.io/v1beta1/" コマンドを実行します。 Error from server (NotFound): サーバーが要求されたリソースを見つけることができませんでしたが返された場合、alibaba-cloud-metrics-adapterのステータスを確認します。

      alibaba-cloud-metrics-adapterのステータスが正常な場合は、HPAメトリクスがIngressに関連しているかどうかを確認します。 メトリクスがIngressに関連している場合は、ack-alibaba-cloud-metrics-adapterをデプロイする前に、Simple Log Serviceコンポーネントを必ずデプロイしてください。 詳細については、「nginx-ingressのアクセスログの分析と監視」をご参照ください。

    3. HPAメトリックの値が有効であることを確認してください。 sls.ingress.routeの値は、<namespace>-<svc>-<port> 形式である必要があります。

      • namespaceは、Ingressが属する名前空間を指定します。

      • svcは、Ingressの作成時に選択したサービスの名前を指定します。

      • portは、サービスのポートを指定します。

  • HPAでサポートされているメトリックはどこにありますか?

    HPAでサポートされているメトリクスの詳細については、「Alibaba Cloudメトリクスアダプター」をご参照ください。 次の表に、一般的に使用されるメトリックを示します。

    メトリック名

    説明

    追加パラメーター

    sls_ingress_qps

    特定のルーティングルールに基づいて、Ingressが1秒あたりに処理できるリクエストの数。

    sls.ingress.route

    sls_alb_ingress_qps

    ALB Ingressが特定のルーティングルールに基づいて1秒あたりに処理できる要求の数。

    sls.ingress.route

    sls_ingress_latency_avg

    すべてのリクエストの平均レイテンシ。

    sls.ingress.route

    sls_ingress_latency_p50

    すべてのリクエストの最速50% の最大レイテンシ。

    sls.ingress.route

    sls_ingress_latency_p95

    すべてのリクエストの最速95% の最大レイテンシ。

    sls.ingress.route

    sls_ingress_latency_p99

    すべてのリクエストの最速99% の最大レイテンシ。

    sls.ingress.route

    sls_ingress_latency_p9999

    すべてのリクエストの最速99.99% の最大レイテンシ。

    sls.ingress.route

    sls_ingress_inflow

    Ingressのインバウンド帯域幅。

    sls.ingress.route

  • NGINX Ingressログをカスタム形式で収集するにはどうすればよいですか?

    このトピックでは、Simple Log Serviceによって収集されたIngressメトリックに基づいて、水平ポッドの自動スケーリングが実行されます。 NGINX Ingressログを収集するには、Simple Log Serviceを設定する必要があります。

    • ACKクラスターを作成すると、デフォルトでクラスターに対してSimple Log Serviceが有効になります。 デフォルトのログ収集設定を使用すると、クラスターの作成後にSimple log ServiceコンソールでNGINX Ingressのログ分析レポートとリアルタイムのステータスを表示できます。

    • ACKクラスターの作成時にSimple Log Serviceを無効にした場合、Simple Log Serviceによって収集されたIngressメトリックに基づいて水平ポッドの自動スケーリングを実行できません。 この機能を使用する前に、クラスターのSimple Log Serviceを有効にする必要があります。 詳細については、「nginx-ingress-controllerのアクセスログの分析と監視」をご参照ください。

    • Simple Log Serviceを初めて有効にしたときに生成されるAliyunLogConfigは、ACKがIngressコントローラーに対して定義するデフォルトのログ形式にのみ適用されます。 ログ形式を変更した場合は、AliyunLogConfigでprocessor_regex設定を変更する必要があります。詳細については、「Simple Log Serviceコンソールを使用してDaemonSetモードでコンテナテキストログを収集する」をご参照ください。

関連トピック