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 に変更します。

  1. i キーでインサートモードに入る
  2. ClusterIPLoadBalancer に書き換える
  3. Esc キーを押す
  4. :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のスケーリング機能を使いこなすことで、トラフィックの増減に柔軟に対応できるシステムを構築できます。