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 の数が少ない (たとえば、アップグレード中に追加するノードの数より少ない) 場合は、次のセクションのソリューションに進みます。

解決策

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

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

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

Resources