HorizontalPodAutoscalerがスケールしない問題を修正:"unable to get metrics for resource cpu: no metrics returned from resource metrics API"

intermediate☸️ Kubernetes2026-03-18| Kubernetes 1.20+、kubectl、metrics-server、HorizontalPodAutoscaler v2

Error Message

unable to get metrics for resource cpu: no metrics returned from resource metrics API
#kubernetes#hpa#autoscaler#metrics-server#scaling

状況HorizontalPodAutoscalerを設定して負荷に応じてデプロイメントがスケールアウトすることを期待していたのに、何も起きません。kubectl describe hpaを実行すると次のメッセージが表示されます:

Warning  FailedGetResourceMetric  15s   horizontal-pod-autoscaler  unable to get metrics for resource cpu: no metrics returned from resource metrics API

HPAにはTARGETS: <unknown>/50%と表示され、Podが明らかに高負荷な状態でもレプリカ数は固定されたままです。

原因HPAコントローラーはCPUとメモリのデータをmetrics-serverに問い合わせます。metrics-serverがなければデータが取得できず、データがなければスケーリングの判断ができません。

主な原因は3つあります:

  • クラスターにmetrics-serverがインストールされていない- metrics-serverは起動しているがヘルスチェックに失敗している(多くの場合はTLS/証明書の不一致)- metrics-serverが各ノードのkubeletに到達できない(ネットワークポリシーまたはAPIフラグの不足)## ステップ1:問題の確認まずHPAのステータスを確認します:
kubectl get hpa -n your-namespace
kubectl describe hpa your-hpa-name -n your-namespace

Eventsセクションまでスクロールすると、unable to get metricsの警告が確認できるはずです。 次に、metrics-serverがインストールされているか確認します:

kubectl get deployment metrics-server -n kube-system

Error from server (NotFound)と表示された場合はインストールされていません。存在する場合は実際に動作しているか確認します:

kubectl get pods -n kube-system | grep metrics-server
kubectl logs -n kube-system deployment/metrics-server

TLSの問題はログに明確に表示されます:

E0318 10:23:45.123456       1 scraper.go:139] "Failed to scrape node" err="Get \"https://192.168.1.10:10250/metrics/resource\": x509: certificate signed by unknown authority"

クイック修正:metrics-serverのインストールまたはパッチ適用### ケースA — metrics-serverがインストールされていない場合公式マニフェストを使用してインストールします:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

約60秒待ってから確認します:

kubectl top nodes
kubectl top pods -n your-namespace

kubectl top nodesにデータが表示されればmetrics-serverは正常に動作しています。

ケースB — metrics-serverがインストール済みだがクラッシュしている場合(x509 / TLSエラー)ベアメタルクラスターやkubeadm環境ではこの問題が頻繁に発生します。kubeletが自己署名証明書を使用しており、metrics-serverはデフォルトでこれを拒否します。TLS検証を無効にするワンラインのパッチで解決できます:

kubectl patch deployment metrics-server -n kube-system \
  --type='json' \
  -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]'

ロールアウトの完了を待ちます:

kubectl rollout status deployment/metrics-server -n kube-system

恒久的な修正:カスタムmetrics-serverマニフェスト再インストールのたびにkubectl patchを実行するのは手間がかかります。本番環境では、パッチ適用済みのcomponents.yamlをインフラリポジトリに保存しておきましょう。まず公式ファイルをダウンロードします:

curl -LO https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

ファイルを開き、DeploymentセクションのContainerのargs--kubelet-insecure-tlsを追加します:

spec:
  template:
    spec:
      containers:
      - name: metrics-server
        args:
        - --cert-dir=/tmp
        - --secure-port=10250
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls   # この行を追加

適用します:

kubectl apply -f components.yaml

このファイルをリポジトリにコミットしておきましょう。再インストールやクラスターアップグレード後もこのフラグが維持されます。

Helmを使用する場合(代替方法)Helmでmetrics-serverを管理している場合は、インストール時にフラグを指定します:

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm upgrade --install metrics-server metrics-server/metrics-server \
  --namespace kube-system \
  --set args={--kubelet-insecure-tls}

修正の確認kubectl topがデータを返していることを確認します:

kubectl top nodes
# 期待される出力:
# NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
# node-1       245m         6%     2312Mi          30%

kubectl top pods -n your-namespace
# NAME                        CPU(cores)   MEMORY(bytes)
# my-app-7d4b9c6f8-xk2pq      12m          128Mi

HPAを確認します — TARGETS列に<unknown>ではなく実際の数値が表示されるはずです:

kubectl get hpa -n your-namespace
# NAME       REFERENCE             TARGETS   MINPODS   MAXPODS   REPLICAS
# my-hpa     Deployment/my-app     8%/50%    2         10        2

HPAをリアルタイムで監視します:

kubectl get hpa -n your-namespace -w

スケールアップのテストを行うには、Podに対してCPU負荷を発生させます。1〜2分以内にレプリカ数が増加し始めるはずです。

まだエラーが続く場合metrics-serverは正常に見えるのにTARGETSが依然として<unknown>の場合は、以下の点を確認してください:

  • リソースリクエストが設定されていない:HPAはPodのresources.requests.cpuを基準にCPU使用率を計算します。このフィールドがない場合、生のメトリクスが存在していても使用率の計算ができません。resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi"- APIアグリゲーションが登録されていない:一部のクラスターでは、メトリクスAPIエンドポイントが完全に欠落していることがあります。kubectl api-versions | grep metricsを実行してmetrics.k8s.io/v1beta1が出力に含まれているか確認してください。- NetworkPolicyがmetrics-serverをブロックしている:厳格なポリシーにより通信がサイレントにドロップされることがあります。kube-system内のmetrics-serverがすべてのノードのkubeletのポート10250に到達できることを確認してください。

Related Error Notes