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

Container Service for Kubernetes:ワークロードスケーリングのよくある質問

最終更新日:Dec 25, 2025

このトピックでは、Horizontal Pod Autoscaler (HPA) と CronHPA を含むワークロードスケーリング機能に関する一般的な問題とそのソリューションについて説明します。

目次

HPA モニタリングデータの current フィールドが unknown と表示される理由

HPA モニタリングデータの current フィールドが unknown と表示される場合、kube-controller-manager がモニタリングデータソースにアクセスして必要なデータを取得できないことを意味します。その結果、HPA のスケーリングは失敗します。

Name:                                                  kubernetes-tutorial-deployment
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Mon, 10 Jun 2019 11:46:48  0530
Reference:                                             Deployment/kubernetes-tutorial-deployment
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  <unknown> / 2%
Min replicas:                                          1
Max replicas:                                          4
Deployment pods:                                       1 current / 0 desired
Conditions:
  Type           Status  Reason                   Message
  ----           ------  ------                   -------
  AbleToScale    True    SucceededGetScale        the HPA controller was able to get the target's current scale
  ScalingActive  False   FailedGetResourceMetric  the HPA was unable to compute the replica count: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server is currently unable to handle the request (get pods.metrics.k8s.io)
Events:
  Type     Reason                   Age                      From                       Message
  ----     ------                   ----                     ----                       -------
  Warning  FailedGetResourceMetric  3m3s (x1009 over 4h18m)  horizontal-pod-autoscaler  unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server is currently unable to handle the request (get pods.metrics.k8s.io)

原因 1:リソースメトリックのデータソースが利用不可

まず、kubectl top pod コマンドを実行してデータが返されるか確認します。どの Pod からもデータが返されない場合は、kubectl get apiservice を実行して、リソースメトリックを提供するデータソースのステータスを確認します。以下は出力例です。

出力例を表示

NAME                                   SERVICE                      AVAILABLE   AGE
v1.                                    Local                        True        29h
v1.admissionregistration.k8s.io        Local                        True        29h
v1.apiextensions.k8s.io                Local                        True        29h
v1.apps                                Local                        True        29h
v1.authentication.k8s.io               Local                        True        29h
v1.authorization.k8s.io                Local                        True        29h
v1.autoscaling                         Local                        True        29h
v1.batch                               Local                        True        29h
v1.coordination.k8s.io                 Local                        True        29h
v1.monitoring.coreos.com               Local                        True        29h
v1.networking.k8s.io                   Local                        True        29h
v1.rbac.authorization.k8s.io           Local                        True        29h
v1.scheduling.k8s.io                   Local                        True        29h
v1.storage.k8s.io                      Local                        True        29h
v1alpha1.argoproj.io                   Local                        True        29h
v1alpha1.fedlearner.k8s.io             Local                        True        5h11m
v1beta1.admissionregistration.k8s.io   Local                        True        29h
v1beta1.alicloud.com                   Local                        True        29h
v1beta1.apiextensions.k8s.io           Local                        True        29h
v1beta1.apps                           Local                        True        29h
v1beta1.authentication.k8s.io          Local                        True        29h
v1beta1.authorization.k8s.io           Local                        True        29h
v1beta1.batch                          Local                        True        29h
v1beta1.certificates.k8s.io            Local                        True        29h
v1beta1.coordination.k8s.io            Local                        True        29h
v1beta1.events.k8s.io                  Local                        True        29h
v1beta1.extensions                     Local                        True        29h
...
[v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        29h]
...
v1beta1.networking.k8s.io              Local                        True        29h
v1beta1.node.k8s.io                    Local                        True        29h
v1beta1.policy                         Local                        True        29h
v1beta1.rbac.authorization.k8s.io      Local                        True        29h
v1beta1.scheduling.k8s.io              Local                        True        29h
v1beta1.storage.k8s.io                 Local                        True        29h
v1beta2.apps                           Local                        True        29h
v2beta1.autoscaling                    Local                        True        29h
v2beta2.autoscaling                    Local                        True        29h

v1beta1.metrics.k8s.io に対応する APIService が kube-system/metrics-server でない場合、prometheus-operator のインストール時に上書きされたことが原因かどうかを確認します。上書きが原因であった場合、以下の YAML テンプレートをデプロイしてサービスを回復できます。

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  service:
    name: metrics-server
    namespace: kube-system
  group: metrics.k8s.io
  version: v1beta1
  insecureSkipTLSVerify: true
  groupPriorityMinimum: 100
  versionPriority: 100

