Felsöka felkoden SubnetIsFull under en AKS-klusteruppgradering

Sammanfattning

Den här artikeln beskriver hur du identifierar och löser felet SubnetIsFull som uppstår när du uppgraderar ett Azure Kubernetes Service (AKS) kluster. Det hjälper dig att slutföra uppgraderingen.

Här är ett exempel på felmeddelandet:

Det gick inte att skala nodpoolens <AGENT-POOLNAMN> i Kubernetes-tjänsten "<NAME>". Fel: VMSSAgentPoolReconciler-återförsök misslyckades: Code='SubnetIsFull' Message='<SUBNET NAME>\ med adressprefix <PREFIX>\ har inte tillräckligt med kapacitet för IP-adresser.' Detaljer=[]

Förutsättningar

Den här artikeln kräver Azure CLI version 2.0.65 eller en senare version. Om du vill hitta versionsnumret kör du az --version. Om du behöver installera eller uppgradera Azure CLI kan du läsa Så här installerar du Azure CLI.

Mer detaljerad information om uppgraderingsprocessen finns i avsnittet "Uppgradera ett AKS-kluster" i Uppgradera ett AKS-kluster (Azure Kubernetes Service).

Symptome

En AKS-klusteruppgradering misslyckas och du får felmeddelandet "SubnetIsFull".

Orsak

Det här felet uppstår om klustret inte har tillräckligt med IP-adresser för att skapa en ny nod.

När du planerar en uppgraderings- eller skalningsåtgärd bör du överväga antalet nödvändiga IP-adresser. Om IP-adressintervallet som du konfigurerade i klustret endast stöder ett fast antal noder misslyckas uppgraderings- eller skalningsåtgärden. Mer information finns i IP-adressplanering för dina AKS-kluster (Azure Kubernetes Service).

Kontrollera tillgängliga IP-adresser i undernätet

Innan du vidtar korrigerande åtgärder kontrollerar du hur många IP-adresser som är tillgängliga i det undernät som är associerat med ditt AKS-kluster.

Så här kontrollerar du tillgängliga IP-adresser i portalen Azure:

  1. Gå till tjänsten Virtuella nätverk .
  2. Välj det virtuella nätverk som är associerat med ditt AKS-kluster.
  3. I menyn väljer du Undernät.
  4. Granska kolumnen Tillgängliga IP-adresser för det undernät som klustret använder.

Du kan också köra följande Azure CLI kommandon för att kontrollera tillgängliga IP-adresser:

# 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

Utdata liknar följande exempel:

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

Anmärkning

Det här skriptet kräver att jq installeras. Azure reserverar fem (5) IP-adresser i varje undernät. Mer information finns i Finns det några begränsningar för att använda IP-adresser i dessa undernät?.

Om antalet tillgängliga IP-adresser är lågt (till exempel färre än antalet noder som du lägger till under uppgraderingen) fortsätter du med lösningen i nästa avsnitt.

Lösning

Minska klusternoderna för att reservera IP-adresser för uppgraderingen.

Om nedskalning inte är ett alternativ och det virtuella nätverkets CIDR har tillräckligt med IP-adresser kan du försöka lägga till en nodpool som har ett unikt undernät:

  1. Lägg till en ny användarnodpool i det virtuella nätverket i ett större undernät.
  2. Växla den ursprungliga nodpoolen till en systemnodpoolstyp.
  3. Skala upp användarnodpoolen.
  4. Skala ned den ursprungliga nodpoolen.

Resources