メトリクス取得の失敗、オーバースケーリング、しきい値の動作など、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 データソースのステータスを確認します。 出力例:
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: メトリクス名が正しくない
メトリック名と大文字/小文字が正しいことを確認してください。たとえば、cpu を CPU と記述すると、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" -
アプリケーション起動後のウォームアップ期間を設定するには、Pod テンプレートに次のアノテーションを追加してください。
# ワークロードの spec.template.metadata.annotations に次のアノテーションを追加して、ウォームアップ期間を設定します。 HPAScaleUpDelay: 3m # 3m は例です。要件に基づいて期間を設定してください。
しきい値に達しても 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 のサンプル:
監査ログでメトリクス値がしきい値を下回っているのに HPA がスケーリングした理由
原因
水平ポッドオートスケーラーは、現在のメトリックと望ましいメトリックの比率に基づき、次の計算式を使用して望ましいレプリカ数を計算します。望ましいレプリカ数 = ceil(現在のレプリカ数 × (現在のメトリック / 望ましいメトリック))。
望ましいレプリカ数は、現在のレプリカ数、現在のメトリック、および目標メトリックによって決まります。リソースメトリックでは、HPA は scale サブリソース (subResources) の scaleTargetRef オブジェクトを取得し、Selector を status の scale オブジェクトから labelselector に変換して Pod と照合します。照合された Pod のすべてが scaleTargetRef オブジェクトに属していない場合、計算されたレプリカ数が不正確になる可能性があります (たとえば、メトリックがしきい値を下回っているときにスケールアップするなど)。
Pod 数が不正確になる一般的な理由は次のとおりです。
-
ローリングアップデートが進行中である。
-
scaleTargetRef オブジェクト外の Pod が同じラベルを共有している。次のコマンドで確認してください。
kubectl get pods -n {namespace_name} -l {value_of_scale_subresource_status.selector}
ソリューション
-
ローリングアップデートの問題については、「ローリングアップデート中に HPA が追加の Pod を作成する理由」をご参照ください。
-
他の Pod が同じラベルを共有している場合は、それらを特定します。まだ使用中の場合は、ラベルを変更します。不要になった場合は、削除します。
HPA は Pod のスケールイン順序を制御できますか?
いいえ。HPA はレプリカ数のみを調整し、どの Pod を終了するかは制御しません。終了順序とグレースフルシャットダウンは、管理コントローラー (Deployment など) が決定します。
ただし、ECS、ACS、ECI などのノードタイプ、または複数のノードプールを含む混合環境では、ResourcePolicy を使用してスケールインの優先順位を制御できます。たとえば、ECS Pod の前に ECI Pod をスケールインします。詳細については、「エラスティックリソースの優先順位スケジューリングのカスタマイズ」をご参照ください。
HPA 使用率メトリクスの単位について
使用量メトリクスは、単位のない整数、または m 単位の整数 (1000m = 1) です。たとえば、70000m は 70 に相当します。
kubectl get hpa を実行した後に target 列が unknown と表示される場合の対処方法
トラブルシューティングの手順:
-
kubectl describe hpa <hpa_name>を実行して、HPA が失敗した理由を確認します。-
ConditionsフィールドにAbleToScaleがFalseと示されている場合、デプロイメントが正しく実行されていることを確認してください。 -
ConditionsフィールドのScalingActiveがFalseの場合、次のステップに進みます。
-
-
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 アクセスログの収集と分析」をご参照ください。
-
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 は現在、インプレースアップグレードをサポートしていません。
ソリューション
アップグレードするには:
-
現在のコンポーネント設定をバックアップします。
-
古いバージョンのコンポーネントをアンインストールします。
-
バックアップした設定で最新バージョンをインストールします。
このプロセス中、メトリクス収集が停止するため、関連する HPA オブジェクトのスケーリングは一時停止されます。