Kubernetes Horizontal Pod Autoscalerの使用
Kubernetes Horizontal Pod Autoscalerを使用して、Kubernetes Engine (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メトリック・サーバーのインストールの検証
-
まだ実行していない場合は、ステップに従って、クラスタのkubeconfig構成ファイルを設定し、(必要に応じて)そのファイルを指すようにKUBECONFIG環境変数を設定します。自分のkubeconfigファイルを設定する必要があります。別のユーザーが設定したkubeconfigファイルを使用してクラスタにアクセスすることはできません。クラスタ・アクセスの設定を参照してください。
-
次のように入力して、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レプリカ、最大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を参照してください。 -
しばらくしてから、次のように入力して、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: サンプルの負荷の生成の開始
-
次のように入力して、busyboxイメージを含むコンテナを実行し、Apache Webサーバーの負荷を作成します:
kubectl run -it --rm load-generator --image=busybox /bin/sh
-
次のように入力して、Horizontal Pod Autoscalerでデプロイメントをスケール・アウトするApache Webサーバーの負荷を生成します:
while true; do wget -q -O- http://php-apache; done
ステップ5: スケーリング操作の表示
-
しばらくしてから新しいターミナル・ウィンドウを開き、次のように入力して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でレプリカの数を増やしてデプロイメントをスケール・アウトする必要があります。
-
数分後、次のように再入力して、増加したレプリカの数を確認します:
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%を達成したことがわかります。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。
-
次のように入力して、デプロイメントがスケール・アウトされたことを確認します:
kubectl get deployment php-apache
前述のコマンドの出力に、現在のステータスが表示されます:
NAME READY UP-TO-DATE AVAILABLE AGE php-apache 5/5 5 5 5m
コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。
ステップ6: サンプルの負荷の生成の停止
- busyboxイメージを使用してコンテナを作成し、Apache Webサーバーの負荷を生成したターミナル・ウィンドウで:
Ctrl+C
を押して負荷の生成を終了します- 次のように入力してコマンド・プロンプトを閉じます:
exit
前述のコマンドの出力では、セッションが終了したことが確認されます:
Session ended, resume using 'kubectl attach load-generator -c load-generator -i -t' command when the pod is running pod "load-generator" deleted
- しばらくしてから、次のように入力して、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つのレプリカがあります。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。
-
数分後、次のように再入力して、減少したレプリカの数を確認します:
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分です。コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。
-
次のように入力して、デプロイメントがスケール・インされたことを確認します:
kubectl get deployment php-apache
前述のコマンドの出力に、現在のステータスが表示されます:
NAME READY UP-TO-DATE AVAILABLE AGE php-apache 1/1 1 1 15m
コマンドを実行するまでの待機時間によって、表示される数値が異なる場合があります。
ステップ7: クリーンアップ
-
次のように入力して、Horizontal Pod Autoscalerを削除します:
kubectl delete horizontalpodautoscaler.autoscaling/php-apache
Horizontal Pod Autoscalerを削除しても、レプリカの数は変わりません。デプロイメントは、Horizontal Pod Autoscalerの作成前の状態に自動的には戻りません。
-
次のように入力して、Apache Webサーバー・デプロイメントを削除します:
kubectl delete deployment.apps/php-apache service/php-apache