まとめ
この記事では、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 Kubernetes Service (AKS) クラスターをアップグレードする」の「AKS クラスターのアップグレード」セクションを参照してください。
症状
AKS クラスターのアップグレードが失敗し、"SubnetIsFull" というエラー メッセージが表示されます。
原因
このエラーは、クラスターに新しいノードを作成するための十分な IP アドレスがない場合に発生します。
アップグレードまたはスケーリング操作を計画する場合は、必要な IP アドレスの数を考慮してください。 クラスターで構成した IP アドレス範囲が固定数のノードのみをサポートしている場合、アップグレードまたはスケーリング操作は失敗します。 詳細については、 Azure Kubernetes Service (AKS) クラスターの IP アドレス計画に関するページを参照してください。
サブネットで使用可能な IP を確認する
修正アクションを実行する前に、AKS クラスターに関連付けられているサブネットで使用可能な IP アドレスの数を確認します。
Azure ポータルで使用可能な IP アドレスを確認するには:
- 仮想ネットワーク サービスに移動します。
- AKS クラスターに関連付けられている仮想ネットワークを選択します。
- メニューで[サブネット]を選択 します。
- クラスターで使用するサブネットの [使用可能な 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 アドレスがある場合は、 一意のサブネットを持つノード プールを追加してみてください。
- より大きなサブネット上の仮想ネットワークに新しいユーザー ノード プールを追加します。
- 元のノード プールをシステム ノード プールの種類に切り替えます。
- ユーザー ノード プールをスケールアップします。
- 元のノード プールをスケールダウンします。