このトピックでは、ワークロードスケーリングに関するよくある質問 (HPAおよびCronHPA) に対する回答を提供します。
目次
unknown
がHPAメトリクスのcurrent
フィールドに表示された場合、どうすればよいですか?
Horizontal Pod Autoscaler (HPA) メトリクスの現在
のフィールドが不明
である場合、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
コマンドを実行して、metrics-serverコンポーネントが使用可能かどうかを確認します。 次の出力は、返されるデータの例です。
v1beta1.metrics.k8s.io
のAPIサービスがkube-system/metrics-server
でない場合は、prometrics-serverがPrometheus Operatorによって上書きされているかどうかを確認してください。 metrics-serverがPrometheus Operatorによって上書きされた場合、次のYAMLテンプレートを使用してmetrics-serverを再デプロイします。
apiVersion: apiregistration.k8s.io/v1beta1
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
問題が解決しない場合は、ACKコンソールのクラスター詳細ページに移動し、[操作] > [アドオン] を選択して、メトリクスサーバーがインストールされているかどうかを確認します。 詳細については、「metrics-server」をご参照ください。
原因2: ローリング更新またはスケールアウトアクティビティ中にメトリックを収集できません
デフォルトでは、metrics-serverは1分間隔でメトリクスを収集します。 ただし、metrics-serverは、ローリング更新またはスケールアウトアクティビティが完了した後、メトリクスを収集するまで数分待つ必要があります。 ローリング更新またはスケールアウトアクティビティが完了してから2分後にメトリックをクエリすることを推奨します。
原因3: request
フィールドが指定されていません
デフォルトでは、HPAは、リソース使用量 /リソース要求
の値を計算することによって、ポッドのCPUまたはメモリ使用量を取得します。 ポッド設定でリソース要求が指定されていない場合、HPAはリソース使用量を計算できません。 したがって、ポッド構成のresource
パラメーターでrequest
フィールドが指定されていることを確認する必要があります。
原因4: メトリック名が正しくありません
メトリック名が正しいかどうかを確認します。 メトリック名は大文字と小文字が区別されます。 たとえば、HPAでサポートされているcpu
メトリックが誤ってCPU
として書き込まれた場合、current
フィールドにunknown
が表示されます。
HPAがメトリックを収集できず、スケーリングを実行できない場合はどうすればよいですか?
HPAは、メトリックを収集できない場合、スケーリングを実行できない場合があります。 この問題が発生すると、HPAメトリクスの現在
のフィールドにunknown
が表示されます。 この場合、HPAは、スケーリングを実行するかどうかを判断するために使用されるメトリックを収集できません。 その結果、HPAはポッドをスケーリングできません。 この問題のトラブルシューティングと修正については、「ノード自動スケーリングに関するFAQ」を参照してください。
ローリングアップデート中にHPAによって余分なポッドが追加された場合はどうすればよいですか?
ローリング更新中、kube-controller-managerは、モニタリングデータを収集できないポッドに対してゼロ充填を実行します。 これにより、HPAが過剰な数のポッドを追加する可能性があります。 この問題を修正するには、次の手順を実行します。
クラスター内のすべてのワークロードでこの問題を修正
metrics-serverを最新バージョンに更新し、metrics-serverの起動設定に次のパラメーターを追加します。
次の設定は、クラスター内のすべてのワークロードで有効になります。
# Add the following configuration to the startup settings of metrics-server.
--enable-hpa-rolling-update-skipped=true
特定のワークロードに対するこの問題の修正
次のいずれかの方法を使用して、特定のワークロードでこの問題を修正できます。
方法1: ローリング更新中にHPAをスキップするために、ワークロードのテンプレートに次のアノテーションを追加します。
# Add the following annotation to the spec.template.metadata.annotations parameter of the workload configuration to skip HPA during rolling updates. HPARollingUpdateSkipped: "true"
方法2: ワークロードのテンプレートに次の注釈を追加して、更新をローリングする前にウォームアップ期間をスキップします。
# Add the following annotation to the spec.template.metadata.annotations parameter of the workload configuration to skip the warm-up period before rolling updates. HPAScaleUpDelay: 3m # You can change the value based on your business requirements.
スケーリングしきい値に達したときにHPAがポッドをスケーリングしない場合はどうすればよいですか?
CPUまたはメモリの使用量がスケールインしきい値を下回った場合、またはスケールアウトしきい値を超えた場合でも、HPAはポッドをスケールできません。 HPAは、ポッドをスケーリングするときに他の要因も考慮に入れます。 例えば、HPAは、現在のスケールアウトアクティビティがスケールインアクティビティをトリガするか、または現在のスケールインアクティビティがスケールアウトアクティビティをトリガするかをチェックする。 これにより、スケーリングの繰り返しや不要なリソース消費を防ぎます。
たとえば、スケールアウトしきい値が80% 、両方のCPU使用率が70% 2つのポッドがある場合、ポッドはスケールインされません。 これは、ポッドがスケールインされた後、1つのポッドのCPU使用率が80% よりも高くなる可能性があるためです。 これにより、別のスケールアウトアクティビティがトリガーされます。
HPAのメトリック収集間隔を設定するにはどうすればよいですか。
メトリクスサーバーのバージョンが0.2.1 b46d98c-aliyun以降の場合は、スタートアップ設定で -- metric-resolution
パラメーターを指定します。 例: -- metric-resolution=15s
CronHPAとHPAは衝突なしに相互作用できますか? CronHPAを有効にしてHPAと対話するにはどうすればよいですか?
CronHPAとHPAは競合することなく相互作用できます。 ACKは、scaleTargetRefをHPAのスケーリングオブジェクトに設定することにより、CronHPA設定を変更します。 このように、HPAのみが、scaleTargetRefによって指定されるアプリケーションをスケーリングする。 これはまたCronHPAがHPAの状態を検出することを可能にする。 CronHPAは、Deploymentのポッド数を直接変更しません。 CronHPAはHPAをトリガーしてポッドをスケーリングします。 これにより、CronHPAとHPAとの競合が防止される。 CronHPAとHPAが競合なしで相互作用できるようにする方法の詳細については、「CronHPAとHPAの相互作用」をご参照ください。
CPUまたはメモリの使用率が急速に増加したときにHPAによって過剰なポッドが追加される問題を修正するにはどうすればよいですか?
JavaアプリケーションまたはJavaフレームワークを搭載したアプリケーションのポッドが起動すると、ウォームアップ期間中の数分間、CPUとメモリの使用量が多くなる可能性があります。 これは、ポッドをスケールアウトするHPAをトリガし得る。 この問題を解決するには、ACKが提供するmetrics-serverのバージョンを0.3.9.6以降に更新し、ポッド構成にアノテーションを追加して、HPAが誤ってスケーリングアクティビティをトリガーしないようにします。 metrics-serverを更新する方法の詳細については、「Kubernetesバージョンを1.12に更新する前にmetrics-serverコンポーネントを更新する」をご参照ください。
次のYAMLテンプレートは、このシナリオでHPAが誤ってスケーリングアクティビティをトリガーしないようにするポッド構成のサンプルを提供します。
監査ログのメトリック値がしきい値を下回っているときに、HPAがアプリケーションをスケールアウトした場合はどうすればよいですか。
原因
HPAは、現在のメトリック値と所望のメトリック値との比に基づいて、所望の複製ポッド数を計算する: 所望の複製ポッド数=ceil [現在の複製ポッド数 × (現在のメトリック値 /所望のメトリック値)]
。
この式は、結果の精度が、現在の複製ポッド数、現在のメトリック値、および目的のメトリック値の精度に依存することを示しています。 たとえば、HPAが現在の複製ポッド数に関するメトリックを収集する場合、HPAはまずscaleTargetRef
パラメーターで指定されたオブジェクトのscale
という名前のサブリソース
を照会し、次にscale
サブリソースのstatus
セクションのSelector
フィールドで指定されたlabel
に基づいてポッドを選択します。 HPAによって照会されたポッドの一部が、scaleTargetRef
パラメーターで指定されたオブジェクトに属していない場合、HPAによって計算された複製ポッドの必要な数が期待どおりでない場合があります。 例えば、HPAは、リアルタイムメトリック値がしきい値よりも低い間、アプリケーションをスケールアウトすることができる。
次の理由により、一致するポッドの数が不正確になる可能性があります。
ローリングアップデートが進行中です。
scaleTargetRefパラメーターで指定されたオブジェクトに属さないポッドには、scaleサブリソースのstatusセクションのSelectorフィールドで指定されたラベルがあります。 次のコマンドを実行してポッドを照会します。
kubectl get pods -n {Namespace} -l {Value of the Selector field in the status section of the subresource named scale}
解決策
ローリング更新が進行中の場合は、「ノード自動スケーリングに関するFAQ」を参照して、この問題を解決してください。
scaleTargetRefパラメーターで指定されたオブジェクトに属していないポッドに、scaleサブリソースのstatusセクションのSelectorフィールドで指定されたラベルがある場合は、これらのポッドを見つけてラベルを変更します。 不要になったポッドを削除することもできます。
HPAは、ポッドがスケールインされる順序を決定できますか?
いいえ、HPAはポッドがスケールインされる順序を決定できません。 HPAは、定義されたメトリックに基づいてポッドの数を自動的に増減できます。 ただし、HPAはどのポッドが最初に終了するかを判断できません。 ポッドが終了する順序とポッドの正常なシャットダウン時間は、ポッドを管理するコントローラによって決定されます。
HPAによって収集された利用率メトリックの単位はどういう意味ですか?
HPAによって収集される利用率メトリックの単位はm
であり、これはプレフィックスmilli-を表す。 接頭辞は1000分の1を意味します。 利用率メトリックの値は整数です。 たとえば、tcp_connection_countsメトリックの値が70000mである場合、値は70に等しくなります。
私は何をしますか不明
に表示されます。ターゲット
を実行した後の列kubectl get hpa
コマンド?
問題をトラブルシューティングするには、次の操作を実行します。
kubectl describe hpa <hpa_name>
コマンドを実行して、HPAが異常になる理由を確認します。[条件]
フィールドのAbleToScale
の値が[False]
の場合、展開が期待どおりに作成されているかどうかを確認します。Conditions
フィールドのScalingActive
の値がFalse
の場合は、次の手順に進みます。
kubectl get -- raw "/apis/external.metrics.k8s.io/v1beta1/"
コマンドを実行します。Error from server (NotFound): サーバーが要求されたリソースを見つけることができませんでした
が返された場合、alibaba-cloud-metrics-adapterのステータスを確認します。alibaba-cloud-metrics-adapterのステータスが正常な場合は、HPAメトリクスがIngressに関連しているかどうかを確認します。 メトリクスがIngressに関連している場合は、ack-alibaba-cloud-metrics-adapterをデプロイする前に、Simple Log Serviceコンポーネントを必ずデプロイしてください。 詳細については、「nginx-ingressのアクセスログの分析と監視」をご参照ください。
HPAメトリックの値が有効であることを確認してください。 sls.ingress.routeの値は、
<namespace>-<svc>-<port>
形式である必要があります。namespace
: Ingressが属する名前空間。svc
: Ingressを作成したときに選択したサービスの名前。port
: サービスのポート。
HPAでサポートされているメトリックを見つけるにはどうすればよいですか?
HPAでサポートされているメトリクスの詳細については、「Alibaba Cloudメトリクスアダプター」をご参照ください。 次の表に、一般的に使用されるメトリックを示します。
メトリクス | 説明 | 追加パラメーター |
sls_ingress_qps | 特定のルーティングルールに基づいて、Ingressが1秒あたりに処理できるリクエストの数。 | sls.ingress.route |
sls_alb_ingress_qps | ALB Ingressが特定のルーティングルールに基づいて1秒あたりに処理できる要求の数。 | 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によって収集されたIngressメトリクスに基づいて水平ポッド自動スケーリングを実行するには、「Alibaba Cloudメトリクスに基づいて水平自動スケーリングを実装する」をご参照ください。 NGINX Ingressログを収集するには、Simple Log Serviceを設定する必要があります。
デフォルトでは、クラスターを作成するときにSimple Log Serviceが有効になります。 デフォルトのログ収集設定を使用すると、クラスターの作成後にSimple log ServiceコンソールでNGINX Ingressのログ分析レポートとリアルタイムのステータスを表示できます。
ACKクラスターの作成時にSimple Log Serviceを無効にした場合、Simple Log Serviceによって収集されたIngressメトリックに基づいて水平ポッドの自動スケーリングを実行できません。 この機能を使用する前に、クラスターのSimple Log Serviceを有効にする必要があります。 詳細については、「nginx-ingress-controllerのアクセスログの分析と監視」をご参照ください。
クラスターのSimple Log Serviceを初めて有効にしたときに生成されるAliyunLogConfigは、ACKがIngressコントローラーに定義するデフォルトのログ形式にのみ適用されます。 ログ形式を変更した場合は、AliyunLogConfigで
processor_regex
設定を変更する必要があります。詳細については、「CRDを使用してDaemonSetモードでコンテナログを収集する」をご参照ください。