Kubernetes Horizontal Pod Autoscalerの使用

Kubernetes Horizontal Pod Autoscalerを使用して、Container Engine for Kubernetes (OKE)を使用して作成したクラスタ上のポッドの数を自動的にスケーリングする方法をご覧ください。

Kubernetes Horizontal Pod Autoscalerを使用すると、デプロイメント、レプリケーション・コントローラ、レプリカ・セットまたはステートフル・セット内のポッド数を、そのリソースのCPUまたはメモリー使用率、あるいはその他のメトリックに基づいて自動的にスケーリングできます。Horizontal Pod Autoscalerは、需要の増加に合せてアプリケーションをスケール・アウトしたり、リソースが不要になったときにスケール・インするのに役立ちます。アプリケーションをスケーリングするときにHorizontal Pod Autoscalerが満たすターゲット・メトリックのパーセンテージを設定できます。詳細は、KubernetesドキュメントのHorizontal Pod Autoscalerを参照してください。

Horizontal Pod Autoscalerは、Kubernetesの標準APIリソースであり、クラスタにKubernetesメトリック・サーバーなどのメトリック・ソースをインストールする必要があります。詳細は、クラスタへのKubernetesメトリック・サーバーのデプロイを参照してください。

Horizontal Pod Autoscalerに関するノート

次の点に注意してください:

  • Kubernetesメトリック・サーバーでは、CPUとメモリーの使用率に基づくスケーリングのみがサポートされます。KubernetesメトリックAPIのその他の実装では、カスタム・メトリックに基づくスケーリングがサポートされています。Kubernetesのドキュメントで代替実装のリスト(Implementations)およびカスタム・メトリックに基づくスケーリングの詳細(Autoscaling on multiple metrics and custom metrics)を参照してください。
  • Horizontal Pod Autoscalerを使用せずにマニフェスト・ファイルを更新することで、アプリケーションを手動でスケーリングできます。
  • Kubernetes Horizontal Pod Autoscalerは、管理対象ノード・プールと仮想ノード・プールの両方で使用できます。

Horizontal Pod Autoscalerの操作

次の手順は、KubernetesドキュメントのHorizontal Pod Autoscaler Walkthroughトピックに基づいています。次の方法について説明します:

  • Kubernetesメトリック・サーバーがクラスタにインストールされていることを確認します。
  • サンプルphp-apache Webサーバーをデプロイします。
  • CPU使用率に基づいてスケーリングするHorizontal Pod Autoscalerを作成します。
  • サンプル・ロードの生成を開始します。
  • 実行中のスケーリング操作を表示します。
  • サンプルの負荷の生成を停止します。
  • php-apache WebサーバーおよびHorizontal Pod Autoscalerを削除してクリーンアップします。

ステップ1: Kubernetesメトリック・サーバーのインストールの検証

  1. まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
  2. 次のように入力して、Kubernetesメトリック・サーバーがクラスタに正常にデプロイされ、使用可能であることを確認します:

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

    コマンドで見つからないというエラーが返される場合は、続行する前にKubernetesメトリック・サーバーをクラスタにデプロイする必要があります。クラスタへのKubernetesメトリック・サーバーのデプロイを参照してください。

ステップ2: サンプル・アプリケーションのデプロイ

次のように入力して、単純なApache Webサーバー・アプリケーションをデプロイします:

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

前述のコマンドの出力により、デプロイメントが確認されます:

deployment.apps/php-apache created
service/php-apache created

マニフェスト・ファイルから作成されるApache Webサーバー・ポッド:

  • 500mのCPU制限があり、コンテナは500ミリコア、つまりコアの1/2を超えて使用することはありません。
  • 200mのCPUリクエスト許容量があり、コンテナは200ミリコアのCPUリソース、つまりコアの1/5を使用できます。

ステップ3: Horizontal Pod Autoscalerリソースの作成

  1. 次のように入力して、最小1レプリカ、最大10レプリカ、および平均CPU使用率50%を維持するHorizontal Pod Autoscalerリソースを作成します:

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

    前述のコマンドの出力で、Horizontal Pod Autoscalerが作成されたことを確認できます。

    horizontalpodautoscaler.autoscaling/php-apache autoscaled

    このコマンドは、次のようなApache Webサーバー・デプロイメントのHorizontal Pod Autoscalerを作成します:

    • Apache Webサーバー・デプロイメントによって制御される、以前に作成されたポッドの最小1個および最大10個のレプリカを保持します。
    • すべてのポッドで平均CPU使用率を50%に維持するために、デプロイメントのレプリカ数を増減します。

    平均CPU使用率が50%を下回った場合、Horizontal Pod Autoscalerはデプロイメント内のポッド数を最小に減らします(この場合は1)。平均CPU使用率が50%を超えた場合、Horizontal Pod Autoscalerはデプロイメント内のポッド数を最大数(この場合は10)まで増やします。詳細は、KubernetesドキュメントのHow does the Horizontal Pod Autoscaler work?を参照してください。

    kubectl autoscaleコマンドの詳細は、Kubernetesドキュメントのautoscaleを参照してください。

  2. しばらくしてから、次のように入力して、Horizontal Pod Autoscalerの現在のステータスを確認します:

    kubectl get hpa

    前述のコマンドの出力に、現在のステータスが表示されます:

    NAME       REFERENCE             TARGETS MINPODS MAXPODS REPLICAS AGE
    php-apache Deployment/php-apache 0%/50%  1       10      1        10s

    TARGETS列には、Apache Webサーバー・デプロイメントによって制御されるすべてのポッドの平均CPU使用率が表示されます。サーバーにリクエストが送信されていないため、前述の例では、ターゲット使用率が50%であるのに対し、現在のCPU使用率は0%であることを示しています。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。

