このトピックでは、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 を実行して、リソースメトリックを提供するデータソースのステータスを確認します。以下は出力例です。
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 がサポートするメトリック cpu を CPU と誤って入力した場合、モニタリングデータの 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"方法 2:指定されたワークロードのテンプレートに以下のアノテーションを追加して、アプリケーションのデプロイ開始時に指定された起動期間をスキップします。
# このアノテーションをワークロードの spec.template.metadata.annotations に追加して、アプリケーションのデプロイ開始時に指定された起動期間をスキップします。 HPAScaleUpDelay: 3m # 3m は一例です。必要に応じて期間を設定してください。
しきい値に達しても 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 ファイルです。
監査ログの値がしきい値に達していないのに 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 コマンドの実行結果で target が unknown と表示される場合の対処法
以下の手順に従って問題を解決します。
kubectl describe hpa <hpa_name>コマンドを実行して、Horizontal Pod Autoscaler (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 に関連しているか確認します。メトリックが Ingress に関連している場合は、まず Simple Log Service コンポーネントをデプロイする必要があります。詳細については、「Nginx Ingress アクセスログの収集と分析」をご参照ください。
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 コンポーネントは、現在、直接のアップグレードをサポートしていません。
解決策
コンポーネントをアップグレードするには、次の手順に従ってください。
現在のコンポーネント設定をバックアップします。
古いバージョンのコンポーネントをアンインストールします。
バックアップした構成を使用して、最新バージョンのコンポーネントをインストールします。
コンポーネントのアンインストールと再インストールの間、モニタリングデータの取得が停止するため、関連する HPA のスケーリング動作は一時停止します。