これが原因でない場合は、クラスターコンソールの [運用管理] 配下にある [コンポーネント管理] ページで metrics-server コンポーネントがインストールされていることを確認します。詳細については、「metrics-server」をご参照ください。

原因 2:ローリングデプロイまたはスケールアウト中にデータが取得できない

metrics-server のデフォルトのデータ収集期間は 1 分です。スケールアウトまたはアップデート後、短時間の間は metrics-server がモニタリングデータを取得できません。スケールアウトまたはアップデートから約 2 分後にもう一度確認してください。

原因 3:request フィールドが設定されていない

デフォルトでは、HPA は数式 実使用量/リクエスト を使用して使用率を計算します。Pod の resource フィールドに request フィールドが含まれているか確認してください。

原因 4:メトリック名が正しくない

大文字小文字を含め、メトリック名が正しいか確認してください。例えば、HPA がサポートするメトリック cpuCPU と誤って入力した場合、モニタリングデータの current フィールドは unknown と表示されます。

HPA のスケーリングが失敗し、メトリックの取得が異常な場合の対処法

メトリックの取得が異常な場合、HPA のスケーリングは失敗する可能性があります。この場合、HPA モニタリングデータの current フィールドは unknown と表示されます。HPA はスケーリングの決定に必要なメトリックを取得できず、Pod の数を調整できません。問題のトラブルシューティングと解決策の詳細については、「ノードのオートスケーリングに関するよくある質問」をご参照ください。

ローリングアップデート中に HPA が余分な Pod をスケールアウトする理由

ローリングデプロイ中、コミュニティの Controller Manager はデータのない Pod のモニタリングデータにゼロを埋め込みます。これにより、HPA が余分な Pod をスケールアウトさせることがあり、これはスケーリングジッターとして知られる問題です。この問題を回避するには、以下の構成を使用します。

クラスターレベルの構成

Container Service for Kubernetes (ACK) が提供する最新バージョンの metrics-server にアップグレードし、metrics-server の起動パラメーターでスイッチを有効にすることで、スケーリングジッターを防ぐことができます。

これはグローバルスイッチです。設定すると、クラスター内の関連するすべてのワークロードに影響します。

# metrics-server の起動パラメーターに以下のオプションを追加します。
--enable-hpa-rolling-update-skipped=true  

ワークロードレベルの構成

特定のワークロードに対してのみスケーリングジッターを防ぎたい場合は、以下の 2 つの方法のいずれかを使用できます。

  • 方法 1:指定されたワークロードのテンプレートに以下のアノテーションを追加して、ローリングデプロイ中に HPA の評価を一時的に停止します。

    # このアノテーションをワークロードの spec.template.metadata.annotations に追加して、ローリングデプロイ中に HPA の評価を一時的に停止します。
    HPARollingUpdateSkipped: "true"

    サンプルコードを表示

    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
          annotations:
            HPARollingUpdateSkipped: "true"  # ローリングデプロイ中に HPA の効果をスキップします。
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80
  • 方法 2:指定されたワークロードのテンプレートに以下のアノテーションを追加して、アプリケーションのデプロイ開始時に指定された起動期間をスキップします。

    # このアノテーションをワークロードの spec.template.metadata.annotations に追加して、アプリケーションのデプロイ開始時に指定された起動期間をスキップします。
    HPAScaleUpDelay: 3m # 3m は一例です。必要に応じて期間を設定してください。

    サンプルコードを表示

    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
          annotations:
            HPAScaleUpDelay: 3m  # m は分を表します。これは、Pod が作成されてから 3 分後に HPA が有効になることを意味します。有効な単位は [s (秒), m (分)] です。
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80

しきい値に達しても HPA がスケーリングしない理由

HPA がスケーリングイベントをトリガーするのは、CPU やメモリの使用量がしきい値を超えた場合だけではありません。スケールアウトまたはスケールインのアクションが、直後に逆のスケーリングアクションをトリガーしないかどうかも考慮し、スケーリングジッターを防ぎます。

例えば、スケールアウトのしきい値を 80% に設定したとします。2 つの Pod があり、両方とも CPU 使用率が 70% の場合、HPA はスケールインしません。これは、1 つの Pod にスケールインすると、その CPU 使用率が 80% を超える可能性が高く、それがスケールアウトをトリガーするためです。これにより、頻繁なスケーリングの繰り返しを防ぎます。

HPA のデータ収集期間の設定方法

v0.2.1-b46d98c-aliyun 以降の metrics-server バージョンでは、metrics-server の起動パラメーターで --metric-resolution パラメーターを設定できます。例:--metric-resolution=15s

CronHPA は HPA と互換性がありますか?また、互換性を持たせる方法