ステップ4: サンプルの負荷の生成の開始

  1. 次のように入力して、busyboxイメージを含むコンテナを実行し、Apache Webサーバーの負荷を作成します:

    kubectl run -it --rm load-generator --image=busybox /bin/sh
  2. 次のように入力して、Horizontal Pod Autoscalerでデプロイメントをスケール・アウトするApache Webサーバーの負荷を生成します:

    while true; do wget -q -O- http://php-apache; done

ステップ5: スケーリング操作の表示

  1. しばらくしてから新しいターミナル・ウィンドウを開き、次のように入力してHorizontal Pod Autoscalerの現在のステータスを確認します:

    kubectl get hpa

    前述のコマンドの出力に、現在のステータスが表示されます:

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

    前述の例では、ターゲット使用率が50%であるのに対し、現在のCPU使用率が250%に増加していることがわかります。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。

    使用率ターゲットである50%を達成するには、Horizontal Pod Autoscalerでレプリカの数を増やしてデプロイメントをスケール・アウトする必要があります。

  2. 数分後、次のように再入力して、増加したレプリカの数を確認します:

    kubectl get hpa

    前述のコマンドの出力に、現在のステータスが表示されます:

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

    前述の例では、Horizontal Pod Autoscalerがデプロイメントのサイズを5レプリカに変更し、使用率のターゲットである50%を達成したことがわかります。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。

  3. 次のように入力して、デプロイメントがスケール・アウトされたことを確認します:

    kubectl get deployment php-apache

    前述のコマンドの出力に、現在のステータスが表示されます:

    NAME       READY UP-TO-DATE AVAILABLE AGE
    php-apache 5/5   5          5         5m

    コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。

ステップ6: サンプルの負荷の生成の停止

  1. busyboxイメージを使用してコンテナを作成し、Apache Webサーバーの負荷を生成したターミナル・ウィンドウで:
    1. Ctrl+Cを押して負荷の生成を終了します
    2. 次のように入力してコマンド・プロンプトを閉じます:
      exit

      前述のコマンドの出力では、セッションが終了したことが確認されます:

      Session ended, resume using 'kubectl attach load-generator -c load-generator -i -t' command when the pod is running
      pod "load-generator" deleted
  2. しばらくしてから、次のように入力して、Horizontal Pod Autoscalerの現在のステータスを確認します:
    kubectl get hpa

    前述のコマンドの出力に、現在のステータスが表示されます:

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

    前述の例では、ターゲット使用率が50%であるのに対し、現在のCPU使用率が0%に減少していることがわかります。ただし、デプロイメントにはまだ5つのレプリカがあります。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。

  3. 数分後、次のように再入力して、減少したレプリカの数を確認します:

    kubectl get hpa

    前述のコマンドの出力に、現在のステータスが表示されます:

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

    前述の例では、Horizontal Pod Autoscalerがデプロイメントのサイズを1レプリカに変更したことがわかります。

    レプリカ数が1に削減されるまで時間がかかることに注意してください。スケール・インのデフォルトの時間枠は5分です。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。

  4. 次のように入力して、デプロイメントがスケール・インされたことを確認します:

    kubectl get deployment php-apache

    前述のコマンドの出力に、現在のステータスが表示されます:

    NAME       READY UP-TO-DATE AVAILABLE AGE
    php-apache 1/1   1          1         15m

    コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。

ステップ7: クリーンアップ

  1. 次のように入力して、Horizontal Pod Autoscalerを削除します:

    kubectl delete horizontalpodautoscaler.autoscaling/php-apache

    Horizontal Pod Autoscalerを削除しても、レプリカの数は変わりません。デプロイメントは、Horizontal Pod Autoscalerの作成前の状態に自動的には戻りません。

  2. 次のように入力して、Apache Webサーバー・デプロイメントを削除します:

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