AKSノードのスケーリング / AKSの基礎を理解するシリーズ Part. 12

この記事の内容

  • AKSノードプールの手動スケーリングで、ノード数を2台から1台に減らす方法を確認します
  • リソース不足によりPodが Pending 状態になる仕組みを実際に体験します
  • Azure CLIを使ってクラスターオートスケーラーを有効化し、ノードを自動的にスケールアウトさせます
  • ノードが増えることでPendingだったPodが起動する流れを観察します
  • ハンズオン後の後片付けとして、オートスケーラーの無効化とノード数の固定手順を確認します

ノードプールのスケーリング設定を確認する

AzureポータルでAKSクラスターを開き、設定 > ノードプール から「agentpool」を選択します。現在はノード数2で稼働しています。

ノードプールの設定画面には「スケーリング」セクションがあり、ここで手動または自動のスケーリングを選択できます。


手動スケーリングでノード数を1に減らす

まず手動スケーリングを選択してノード数を1に設定し、動作を確認します。設定を変更すると、プロビジョニングの状態が「スケーリング」となります。完了までおよそ5分ほどかかります。

スケーリングが完了すると、1ノードが「準備完了」の状態になります。


1ノードの状態でアプリケーションをデプロイする

ノードが1台になったところで、ゲストブックアプリケーションをデプロイして動作を確認します。Cloud Shellを起動し、ハンズオン用のディレクトリに移動します。

cd handson/azure/chapter04
kubectl create -f guestbook-all-in-one.yaml

リソース不足でPodをPending状態にする

デプロイ後、バックエンドのRedisレプリカ数を増やして、1台のノードではリソースが足りない状態を意図的に作ります。

kubectl scale deployment redis-replica --replicas=5

スケール後にPodの状態を確認します。

kubectl get pods

5台では問題なく動いてしまったため、さらにレプリカ数を増やします。

kubectl scale deployment redis-replica --replicas=10

再度状態を確認すると、一部のPodが Pending になっています。

kubectl get pods

Pending はリソースが不足していて起動できない状態を意味します。単純に待っても解消されるものではなく、ノードを増やしてリソースを確保する必要があります。


Azure CLIでオートスケーラーを有効化する

スケールアウトの方法は2つあります。

  1. ポータルからノードプールのスケーリング設定を変更する
  2. Azure CLIを使用する

今回はCLIで実施します。az aks nodepool update コマンドを使ってクラスターオートスケーラーを有効化します。

az aks nodepool update \
  --enable-cluster-autoscaler \
  --resource-group RG-HANDSON-AKS \
  --cluster-name handson-aks \
  --name agentpool \
  --min-count 1 \
  --max-count 2

このコマンドで、最小1台・最大2台のオートスケーリングが有効になります。設定完了後、ノードの状態を監視します。

kubectl get nodes --watch

オートスケーラーの設定が有効になってから実際にノードが増えるまでには、しばらく時間がかかります。


ノードが2台に増え、Podが起動する

しばらく待つと、ノードが2台に増えているのが確認できます。

kubectl get nodes

ノードが増えてリソースに余裕ができると、Pending だったPodが起動し始めます。

kubectl get pods

Podが終了・再作成されている様子が確認できます。これはVMのライブマイグレーションとは異なり、コンテナは一度終了させて新しく作り直す動作となります。

どのノードでPodが動いているかを確認するには、-o wide オプションを使います。

kubectl get pods -o wide

2台のノードのうち、一方に偏ってPodが配置されている場合もあります。


後片付け:オートスケーラーの無効化とノード数の固定

ハンズオンが完了したら、アプリケーションを削除し、次のハンズオンに備えてオートスケーラーを無効化します。

まずアプリケーションを削除します。

kubectl delete -f guestbook-all-in-one.yaml

次にオートスケーラーを無効化します。

az aks nodepool update \
  --disable-cluster-autoscaler \
  --resource-group RG-HANDSON-AKS \
  --cluster-name handson-aks \
  --name agentpool

最後にノード数を2で固定します。

az aks nodepool scale \
  --resource-group RG-HANDSON-AKS \
  --cluster-name handson-aks \
  --name agentpool \
  --node-count 2

なお、すでに2ノードの状態でこのコマンドを実行すると the new node count is the same as the current node count というエラーが表示されますが、これは既に目的の状態になっているため無視して問題ありません。


まとめ

この記事では、AKSノードプールのスケーリングについてハンズオン形式で確認しました。

  • ノードプールのスケーリングは、ポータルのGUIまたはAzure CLIのどちらからでも設定できます
  • リソースが不足するとPodが Pending 状態になり、ノードを増やすことで解消されます
  • az aks nodepool update --enable-cluster-autoscaler でオートスケーラーを有効化でき、--min-count--max-count で台数の範囲を指定します
  • ノードが増えると、Pendingだったコンテナは終了・再作成される形で新しいノードに展開されます(ライブマイグレーションとは異なる動作です)