すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ワークロードスケーリングFAQ

最終更新日:Nov 13, 2024

このトピックでは、ワークロードスケーリングに関するよくある質問 (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コンポーネントが使用可能かどうかを確認します。 次の出力は、返されるデータの例です。

サンプル出力を表示する

NAME                                   SERVICE                      AVAILABLE   AGE
v1.                                    Local                        True        29h
v1.admissionregistration.k8s.io        Local                        True        29h
v1.apiextensions.k8s.io                Local                        True        29h
v1.apps                                Local                        True        29h
v1.authentication.k8s.io               Local                        True        29h
v1.authorization.k8s.io                Local                        True        29h
v1.autoscaling                         Local                        True        29h
v1.batch                               Local                        True        29h
v1.coordination.k8s.io                 Local                        True        29h
v1.monitoring.coreos.com               Local                        True        29h
v1.networking.k8s.io                   Local                        True        29h
v1.rbac.authorization.k8s.io           Local                        True        29h
v1.scheduling.k8s.io                   Local                        True        29h
v1.storage.k8s.io                      Local                        True        29h
v1alpha1.argoproj.io                   Local                        True        29h
v1alpha1.fedlearner.k8s.io             Local                        True        5h11m
v1beta1.admissionregistration.k8s.io   Local                        True        29h
v1beta1.alicloud.com                   Local                        True        29h
v1beta1.apiextensions.k8s.io           Local                        True        29h
v1beta1.apps                           Local                        True        29h
v1beta1.authentication.k8s.io          Local                        True        29h
v1beta1.authorization.k8s.io           Local                        True        29h
v1beta1.batch                          Local                        True        29h
v1beta1.certificates.k8s.io            Local                        True        29h
v1beta1.coordination.k8s.io            Local                        True        29h
v1beta1.events.k8s.io                  Local                        True        29h
v1beta1.extensions                     Local                        True        29h
...
[v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        29h]
...
v1beta1.networking.k8s.io              Local                        True        29h
v1beta1.node.k8s.io                    Local                        True        29h
v1beta1.policy                         Local                        True        29h
v1beta1.rbac.authorization.k8s.io      Local                        True        29h
v1beta1.scheduling.k8s.io              Local                        True        29h
v1beta1.storage.k8s.io                 Local                        True        29h
v1beta2.apps                           Local                        True        29h
v2beta1.autoscaling                    Local                        True        29h
v2beta2.autoscaling                    Local                        True        29h

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"

    サンプルコードを表示する

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
        template:
            metadata:
              labels:
                app: nginx
              annotations:
                HPARollingUpdateSkipped: "true"  # Skip HPA during rolling updates. 
            spec:
              containers:
              - name: nginx
                image: nginx:1.7.9
                ports:
                - containerPort: 80
  • 方法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.

    サンプルコードを表示する

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
        template:
            metadata:
              labels:
                app: nginx
              annotations:
                HPAScaleUpDelay: 3m  # This setting indicates that HPA takes effect 3 minutes after the pods are created. Valid units: s and m. s indicates seconds and m indicates minutes. 
            spec:
              containers:
              - name: nginx
                image: nginx:1.7.9
                ports:
                - containerPort: 80

スケーリングしきい値に達したときに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が誤ってスケーリングアクティビティをトリガーしないようにするポッド構成のサンプルを提供します。

サンプルコードを表示する

## In this example, a Deployment is used.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-basic
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        HPAScaleUpDelay: 3m # This setting indicates that HPA takes effect 3 minutes after the pods are created. Valid units: s and m. s indicates seconds and m indicates minutes. 
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9 # Replace it with your exactly <image_name:tags>.
        ports:
        - containerPort: 80 

監査ログのメトリック値がしきい値を下回っているときに、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コマンド?

問題をトラブルシューティングするには、次の操作を実行します。

  1. kubectl describe hpa <hpa_name> コマンドを実行して、HPAが異常になる理由を確認します。

    • [条件] フィールドのAbleToScaleの値が [False] の場合、展開が期待どおりに作成されているかどうかを確認します。

    • ConditionsフィールドのScalingActiveの値がFalseの場合は、次の手順に進みます。

  2. 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のアクセスログの分析と監視」をご参照ください。

  3. 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モードでコンテナログを収集する」をご参照ください。