AKS クラスターのアップグレード中の SubnetIsFull エラー コードのトラブルシューティング

まとめ

この記事では、Azure Kubernetes Service (AKS) クラスターをアップグレードするときに発生する SubnetIsFull エラーを特定して解決する方法について説明します。 アップグレードを正常に完了するのに役立ちます。

エラー メッセージの例を次に示します。

Kubernetes サービス '<NAME>' のノード プール <AGENT POOL NAME>' をスケーリングできませんでした。 エラー: VMSSAgentPoolReconciler の再試行に失敗しました: Code='SubnetIsFull' Message='<SUBNET NAME>\ のアドレス プレフィックス <PREFIX>\ に IP アドレス用の十分な容量がありません。' 詳細=[]

[前提条件]

この記事では、Azure CLI バージョン 2.0.65 以降のバージョンが必要です。 バージョン番号を見つけるには、 az --versionを実行します。 Azure CLIをインストールまたはアップグレードする必要がある場合は、「Azure CLIを参照してください。

アップグレード プロセスの詳細については、「 Azure Kubernetes Service (AKS) クラスターをアップグレードする」の「AKS クラスターのアップグレード」セクションを参照してください。

症状

AKS クラスターのアップグレードが失敗し、"SubnetIsFull" というエラー メッセージが表示されます。

原因

このエラーは、クラスターに新しいノードを作成するための十分な IP アドレスがない場合に発生します。

アップグレードまたはスケーリング操作を計画する場合は、必要な IP アドレスの数を考慮してください。 クラスターで構成した IP アドレス範囲が固定数のノードのみをサポートしている場合、アップグレードまたはスケーリング操作は失敗します。 詳細については、 Azure Kubernetes Service (AKS) クラスターの IP アドレス計画に関するページを参照してください。

サブネットで使用可能な IP を確認する

修正アクションを実行する前に、AKS クラスターに関連付けられているサブネットで使用可能な IP アドレスの数を確認します。

Azure ポータルで使用可能な IP アドレスを確認するには:

  1. 仮想ネットワーク サービスに移動します。
  2. AKS クラスターに関連付けられている仮想ネットワークを選択します。
  3. メニューで[サブネット]を選択 します
  4. クラスターで使用するサブネットの [使用可能な IP] 列を確認します。

または、次のAzure CLIコマンドを実行して、使用可能な IP を確認することもできます。

# Get the subnet resource ID for the node pool.
# For clusters that use a custom VNet, the subnet ID is stored in the agent pool profile:
SUBNET_ID=$(az aks show \
    --resource-group <RESOURCE_GROUP> \
    --name <CLUSTER_NAME> \
    --query "agentPoolProfiles[0].vnetSubnetId" \
    --output tsv)

# If the cluster uses a managed VNet (SUBNET_ID is empty),
# retrieve the subnet from the node resource group instead:
if [[ -z "$SUBNET_ID" ]]; then
    NODE_RESOURCE_GROUP=$(az aks show \
        --resource-group <RESOURCE_GROUP> \
        --name <CLUSTER_NAME> \
        --query "nodeResourceGroup" \
        --output tsv)

    SUBNET_ID=$(az network vnet list \
        --resource-group "$NODE_RESOURCE_GROUP" \
        --query "[0].subnets[0].id" \
        --output tsv)
fi

# Display the subnet details and calculate available IPs
az network vnet subnet show \
    --ids "$SUBNET_ID" \
    --query "{SubnetName:name, AddressPrefix:addressPrefix, UsedIPs:length(ipConfigurations || \`[]\`)}" \
    --output json | jq -r '
    .AddressPrefix as $prefix |
    ($prefix | split("/")[1] | tonumber) as $prefixLen |
    pow(2; 32 - $prefixLen) as $totalIPs |
    5 as $reserved |
    (.UsedIPs // 0) as $used |
    ($totalIPs - $reserved - $used) as $available |
    ["SubnetName", "AddressPrefix", "TotalIPs", "UsedIPs", "AzureReserved", "AvailableIPs"],
    [.SubnetName, $prefix, ($totalIPs | tostring), ($used | tostring), ($reserved | tostring), ($available | tostring)]
    | @tsv' | column -t

出力は次の例のようになります。

SubnetName  AddressPrefix  TotalIPs  UsedIPs  AzureReserved  AvailableIPs
aks-subnet  xx.xxx.x.x/16  65536     327      5              65204

Note

このスクリプトでは 、jq をインストールする必要があります。 Azureでは、各サブネットに 5 つの IP アドレスが予約されます。 詳細については、「 これらのサブネット内での IP アドレスの使用に関する制限はありますか?」を参照してください。

使用可能な IP の数が少ない (たとえば、アップグレード中に追加するノードの数より少ない) 場合は、次のセクションのソリューションに進みます。

解決策

Important

このセクションの手順は 予防的です。 これは、アップグレードまたはスケール操作 の前に 適用された場合に有効です。そうしないと、サブネットが使い果たされます。 アップグレードが既に失敗し、影響を受けるノード プールが Failed プロビジョニング状態である場合は、 ノード プールが失敗したプロビジョニング状態のときにも、回復の手順に従います。

クラスター ノードを減らして、アップグレード用の IP アドレスを予約します。

スケールダウンがオプションではなく、仮想ネットワーク CIDR に十分な IP アドレスがある場合は、 一意のサブネットを持つノード プールを追加してみてください。

  1. より大きなサブネット上の仮想ネットワークに新しいユーザー ノード プールを追加します。
  2. 元のノード プールをシステム ノード プールの種類に切り替えます。
  3. ユーザー ノード プールをスケールアップします。
  4. 元のノード プールをスケールダウンします。

ノード プールがプロビジョニングに失敗した状態のときの復旧

SubnetIsFullでアップグレードが失敗した場合、影響を受ける AKS ノード プールとその基になる仮想マシン スケール セット (VMSS) は、Failedプロビジョニング状態のまま残すことができます。 状態を確認するには、次を実行します。

az aks nodepool show \
    --resource-group <RESOURCE_GROUP> \
    --cluster-name <CLUSTER_NAME> \
    --name <NODEPOOL_NAME> \
    --query "provisioningState" \
    --output tsv

ノード プールがこの状態の後:

  • 同じノード プールに対する後続の操作 ( az aks nodepool scaleaz aks nodepool upgrade、元のアップグレードの再試行など) は、他のノード プールのスケールダウンによって IP アドレスが解放された後でも 、成功することは保証されません
  • 障害 発生後 に IP アドレスを解放することは、それ自体で信頼性の高い復旧メカニズムではありません。

推奨される復旧パスは、十分な IP 容量を持つサブネットに新しいノード プールを追加し、障害が発生したプールからワークロードを移動することです。

  1. ターゲット ノード数と maxPods 設定に十分な空き IP を持つ新しいノード プールをサブネットに追加します。 「一意のサブネットを持つノード プールを追加する」を参照してください。
  2. 障害が発生したノード プールからワークロードを切断してドレインし、新しいノード プールに再スケジュールされるようにします。
  3. az aks nodepool deleteを使用して、障害が発生したノード プールを削除します。
  4. 繰り返しを避けるために 、AKS クラスターの IP アドレス計画を 使用して将来のアップグレードを計画します。

Note

障害が発生したノード プールをゼロまでスケールダウンしてから再度スケールアップする方法を、復旧手段として当てにしないでください。 このパターンでは、Failedが原因で既にSubnetIsFullプロビジョニング状態にある VMSS を調整することは保証されません。 クラスターにノード プールが 1 つしか存在しない場合は、破壊的操作を試みる前にAzure サポートに連絡してください。

Resources