CronHPA は HPA と互換性があります。Container Service for Kubernetes (ACK) では、CronHPA オブジェクトの scaleTargetRef は HPA オブジェクトに設定されます。その後、CronHPA は HPA オブジェクトを通じて実際の scaleTargetRef を見つけ、これにより CronHPA は HPA の現在の状態を認識します。CronHPA はデプロイメントのレプリカ数を直接調整するのではなく、HPA を通じてデプロイメントを操作します。これにより、CronHPA と HPA の間の競合を防ぎます。CronHPA と HPA の連携に関する詳細については、「CronHPA と HPA の連携」をご参照ください。

HPA 起動時の高い CPU またはメモリ使用量による余分な Pod のスケールアウト問題の解決方法

Java のようにウォームアップ期間を必要とする言語やフレームワークでは、コンテナーの起動時に数分間、CPU とメモリの使用量が急増することがあります。これにより、HPA が誤ってトリガーされる可能性があります。この問題を解決するには、ACK の metrics-server コンポーネントをバージョン 0.3.9.6 以降にアップグレードし、Pod にアノテーションを追加して誤ったトリガーを防ぎます。metrics-server コンポーネントのアップグレードに関する詳細については、「クラスターを v1.12 にアップグレードする前に metrics-server コンポーネントをアップグレードする」をご参照ください。

以下は、誤ったトリガーを防ぐためのアノテーションを含むデプロイメントのサンプル YAML ファイルです。

サンプル YAML を表示

## デプロイメントの例
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
      annotations:
        HPAScaleUpDelay: 3m # m は分を表します。これは、Pod が作成されてから 3 分後に HPA が有効になることを意味します。有効な単位は [s (秒), m (分)] です。
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9 # ご利用の正確な <image_name:tags> に置き換えてください。
        ports:
        - containerPort: 80 

監査ログの値がしきい値に達していないのに HPA がスケーリングした理由

原因

HPA は、現在のメトリック値と目標のメトリック値に基づいて、次の数式を使用して目標レプリカ数を計算します:目標レプリカ数 = ceil(現在のレプリカ数 × (現在のメトリック値 / 目標のメトリック値))

この数式は、計算された目標レプリカ数の精度が、現在のレプリカ数、現在のメトリック値、および目標のメトリック値の精度に依存することを示しています。例えば、HPA で広く使用されているリソースメトリックを考えてみましょう。現在のレプリカ数を取得するために、HPA はまず scaleTargetRef で定義されたオブジェクトの scale subResources を取得します。次に、HPA は scale オブジェクトの status から Selector の値を labelselector に変換し、そのセレクターを使用して Pod を照合および取得します。取得した Pod の一部が scaleTargetRef で定義されたオブジェクトに属していない場合、計算された目標レプリカ数が不正確になる可能性があります。例えば、リアルタイムのメトリック値がしきい値を下回っていても、HPA がスケールアウトすることがあります。

一致する Pod の数が不正確になる一般的な理由には、次のようなものがあります。

  • ローリングデプロイ。

  • scaleTargetRef のオブジェクトに属さない Pod に同じラベルが適用されている。次のコマンドを実行して、このラベルを持つ他の Pod が存在するかどうかを判断できます。

    kubectl get pods -n {namespace_name} -l {value_of_status.Selector_for_scale_subresource}

ソリューション

  • ローリングデプロイに関連するソリューションについては、「ノードのオートスケーリングに関するよくある質問」をご参照ください。

  • 問題が同じラベルを使用している他の Pod によって引き起こされている場合は、これらの Pod を特定します。まだ必要な場合はラベルを変更し、不要な場合は削除します。

HPA がスケールダウンする際の Pod のスケールイン順序の制御は可能か

HPA は定義されたメトリックに基づいて Pod の数を自動的に増減できますが、どの Pod を最初に終了させるかを直接決定するわけではありません。Pod の終了順序、グレースフルシャットダウン期間、およびその他の属性は、Pod を管理するコントローラーによって決定されます。

ECS と ACS/ECI の混合デプロイメントやマルチノードプールなどのシナリオでは、アプリケーションに ResourcePolicy を設定することでスケールインの優先順位を指定できます。HPA はデプロイメントおよび ResourcePolicy と連携して、スケールイン時にまず ACS/ECI ノードリソースを解放し、次に ECS リソースを解放することができます。詳細については、「エラスティックリソーススケジューリングの優先順位のカスタマイズ」をご参照ください。

HPA 使用率メトリックの単位の意味

使用率メトリックは通常、整数であり、単位がないか、単位として m を使用します。後者の場合、1000m は 1 に等しくなります。例えば、tcp_connection_counts の値が 70000m の場合、70 と同等です。

