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 ウォークスルー」に基づいています。

メトリクスサーバーのインストール

Kubernetes メトリクスサーバーは、クラスター内のリソース使用状況データを集約します。メトリクスサーバーは、デフォルトでは Amazon EKS クラスターにデプロイされませんが、Horizontal Pod Autoscaler に必要なメトリクスを提供します。このトピックでは、Kubernetes メトリクスサーバーを Amazon EKS クラスターにデプロイする方法について説明します。

メトリクスサーバーをクラスターにすでにデプロイしている場合は、次のセクションに進むことができます。次のコマンドを使用して、メトリクスサーバーを確認できます。

kubectl -n kube-system get deployment/metrics-server

このコマンドで NotFound エラーが返された場合は、メトリクスサーバーを Amazon EKS クラスターにデプロイする必要があります。

メトリクスサーバーをデプロイするには

  1. 次のコマンドを使用してメトリクスサーバーをデプロイします。

    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml
  2. 次のコマンドを使用して、metrics-server デプロイメントで必要な数のポッドが実行されていることを確認します。

    kubectl get deployment metrics-server -n kube-system

    出力

    NAME READY UP-TO-DATE AVAILABLE AGE metrics-server 1/1 1 1 6m

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。 コマンド プロンプトから、次のコマンドを入力して負荷を生成し、オートスケーラに展開をスケールアウトさせます。

    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
    注記

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

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

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