Podのスケーリング / AKSの基礎を理解するシリーズ Part. 12
この記事の内容
- Kubernetesでは
kubectl scaleコマンドを使ってPodの数を手動で増減できます - Podは複数のノードにまたがってスケールアウトされます
- Horizontal Pod Autoscaler(HPA)を使うことで、CPU使用率に応じた自動スケーリングが可能です
- 負荷テストツール「hey」を使ってHPAの動作を実際に確認できます
- スケールインは負荷が下がってからしばらく時間がかかります
サンプルアプリケーションのデプロイ
まず、スケーリングを試すためのサンプルアプリケーション(Guestbook)をデプロイします。Cloud Shellを開き、以下のコマンドを実行します。
cd chapter04
kubectl create -f guestbook-all-in-one.yaml
デプロイが完了したら、サービスの状態を確認します。
kubectl get service
このサンプルではフロントエンドのサービスタイプが ClusterIP になっており、外部からアクセスできない状態です。外部公開するためにサービスのタイプを変更します。
サービスを外部公開する(LoadBalancer に変更)
kubectl edit コマンドでサービスを編集します。
kubectl edit service frontend
viエディターが起動しますので、type: ClusterIP の部分を type: LoadBalancer に変更します。
iキーでインサートモードに入るClusterIPをLoadBalancerに書き換えるEscキーを押す:wq!と入力してEnterキーを押す
編集後、External IPが付与されるまでウォッチで確認します。
kubectl get service -w
しばらくするとフロントエンドに External IP が付与されます。そのIPアドレスにブラウザでアクセスすると、Guestbookアプリケーションが動作していることを確認できます。
Podの状態を確認する
現在のPodの状態を確認します。
kubectl get pods
デフォルトの状態では、フロントエンドのPodが3つ、バックエンド(マスター+レプリカ)が3つ動いています。
手動スケーリング
kubectl scale コマンドを使って、フロントエンドのPod数を手動で6個に増やします。
kubectl scale deployment/frontend --replicas=6
スケールアウト後、Podの状態を確認します。
kubectl get pods
フロントエンドのPodが6個に増えていることが確認できます。さらに -o wide オプションを付けると、各Podがどのノードで動いているかも確認できます。
kubectl get pods -o wide
複数のノードにまたがってPodがスケールアウトされていることがわかります。このように、レプリカ数を指定するだけで簡単にスケールイン・スケールアウトできます。
Horizontal Pod Autoscaler(HPA)による自動スケーリング
手動でのスケーリングに加えて、HPAを使うとCPU使用率などのメトリクスに応じて自動でスケールさせることができます。
準備:レプリカ数を1に戻す
まず、フロントエンドのレプリカ数を1に戻しておきます。
kubectl scale deployment/frontend --replicas=1
HPAの設定ファイル
HPAのマニフェストファイル(hpa.yaml)の内容は以下のようになっています。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: frontend-scaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: frontend
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
この定義では、Pod数を最小1・最大10の間で自動管理し、CPU使用率が50%を超えた場合にスケールアウトするように設定しています。
HPAをデプロイする
kubectl create -f hpa.yaml
デプロイ後、HPAの状態を確認します。
kubectl get hpa
ターゲットのCPU使用率が50%、最小1・最大10のPodという設定で展開されていることがわかります。HPAのウォッチを開始しておきます。
kubectl get hpa -w
負荷テストで自動スケーリングを確認する
負荷テストツール「hey」のインストール
Goの hey モジュールを使ってサイトに負荷をかけます。まずインストールします。
go install github.com/rakyll/hey@latest
インストール後、バイナリのあるディレクトリに移動します。
cd ~/go/bin
負荷をかける
以下のコマンドでフロントエンドのExternal IPに大量のリクエストを送信します。
./hey -z 20m http://<External-IP>/
このコマンドは20分間にわたって大量のリクエストを送り続けます。
自動スケールアウトの観察
負荷をかけると、HPAがCPU使用率の上昇(770%超など)を検知し、Podが自動的に増え始めます。別のタブでPodの状態をウォッチしておくと、スケールアウトの様子が確認できます。
kubectl get pods -w
最終的にPodが最大数の10個まで増えることが確認できます。
負荷を止めてスケールインを確認する
Ctrl+C で負荷ツールを停止します。負荷が下がると、HPAがCPU使用率の低下を検知し、徐々にPod数が減っていきます。
kubectl describe hpa
describe コマンドで、HPAがどのようなメトリクスを追って判断しているかを確認できます。スケールインにはしばらく時間がかかりますが、最終的にPod数が減少していきます。
クリーンアップ
動作確認が完了したら、デプロイしたリソースを削除します。
kubectl delete -f hpa.yaml
kubectl delete -f guestbook-all-in-one.yaml
まとめ
今回は、AKS(Azure Kubernetes Service)におけるPodのスケーリングについて確認しました。kubectl scale コマンドを使った手動スケーリングでは、レプリカ数を指定するだけで複数ノードにまたがったスケールアウトが即座に実現できます。また、Horizontal Pod Autoscaler(HPA)を活用することで、CPU使用率などのメトリクスを監視しながら自動でスケールアウト・スケールインを行うことができます。実際に負荷テストツールを使って負荷をかけることで、HPAが動作してPodが自動増加する様子を視覚的に確認できました。Kubernetesのスケーリング機能を使いこなすことで、トラフィックの増減に柔軟に対応できるシステムを構築できます。