kubectl get hpa コマンドの実行結果で targetunknown と表示される場合の対処法

以下の手順に従って問題を解決します。

  1. kubectl describe hpa <hpa_name> コマンドを実行して、Horizontal Pod Autoscaler (HPA) の失敗の原因を特定します。

    • Conditions フィールドが AbleToScaleFalse であることを示している場合、デプロイメントが正しいことを確認してください。

    • Conditions フィールドが ScalingActiveFalse であることを示している場合、次のステップに進みます。

  2. kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" コマンドを実行します。コマンドが Error from server (NotFound): the server could not find the requested resource を返す場合、alibaba-cloud-metrics-adapter コンポーネントのステータスを確認してください。

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

  3. HPA メトリックが正しく入力されていることを確認します。sls.ingress.route の値は、<namespace>-<svc>-<port> のフォーマットを使用する必要があります。

    • namespace:Ingress の名前空間。

    • svc:Ingress サービスの名前。

    • port:Ingress サービスのポート名。

HPA がサポートするメトリック名の確認方法

詳細については、「Alibaba Cloud HPA Metrics」をご参照ください。次の表に、一般的なメトリックを示します。

メトリック名

説明

追加パラメーター

sls_ingress_qps

指定された IngressRoute の秒間クエリ数 (QPS)。

sls.ingress.route

sls_alb_ingress_qps

ALB データの IngressRoute の QPS。

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 (SLS) Ingress メトリックを使用した水平ポッド自動スケーリングの詳細については、「Alibaba Cloud コンポーネントのメトリックを使用した水平ポッド自動スケーリング」をご参照ください。クラスターで SLS の Nginx Ingress ログ収集を有効にし、正しく設定する必要があります。

  • クラスターを作成する際、Simple Log Service はデフォルトで有効になっています。デフォルト設定を維持すると、Simple Log Service コンソールで Nginx Ingress アクセスログ分析レポートを表示し、Nginx Ingress のリアルタイムステータスを監視できます。

  • クラスター作成時に Simple Log Service を無効にした場合、SLS Ingress メトリックを水平ポッド自動スケーリングに使用するには、再度有効にするか設定する必要があります。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。

  • Nginx Ingress のログフォーマットをカスタマイズするには、Custom Resource Definition (CRD) 設定の正規表現の processor_regex 部分を変更する必要があります。これは、クラスターで Simple Log Service を有効にするとデプロイされる AliyunLogConfig CRD が、ACK Ingress コントローラーのデフォルトのログフォーマットのみをサポートしているためです。詳細については、「DaemonSet CRD を使用したコンテナーログの収集」をご参照ください。

コマンドラインから QPS メトリック sls_ingress_qps を取得する方法

コマンドラインからメトリックをクエリできます。次の例は、`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 クラスターに対応する SLS プロジェクトの名前を指定します。構成をカスタマイズしていない場合、デフォルト名は 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"
}

この結果は、メトリックに利用可能なデータがないことを示します。これは、`sls_alb_ingress_qps` メトリックをクエリしているが、ALB Ingress を設定していないことが原因である可能性があります。

コマンドが次のような結果を返す場合:

{
  "kind": "ExternalMetricValueList",
  "apiVersion": "external.metrics.k8s.io/v1beta1",
  "metadata": {},
  "items": [
    {
      "metricName": "sls_ingress_qps",
      "timestamp": "2025-02-26T16:45:00Z", 
      "value": "50",   # QPS 値
      "metricLabels": {
        "sls.project": "your-sls-project-name",
        "sls.logstore": "nginx-ingress"
      }
    }
  ]
}

この結果は、QPS の Kubernetes 外部メトリックが見つかったことを示します。value フィールドは QPS 値を表します。

alibaba-cloud-metrics-adapter イメージのプル失敗

症状

ack-alibaba-cloud-metrics-adapter コンポーネントをバージョン 1.3.7 にアップグレードする際に、イメージのプル中にエラーが発生します。エラーメッセージは次のとおりです:

Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".

原因

ack-alibaba-cloud-metrics-adapter コンポーネントは、現在、直接のアップグレードをサポートしていません。

解決策

コンポーネントをアップグレードするには、次の手順に従ってください。

  1. 現在のコンポーネント設定をバックアップします。

  2. 古いバージョンのコンポーネントをアンインストールします。

  3. バックアップした構成を使用して、最新バージョンのコンポーネントをインストールします。

重要

コンポーネントのアンインストールと再インストールの間、モニタリングデータの取得が停止するため、関連する HPA のスケーリング動作は一時停止します。