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

Important

I passaggi descritti in questa sezione sono preventivi. Sono efficaci quando vengono applicate prima di un'operazione di aggiornamento o ridimensionamento che altrimenti esaurirebbe la subnet. Se l'aggiornamento non è già riuscito e il pool di nodi interessato si trova in Failed uno stato di provisioning, seguire anche la procedura descritta in Ripristino quando il pool di nodi si trova in uno stato di provisioning non riuscito.

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.

Ripristino quando il pool di nodi si trova in uno stato di provisioning non riuscito

Quando un aggiornamento ha esito negativo con SubnetIsFull, il pool di nodi AKS interessato e il set di scalabilità di macchine virtuali (VMSS) sottostante possono rimanere in uno stato di provisioning Failed. Per controllare lo stato, eseguire:

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

Dopo che il pool di nodi è in questo stato:

  • Non è garantito che le operazioni successive sullo stesso pool di nodi (ad esempio az aks nodepool scale, az aks nodepool upgrade o il nuovo tentativo dell'aggiornamento originale) riescano, anche dopo che gli indirizzi IP vengono liberati riducendo gli altri pool di nodi.
  • Liberare gli indirizzi IP dopo il guasto non è, da solo, un meccanismo di ripristino affidabile.

Il percorso di ripristino consigliato consiste nell'aggiungere un nuovo pool di nodi in una subnet con capacità IP sufficiente e spostare i carichi di lavoro dal pool non riuscito:

  1. Aggiungere un nuovo pool di nodi in una subnet con un numero sufficiente di indirizzi IP liberi per il numero di nodi di destinazione e per l'impostazione maxPods. Vedere Aggiungere un pool di nodi con una subnet univoca.
  2. Impedisce e svuota i carichi di lavoro dal pool di nodi non riusciti in modo che vengano riprogrammati nel nuovo pool di nodi.
  3. Eliminare il pool di nodi non riuscito usando az aks nodepool delete.
  4. Pianifica gli aggiornamenti futuri usando la pianificazione degli indirizzi IP per i cluster AKS per evitare che il problema si ripresenti.

Annotazioni

Non fare affidamento sul ridimensionamento del pool di nodi guasto portandolo a zero e poi aumentandolo nuovamente come meccanismo di ripristino. Questo modello non garantisce di riconciliare un set di scalabilità di macchine virtuali già in uno stato di provisioning Failed a causa di SubnetIsFull. Se il cluster ha un solo pool di nodi ed è in questo stato, contattare supporto tecnico di Azure prima di tentare operazioni distruttive.

Resources