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

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

最終更新日:Aug 29, 2026

メトリクス取得の失敗、オーバースケーリング、しきい値の動作など、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 を実行して、データが返されるかどうかを確認します。 どのポッドもデータを返さない場合は、kubectl get apiservice を実行して Resource Metrics データソースのステータスを確認します。 出力例:

出力例

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 の API サービスが 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 がインストールされていることを確認します。

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

Pod が作成または更新された後、metrics-server がメトリクスを収集するまでには時間がかかります。約 2 分待ってから再度確認してください。

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

デフォルトでは、HPA は actual utilization/request を使用率として使用します。ポッドの resource フィールドに request フィールドが含まれているかどうかを確認してください。

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

メトリック名と大文字/小文字が正しいことを確認してください。たとえば、cpuCPU と記述すると、current フィールドに unknown と表示されます。

HPA スケーリング失敗のトラブルシューティング

メトリックの取得に失敗すると、HPA の current フィールドは unknown と表示され、スケーリングは停止します。トラブルシューティングについては、「ノードの自動スケーリングに関する FAQ」をご参照ください。

ローリングアップデート中に HPA が追加の Pod を作成する理由

ローリングアップデート中、controller-manager はメトリクスのない Pod に対してゼロ値を報告するため、HPA が過剰な Pod を作成する (オーバースケーリング) 可能性があります。これを防ぐには、次の設定を使用します。

クラスターレベルの設定

Container Service for Kubernetes (ACK) の metrics-server を最新バージョンにアップグレードし、次の起動パラメーターを有効にしてください。

これはクラスター内のすべてのワークロードに影響します。

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

ワークロードレベルの設定

特定のワークロードのオーバースケーリングを防ぐには、次のいずれかの方法を使用します。

  • ローリングアップデート中に HPA の評価を一時停止するには、Pod テンプレートに次のアノテーションを追加してください。

    # ワークロードの 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
  • アプリケーション起動後のウォームアップ期間を設定するには、Pod テンプレートに次のアノテーションを追加してください。

    # ワークロードの 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 がそれぞれ 70% の CPU を使用している場合、HPA はスケールインしません。1 つの Pod に減らすと CPU 使用率が 80% を超え、すぐにスケールアウトがトリガーされるためです。

HPA メトリクス収集間隔の設定方法

metric-server のバージョンが v0.2.1-b46d98c-aliyun より大きい場合は、起動パラメーター --metric-resolution を設定します。 例: --metric-resolution=15s

CronHPA は HPA と互換性がありますか?どのように機能しますか?

はい。ACK では、CronHPA は scaleTargetRef を HPA に設定し、Deployment のレプリカ数を直接調整するのではなく、HPA を介してスケーリングを行うため、2 つの自動スケーラー間の競合を防ぎます。詳細については、「CronHPA と HPA の連携を有効にする」をご参照ください。

初期リソーススパイクによる HPA のオーバースケーリングを防ぐ方法

Java などの言語のアプリケーションは、コンテナ起動後のウォームアップ中に CPU とメモリがスパイクし、不要な HPA のスケールアウトをトリガーする可能性があります。これを防ぐには、ACK の metrics-server を 0.3.9.6 以降にアップグレードし、Pod 仕様にアノテーションを追加してください。詳細については、「クラスターを v1.12 にアップグレードする前に metrics-server コンポーネントをアップグレードする」をご参照ください。

アノテーション付きの Deployment のサンプル:

サンプル YAML

## Deployment の例
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 がスケーリングした理由

原因

水平ポッドオートスケーラーは、現在のメトリックと望ましいメトリックの比率に基づき、次の計算式を使用して望ましいレプリカ数を計算します。望ましいレプリカ数 = ceil(現在のレプリカ数 × (現在のメトリック / 望ましいメトリック))

望ましいレプリカ数は、現在のレプリカ数、現在のメトリック、および目標メトリックによって決まります。リソースメトリックでは、HPA は scale サブリソース (subResources) の scaleTargetRef オブジェクトを取得し、Selectorstatusscale オブジェクトから labelselector に変換して Pod と照合します。照合された Pod のすべてが scaleTargetRef オブジェクトに属していない場合、計算されたレプリカ数が不正確になる可能性があります (たとえば、メトリックがしきい値を下回っているときにスケールアップするなど)。

Pod 数が不正確になる一般的な理由は次のとおりです。

  • ローリングアップデートが進行中である。

  • scaleTargetRef オブジェクト外の Pod が同じラベルを共有している。次のコマンドで確認してください。

    kubectl get pods -n {namespace_name} -l {value_of_scale_subresource_status.selector}

ソリューション

HPA は Pod のスケールイン順序を制御できますか?

いいえ。HPA はレプリカ数のみを調整し、どの Pod を終了するかは制御しません。終了順序とグレースフルシャットダウンは、管理コントローラー (Deployment など) が決定します。

ただし、ECS、ACS、ECI などのノードタイプ、または複数のノードプールを含む混合環境では、ResourcePolicy を使用してスケールインの優先順位を制御できます。たとえば、ECS Pod の前に ECI Pod をスケールインします。詳細については、「エラスティックリソースの優先順位スケジューリングのカスタマイズ」をご参照ください。

HPA 使用率メトリクスの単位について

使用量メトリクスは、単位のない整数、または m 単位の整数 (1000m = 1) です。たとえば、70000m は 70 に相当します。

kubectl get hpa を実行した後に target 列が unknown と表示される場合の対処方法

トラブルシューティングの手順:

  1. kubectl describe hpa <hpa_name> を実行して、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 関連かどうかを確認してください。該当する場合は、まず SLS コンポーネントをデプロイしてください。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。

  3. HPA メトリクスが正しく入力されていることを確認してください。sls.ingress.route の値は <namespace>-<svc>-<port> の形式です。

    • namespace: Ingress のネームスペースです。

    • svc: Ingress サービス名です。

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

HPA でサポートされているメトリクスを見つける方法

完全なリストについては、「Alibaba Cloud HPA メトリクス」をご参照ください。一般的なメトリクスは次のとおりです。

メトリクス

説明

追加パラメーター

sls_ingress_qps

指定された Ingress ルートの QPS。

sls.ingress.route

sls_alb_ingress_qps

指定された ALB Ingress ルートの 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 ログ形式での自動スケーリング

SLS Ingress メトリクスを使用して水平 Pod スケーリングを行うには、「Nginx Ingress メトリクスに基づいて Pod をスケーリングする」をご参照ください。クラスターで SLS への Nginx Ingress ログ収集を有効にする必要があります。

  • SLS は、クラスター作成時にデフォルトで有効になっています。デフォルト設定では、アクセスログダッシュボードと Nginx Ingress 監視が SLS コンソールで利用できます。

  • クラスター作成時に SLS を無効にした場合は、再度有効にして設定してください。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。

  • Nginx Ingress のログ形式をカスタマイズした場合、CRD 設定の processor_regex セクションを更新してください。デフォルトの AliyunLogConfig CRD は、デフォルトの Ingress Controller ログ形式にのみ一致します。詳細については、「DaemonSet-CRD を使用してコンテナログを収集する」をご参照ください。

CLI を使用した 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"
}

これは、メトリクスに使用可能なデータがないことを意味します。これは、ALB Ingress が設定されていない状態で ALB Ingress メトリクス (sls_alb_ingress_qps など) をクエリした場合に発生します。

次のような結果が返される場合:

{
  "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"
      }
    }
  ]
}

メトリックが取得されました。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 オブジェクトのスケーリングは一時停止されます。