Risolvere i problemi relativi al codice di errore SubnetIsFull durante un aggiornamento di un cluster AKS

Sommario

Questo articolo illustra come identificare e risolvere l'errore SubnetIsFull che si verifica quando si aggiorna un cluster Servizio Azure Kubernetes (AKS). Consente di completare correttamente l'aggiornamento.

Ecco un esempio del messaggio di errore:

Impossibile ridimensionare il pool di nodi <NOME POOL AGENTE> nel servizio Kubernetes '<NAME>'. Errore: Tentativo di ripetizione vmSSAgentPoolReconciler non riuscito: Code='SubnetIsFull' Message='<SUBNET NAME>\ con prefisso <indirizzo PREFIX>\ non ha capacità sufficiente per gli indirizzi IP". Dettagli=[]

Prerequisiti

Questo articolo richiede l'interfaccia della riga di comando di Azure versione 2.0.65 o successiva. Per trovare il numero di versione, eseguire az --version. Se è necessario installare o aggiornare interfaccia della riga di comando di Azure, vedere Come installare il interfaccia della riga di comando di Azure.

Per informazioni più dettagliate sul processo di aggiornamento, vedere la sezione "Aggiornare un cluster AKS" in Aggiornare un cluster del servizio Azure Kubernetes.

Sintomi

L'aggiornamento di un cluster AKS (Azure Kubernetes Services) non riesce e si riceve un messaggio di errore "SubnetIsFull".

Motivo

Questo errore si verifica se il cluster non dispone di indirizzi IP sufficienti per creare un nuovo nodo.

Quando si pianifica un'operazione di aggiornamento o ridimensionamento, prendere in considerazione il numero di indirizzi IP necessari. Se l'intervallo di indirizzi IP configurato nel cluster supporta solo un numero fisso di nodi, l'operazione di aggiornamento o ridimensionamento non riesce. Per altre informazioni, vedere Pianificazione degli indirizzi IP per i cluster del servizio Azure Kubernetes.

Controllare gli indirizzi IP disponibili nella subnet

Prima di intraprendere un'azione correttiva, verificare il numero di indirizzi IP disponibili nella subnet associata al cluster del servizio Azure Kubernetes.

Per controllare gli indirizzi IP disponibili nel portale Azure:

  1. Passare al servizio Reti virtuali .
  2. Seleziona la rete virtuale associata al tuo cluster AKS.
  3. Nel menu selezionare Subnet.
  4. Esaminare la colonna Indirizzi IP disponibili per la subnet usata dal cluster.

In alternativa, è possibile eseguire i comandi di interfaccia della riga di comando di Azure seguenti per controllare gli indirizzi IP disponibili:

# 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

L'output sarà simile al seguente esempio:

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

Annotazioni

Questo script richiede l'installazione di jq . Azure riserva cinque (5) indirizzi IP in ogni subnet. Per altre informazioni, vedere Esistono restrizioni sull'uso di indirizzi IP all'interno di queste subnet?

Se il numero di indirizzi IP disponibili è basso(ad esempio, meno del numero di nodi che si sta aggiungendo durante l'aggiornamento), procedere con la soluzione nella sezione successiva.

Soluzione

Ridurre i nodi del cluster per riservare gli indirizzi IP per l'aggiornamento.

Se la riduzione delle prestazioni non è un'opzione e il CIDR della rete virtuale dispone di indirizzi IP sufficienti, provare ad aggiungere un pool di nodi con una subnet univoca:

  1. Aggiungere un nuovo pool di nodi utente nella rete virtuale in una subnet più grande.
  2. Passa il pool di nodi originale a un tipo di pool di nodi di sistema.
  3. Aumentare le prestazioni del pool di nodi utente.
  4. Ridurre il pool di nodi originale.

Resources