Horizontal Pod Autoscaler - Amazon EKS

Horizontal Pod Autoscaler

Kubernetes Horizontal Pod Autoscaler は、そのリソースの CPU 使用率に基づいて、デプロイ、レプリケーションコントローラー、またはレプリカセット内のポッドの数を自動的にスケーリングします。これにより、アプリケーションは需要の増加に合わせてスケールアウトしたり、リソースが不要になったときにスケールインしたりできるため、ノードを他のアプリケーションに解放できます。ターゲットの CPU 使用率を設定すると、Horizontal Pod Autoscaler はターゲットを満たすようにアプリケーションをスケールインまたはスケールアウトします。

Horizontal Pod Autoscaler は、Kubernetes の標準の API リソースで、Amazon EKS クラスターにメトリクスソース(Kubernetes メトリクスサーバーなど)がインストールされているだけで動作します。アプリケーションのスケーリングを開始するために、クラスターに Horizontal Pod Autoscaler をデプロイまたはインストールする必要はありません。詳細については、Kubernetes ドキュメントの「Horizontal Pod Autoscaler」を参照してください。

このトピックでは、Amazon EKS クラスターの Horizontal Pod Autoscaler の準備や、サンプルアプリケーションで動作することの確認方法を説明しています。

注記

このトピックは、Kubernetes ドキュメントの「Horizontal Pod Autoscaler ウォークスルー」に基づいています。

Prerequisites

Horizontal Pod Autoscaler テストアプリケーションを実行する

このセクションでは、サンプルアプリケーションをデプロイして、Horizontal Pod Autoscaler が動作していることを確認します。

注記

この例は、Kubernetes ドキュメントの「Horizontal Pod Autoscaler Walkthrough」に基づいています。

Horizontal Pod Autoscaler のインストールをテストするには

  1. 次のコマンドを使用して、シンプルな Apache ウェブサーバーアプリケーションをデプロイします。

    kubectl apply -f https://k8s.io/examples/application/php-apache.yaml

    この Apache ウェブサーバーポッドには 500 millicpu の CPU 制限が与えられ、ポート 80 で提供されています。

  2. php-apache デプロイ用の Horizontal Pod Autoscaler リソースを作成します。

    kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

    このコマンドは、デプロイの CPU 使用率が 50%、ポッドが最低 1 つ、ポッドが最大 10 個の Autoscaler を作成します。CPU の平均負荷が 50% を下回ると、Autoscaler はデプロイのポッド数を最小の 1 に減らそうとします。負荷が 50 パーセントを超えると、Autoscaler はデプロイのポッド数を最大の 10 まで増やそうとします。詳細については、Kubernetes ドキュメント の「Horizontal Pod Autoscaler の仕組み」を参照してください。

  3. 詳細を表示するには、次のコマンドで Autoscaler を説明します。

    kubectl describe hpa

    出力:

    Name: php-apache Namespace: default Labels: <none> Annotations: <none> CreationTimestamp: Thu, 11 Jun 2020 16:05:41 -0500 Reference: Deployment/php-apache Metrics: ( current / target ) resource cpu on pods (as a percentage of request): <unknown> / 50% Min replicas: 1 Max replicas: 10 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: did not receive metrics for any ready pods Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedGetResourceMetric 42s (x2 over 57s) horizontal-pod-autoscaler unable to get metrics for resource cpu: no metrics returned from resource metrics API Warning FailedComputeMetricsReplicas 42s (x2 over 57s) horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API Warning FailedGetResourceMetric 12s (x2 over 27s) horizontal-pod-autoscaler did not receive metrics for any ready pods Warning FailedComputeMetricsReplicas 12s (x2 over 27s) horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: did not receive metrics for any ready pods

    ご覧のように、現在の CPU 負荷は <unknown> です。サーバーにまだ負荷がないためです。ポッド数は既に最低の境界 (1) にあるため、スケールインすることはできません。

  4. コンテナを実行して、ウェブサーバーのロードを作成します。

    kubectl run -it --rm load-generator --image=busybox /bin/sh --generator=run-pod/v1

    数秒後にコマンドプロンプトが表示されない場合は、Enter を押す必要があります。コマンドプロンプトから次のコマンドを入力して負荷を生成し、Autoscaler によってデプロイをスケールアウトさせます。

    while true; do wget -q -O- http://php-apache; done
  5. デプロイのスケールアウトを監視するには、前のステップを実行したターミナルとは別のターミナルで次のコマンドを定期的に実行します。

    kubectl get hpa

    出力:

    NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 250%/50% 1 10 5 4m44s

    実際の CPU のパーセンテージが目標のパーセンテージよりも高い限り、レプリカの数は最大 10 まで増加します。この場合は 250% のため、REPLICAS の数は増え続けます。

    注記

    レプリカの数が最大値に達するまで、数分かかる場合があります。例えば、CPU 負荷が 50% 以下になるために必要なレプリカの数が 6 だけの場合、負荷はレプリカの数 6 を超えてスケールすることはありません。

  6. 負荷を停止します。(ステップ 4 で) 負荷を生成しているターミナルウィンドウで、Ctrl+C キーを押して負荷を停止します。次のコマンドを再度実行することで、レプリカの数が 1 にスケールバックされるのを見ることができます。

    kubectl get hpa

    出力

    NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 10 1 25m
    注記

    現在の CPU の割合が 0% であっても、スケールダウンのデフォルトの時間枠は 5 分であるため、レプリカの数が 1 に再び達するまでには時間がかかります。時間枠は変更可能です。詳細については、Kubernetes ドキュメントの「Horizontal Pod Autoscaler」を参照してください。

  7. サンプルアプリケーションのテストが終了したら、php-apache リソースを削除します。

    kubectl delete deployment.apps/php-apache service/php-apache horizontalpodautoscaler.autoscaling/php-apache