Résoudre les problèmes liés au code d’erreur SubnetIsFull lors d’une mise à niveau d’un cluster AKS

Résumé

Cet article explique comment identifier et résoudre l’erreur SubnetIsFull qui se produit lorsque vous mettez à niveau un cluster Azure Kubernetes Service (AKS). Il vous aide à effectuer la mise à niveau avec succès.

Voici un exemple de message d’erreur :

Échec de la mise à l’échelle du pool de nœuds <NOM DU POOL D'AGENTS> dans le service Kubernetes «<NAME>». Erreur : la nouvelle tentative VMSSAgentPoolReconciler a échoué : Code='SubnetIsFull' Message='<SUBNET NAME>\ avec le préfixe d'adresse <PREFIX>\ n’a pas suffisamment de capacité pour les adresses IP.' Details=[]

Conditions préalables

Cet article nécessite Azure CLI version 2.0.65 ou une version ultérieure. Pour rechercher le numéro de version, exécutez az --version. Si vous devez installer ou mettre à niveau Azure CLI, consultez How to install the Azure CLI.

Pour plus d’informations sur le processus de mise à niveau, consultez la section « Mettre à niveau un cluster AKS » dans Mettre à niveau un cluster Azure Kubernetes Service (AKS).

Symptômes

Une mise à niveau du cluster AKS échoue et vous recevez un message d’erreur « SubnetIsFull ».

La cause

Cette erreur se produit si votre cluster n’a pas suffisamment d’adresses IP pour créer un nœud.

Lorsque vous planifiez une opération de mise à niveau ou de mise à l’échelle, tenez compte du nombre d’adresses IP requises. Si la plage d’adresses IP que vous avez configurée dans le cluster ne prend en charge qu’un nombre fixe de nœuds, l’opération de mise à niveau ou de mise à l’échelle échoue. Pour plus d’informations, consultez la planification des adresses IP pour vos clusters Azure Kubernetes Service (AKS).

Vérifier les adresses IP disponibles dans le sous-réseau

Avant de prendre des mesures correctives, vérifiez le nombre d’adresses IP disponibles dans le sous-réseau associé à votre cluster AKS.

Pour vérifier les adresses IP disponibles dans le portail Azure :

  1. Accédez au service réseaux virtuels .
  2. Sélectionnez le réseau virtuel associé à votre cluster AKS.
  3. Dans le menu, sélectionnez Sous-réseaux.
  4. Passez en revue la colonne Adresses IP disponibles pour le sous-réseau que votre cluster utilise.

Vous pouvez également exécuter les commandes Azure CLI suivantes pour vérifier les adresses IP disponibles :

# 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

La sortie ressemble à l’exemple suivant :

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

Note

Ce script nécessite l’installation de jq . Azure réserve cinq adresses IP (5) dans chaque sous-réseau. Pour plus d’informations, consultez Existe-t-il des restrictions sur l’utilisation d’adresses IP au sein de ces sous-réseaux ?.

Si le nombre d'adresses IP disponibles est faible (par exemple, inférieur au nombre de nœuds que vous ajoutez pendant la mise à niveau), passez à la solution dans la section suivante.

Solution

Réduisez les nœuds de cluster pour réserver des adresses IP pour la mise à niveau.

Si la mise à l’échelle n’est pas une option et que votre CIDR de réseau virtuel a suffisamment d’adresses IP, envisagez d’ajouter un pool de nœuds doté d’un sous-réseau unique :

  1. Ajoutez un nouveau pool de nœuds utilisateur dans le réseau virtuel sur un sous-réseau plus grand.
  2. Basculez le pool de nœuds d’origine vers un type de pool de nœuds système.
  3. Augmenter du pool de nœuds utilisateurs.
  4. Réduisez le pool de nœuds d’origine.

Resources