このトピックでは、ワークロードスケーリング 機能(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:Resource Metrics データソースが利用不可
kubectl top pod コマンドを実行し、データが返されるかどうかを確認します。どのポッドに対してもデータが返されない場合は、kubectl get apiservice コマンドを実行して Resource Metrics データソースのステータスを確認します。次の例は、返されたデータを示しています。
v1beta1.metrics.k8s.io に対応する API Service が 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 は 実際の利用率 / request という数式を使用して利用率を計算します。resource フィールドに request フィールドが含まれているかどうかを確認してください。
原因 4:メトリック名が不正確
メトリック名が正しく入力されているか(大文字小文字を含む)を確認してください。たとえば、HPA がサポートする cpu ではなく CPU を入力すると、モニタリングデータの current フィールドが unknown と表示されます。
HPA のスケーリングが異常なメトリックの取得により失敗した場合どうなりますか?
HPA のメトリクス取得に異常があると、HPA のモニタリングデータにおける current フィールドが unknown と表示され、HPA がスケーリング判断に必要なメトリクスを取得できなくなり、レプリカ数を調整できなくなります。この問題のトラブルシューティング方法については、「ノード自動スケーリング よくある質問」をご参照ください。
ローリングデプロイ中に HPA が不要なポッドを追加でスケールアウトする理由は何ですか?
ローリングデプロイ中、コミュニティ版 Controller Manager はモニタリングデータがないポッドに対してゼロパディングを実行します。これにより、HPA が不要なポッドを追加でスケールアウトすることがあります。以下の構成を適用することで、この問題を防止できます。
クラスター全体の構成
ACK が提供する最新バージョンの metrics-server コンポーネントへアップグレードし、metrics-server の起動パラメーターでスイッチを有効化することで、不要なポッドのスケールアウトを防止できます。
これはグローバルスイッチであり、設定後、クラスター内の関連するすべてのワークロードに適用されます。
# metrics-server の起動パラメーターに以下のオプションを追加します。
--enable-hpa-rolling-update-skipped=true
ワークロード単位の構成
特定のワークロードのみについて不要なポッドのスケールアウトを防止したい場合は、以下のいずれかの方法を使用できます。
-
方法 1:指定したワークロードのテンプレートに以下のアノテーションを追加し、ローリングデプロイ中の HPA 評価を一時的に停止します。
# ローリングデプロイ中の HPA 評価を一時的に停止するために、ワークロードの spec.template.metadata.annotations にアノテーションを追加します。 HPARollingUpdateSkipped: "true" -
方法 2: アプリケーションのデプロイメントの開始時に設定されたランプアップ期間をスキップするには、指定されたワークロードのテンプレートに次のアノテーションを追加します。
# アプリケーションデプロイ開始時の設定済みラップアップ期間をスキップするために、ワークロードの spec.template.metadata.annotations にアノテーションを追加します。 HPAScaleUpDelay: 3m # 3m は例です。必要に応じて具体的な時間を設定してください。
しきい値に達したにもかかわらず HPA がスケールしないのはなぜですか?
HPA のスケーリングは、CPU やメモリ使用量がしきい値を超えたり下回ったりしたときにトリガーされます。また、HPA はスケールアウトまたはスケールインの操作が直後に別のスケーリングイベントを引き起こすかどうかを考慮します。これにより、振動(オシレーション)を抑制します。
たとえば、スケールアウトしきい値が 80 % で、現在 2 つのポッドの CPU 使用率がそれぞれ 70 % の場合、HPA はスケールインしません。これは、スケールインによって単一のポッドの CPU 使用率が 80 % を超え、再びスケールアウトがトリガーされ、振動を引き起こす可能性があるためです。
HPA のコレクションサイクルを設定する方法を教えてください。
metrics-server のバージョンが v0.2.1-b46d98c-aliyun より新しい場合、metrics-server の起動パラメーターで --metric-resolution パラメーターを設定できます。たとえば、--metric-resolution=15s と設定できます。
CronHPA は HPA と互換性がありますか?互換性を確保するにはどうすればよいですか?
CronHPA は HPA と互換性があります。Container Service for Kubernetes (ACK) では、CronHPA オブジェクトの scaleTargetRef を HPA オブジェクトに設定します。その後、CronHPA は HPA オブジェクトを介して実際の scaleTargetRef を検出し、HPA の現在の状態を把握できるようになります。CronHPA は Deployment のレプリカ数を直接調整せず、HPA を通じて Deployment を制御します。これにより、HPA と CronHPA の競合を回避します。CronHPA と HPA の互換性を確保する方法については、「CronHPA と HPA の協調運用」をご参照ください。
起動時に CPU やメモリ使用量が一時的に高くなる状況で、HPA による不要なポッドのスケールアウトを防ぐ方法を教えてください。
Java のようなラップアップ期間を必要とする言語やフレームワークでは、コンテナー起動時に数分間にわたって CPU やメモリ使用量が急増することがあります。これにより、HPA が誤ってトリガーされる可能性があります。誤ったトリガーを防ぐには、ACK が提供する metrics-server コンポーネントをバージョン 0.3.9.6 以降へアップグレードし、ポッドのアノテーションにスイッチを追加します。metrics-server コンポーネントのアップグレード方法については、「クラスターを v1.12 へアップグレードする前に metrics-server コンポーネントをアップグレードする」をご参照ください。
以下は、誤ったトリガーを防ぐためにスイッチを追加した Deployment の例です。
監査ログの値がしきい値に達していないにもかかわらず HPA がスケールするのはなぜですか?
原因
Horizontal Pod Autoscaler コントローラーは、現在のメトリクス値と目標メトリクス値に基づいてスケーリング比率を計算します。計算式は以下のとおりです:目標レプリカ数 = ceil (現在のレプリカ数 × (現在のメトリクス値 / 目標メトリクス値))。
この式より、目標レプリカ数の精度は、現在のレプリカ数、現在のメトリクス値、および目標メトリクス値の精度に依存します。HPA で広く使用されるリソースメトリクスを例に挙げると、HPA が現在のレプリカ数を取得する際、まず scaleTargetRef で定義されたオブジェクトの scale サブリソース (subResources) を取得します。その後、scale の status 内の Selector の値を ラベルセレクター に変換し、これを条件としてポッドをマッチさせます。この条件に基づいて取得されたポッドがすべて scaleTargetRef で定義されたオブジェクトに属しているとは限らないため、計算された目標レプリカ数が期待通りでない場合があります。たとえば、リアルタイムのメトリクス値がしきい値を下回っているにもかかわらず、スケールアウトがトリガーされることがあります。
ポッドのマッチングが不正確になる主な原因は以下のとおりです:
-
ローリングデプロイ。
-
scaleTargetRef で定義されたオブジェクトに属さない他のポッドが、同じラベルを持っている場合。以下のコマンドを実行して、該当する他のポッドを確認できます。
kubectl get pods -n {namespace 名} -l {scale サブリソースの status.Selector の値}
解決方法
-
ローリングデプロイに関連する問題については、「ノード自動スケーリング よくある質問」をご参照ください。
-
scaleTargetRef で定義されたオブジェクトに属さない他のポッドが同じラベルを持っている場合、これらのポッドを特定する必要があります。これらのポッドを引き続き使用する必要がある場合は、ラベルを変更してください。不要な場合は、削除できます。
HPA のスケールイン時にポッドの終了順序を指定できますか?
HPA は定義されたメトリクスに基づいてポッド数を自動的に増減できますが、どのポッドが最初に終了するかを決定することはできません。ポッドの終了順序、グレースフルシャットダウン期間、その他の属性は、ポッドを管理するコントローラーによって決定されます。
ECS および ECI を含むシナリオ、またはマルチノードプールのハイブリッドデプロイメントでは、アプリケーション向けにカスタムリソースポリシー(ResourcePolicy)を構成することで、スケールイン時の優先順位を指定できます。HPA は Deployment およびカスタムリソースポリシー(ResourcePolicy)と連携して、スケールイン時に ECI ノードリソースの解放を ECS リソースよりも優先させることができます。詳細については、「カスタム弾力的リソーススケジューリング優先順位」をご参照ください。
HPA の利用率メトリクスの単位の意味を教えてください。
利用率メトリクスは、通常、単位のない整数または m 単位の整数で表されます。換算は 1000m = 1 です。たとえば、tcp_connection_counts の値が 70000m の場合、これは 70 に相当します。
target 列が unknown と表示された場合、kubectl get hpa を実行した後はどうなりますか?
以下の手順で問題を解決できます。
-
kubectl describe hpa <hpa_name>コマンドを実行し、HPA が機能しない原因を特定します。-
AbleToScaleの値がConditionsフィールド内でFalseの場合、Deployment が正常であることを確認します。 -
ScalingActiveの値がConditionsフィールド内で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 に関連しているかどうかを確認します。関連している場合は、事前に Simple Log Service コンポーネントをデプロイする必要があります。詳細については、「NGINX Ingress アクセスログの収集と分析」をご参照ください。
-
HPA メトリクスが正しく入力されていることを確認します。sls.ingress.route の値形式は、
<namespace>-<svc>-<port>です。-
namespace:Ingress が配置されている名前空間。 -
svc:Ingress に対応する Service の名前。 -
port:Ingress に対応する Service のポート名。
-
HPA がサポートするメトリック名を確認する方法を教えてください。
詳細については、「Alibaba Cloud HPA メトリクス」をご参照ください。以下の表に、一般的なメトリクスを示します。
|
メトリック名 |
説明 |
追加パラメーター |
|
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 のログフォーマットをカスタマイズした後の対応方法を教えてください。
水平ポッド自動スケーリングにおける SLS Ingress メトリクスの使用方法については、「NGINX Ingress コンポーネントメトリクスに基づく水平ポッド自動スケーリング」をご参照ください。水平ポッド自動スケーリングを実現するには、クラスター内で NGINX Ingress のログを Simple Log Service へ正しく取り込むように有効化および構成する必要があります。
-
クラスターを作成する際に、Simple Log Service はデフォルトで有効化されます。デフォルト設定を維持した場合、クラスター作成後に Simple Log Service コンソール で NGINX Ingress アクセスログの分析レポートを表示し、NGINX Ingress のリアルタイム状態を監視できます。
-
クラスター作成時に Simple Log Service を手動で無効化した場合、クラスター作成後に SLS Ingress メトリクスを用いた水平ポッド自動スケーリングを利用するには、Simple Log Service を再び有効化または構成する必要があります。「NGINX Ingress アクセスログの収集と分析」をご参照ください。
-
NGINX Ingress のログフォーマットをカスタマイズする場合、クラスターで Simple Log Service が初めて有効化された際にデプロイされる AliyunLogConfig カスタムリソース定義(CRD)は、デフォルトの ACK Ingress Controller のログフォーマットにのみ適用されます。Ingress Controller のアクセスログフォーマットを変更した場合、CRD 構成の正規表現内にある
processor_regexセクションを変更する必要があります。「DaemonSet および CRD を使用したコンテナログの収集」をご参照ください。
コマンドラインで 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 クラスターに対応する 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 メトリクスがデータ照会に使用された可能性があります。
以下の結果に類似したものが返された場合:
{
"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"
}
}
]
}
これは、Kubernetes 外部メトリクスのクエリ/秒(QPS)が見つかったことを意味します。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 がスケーリングを一時停止します。