Résoudre les erreurs CSE qui empêchent le provisionnement de nœuds Azure Kubernetes Service

Résumé

Cet article vous aide à résoudre les erreurs d’extension de script personnalisée (CSE) qui empêchent Azure Kubernetes Service (AKS) de provisionner un nouveau nœud. Identifiez le code de sortie CSE et résolvez l’échec afin que les nouvelles instances de groupe identique de machines virtuelles s’inscrivent en tant que nœuds AKS.

Conditions préalables

Vérifiez que vous avez Azure CLI installé et qu'il est mis à jour vers la dernière version. Permet az --version de vérifier la version installée.

Symptômes

Une instance de groupe de machines virtuelles identiques nouvellement provisionnée ne s’inscrit pas en tant que nœud AKS. Après une opération de scale-out de pool de nœuds, vous pouvez observer que le nombre d’instances Virtual Machine Scale Sets augmente alors que le nombre de nœuds Kubernetes reste inchangé.

Si l’autoscaler de cluster est activé, il peut supprimer l’instance de Virtual Machine Scale Sets non inscrite après une période de temps.

Résolution des problèmes

Pour identifier la cause, récupérez le code de sortie CSE à partir de l’instance de Virtual Machine Scale Sets affectée.

Utilisez Azure CLI pour effectuer les étapes suivantes :

  1. Définissez les variables du cluster AKS.

    export RG_NAME="<cluster-resource-group>"
    export CLUSTER_NAME="<cluster-name>"
    
    export NODE_RG=$(az aks show \
      --resource-group "$RG_NAME" \
      --name "$CLUSTER_NAME" \
      --query nodeResourceGroup \
      --output tsv)
    
    export API_FQDN=$(az aks show \
      --resource-group "$RG_NAME" \
      --name "$CLUSTER_NAME" \
      --query fqdn \
      --output tsv)
    
  2. Répertoriez les groupes de machines virtuelles identiques dans le groupe de ressources de nœud et identifiez le groupe de machines virtuelles identiques pour le pool de nœuds concerné.

    az vmss list \
      --resource-group "$NODE_RG" \
      --query "[].{Name:name,Capacity:sku.capacity,ProvisioningState:provisioningState}" \
      --output table
    
    export VMSS_NAME="<affected-vmss-name>"
    
  3. Recherchez l’ID d’instance de l’instance Virtual Machine Scale Sets affectée et exportez la valeur.

    export INSTANCE_ID="<affected-vmss-instance-id>"
    
  4. Récupérez l’état CSE de l’instance affectée.

    az vmss get-instance-view \
      --resource-group "$NODE_RG" \
      --name "$VMSS_NAME" \
      --instance-id "$INSTANCE_ID" \
      --query "extensions[?name=='vmssCSE'].statuses[].{
        ExtensionState:code,
        Details:message
      }" \
      --output json
    

    Voici un exemple de sortie.

     [
       {
         "ExtensionState": "ProvisioningState/failed/0",
         "Details": "failed to execute command: command terminated with exit status=1\n[stdout]\n{ \"ExitCode\": \"51\", \"Output\": \"... Failed to connect to <AKS API server FQDN> port 443: Connection timed out ... API server connection check code: 51 ... exit 51\", ... }\n\n[stderr]\n..."
       }
     ]
    

Les codes de sortie identifient le problème spécifique qui a provoqué l’échec de l’approvisionnement. Dans l’exemple précédent, CSE retourne le code 51de sortie, qui indique un problème de connectivité avec le serveur d’API Kubernetes.

Pour connaître les mappages d’autres codes de sortie, consultez l’assistance CSE.

Solution : Tester et corriger les délais d’expiration du réseau du serveur d’API

Assurez-vous que le serveur d’API est accessible à partir de l’instance de Virtual Machine Scale Sets affectée. Vérifiez les configurations réseau suivantes :

  • Vérifiez si le groupe de sécurité réseau associé au sous-réseau AKS bloque le trafic sortant vers l’adresse IP du serveur d’API sur le port TCP 443.
  • Vérifiez si un NSG supplémentaire est associé à l’interface réseau Virtual Machine Scale Sets. Chaque groupe de sécurité réseau applicable doit autoriser le trafic sortant vers l’adresse IP du serveur d’API sur le port TCP 443.
  • Vérifiez si un pare-feu ou une appliance virtuelle réseau (NVA) se trouve dans le chemin de trafic sortant. Vous configurez généralement une appliance virtuelle réseau via une table de routage associée au sous-réseau de nœud AKS. Vérifiez que le pare-feu ou l’appliance virtuelle réseau autorise le trafic sortant vers l’adresse IP du serveur d’API sur le port TCP 443. Pour plus d’informations, consultez Contrôler le trafic de sortie pour les nœuds de cluster dans AKS.

Pour tester la connectivité depuis l’instance Virtual Machine Scale Sets vers le serveur d’API, utilisez Azure CLI pour exécuter les commandes suivantes.

az vmss run-command invoke \
  --resource-group "$NODE_RG" \
  --name "$VMSS_NAME" \
  --instance-id "$INSTANCE_ID" \
  --command-id RunShellScript \
  --scripts '
API_FQDN="'"$API_FQDN"'"

echo "=== DNS resolution ==="
getent ahostsv4 "$API_FQDN" |
  awk '"'"'NR==1 {print "Resolved IP: " $1}'"'"'

echo "=== TCP connectivity ==="
if timeout 10 bash -c "</dev/tcp/$API_FQDN/443"; then
  echo "TCP 443: connected"
else
  echo "TCP 443: failed"
fi

echo "=== HTTPS response ==="
curl -sS -k \
  --connect-timeout 10 \
  --max-time 15 \
  --output /dev/null \
  --write-out \
"HTTP status: %{http_code}
Remote IP: %{remote_ip}
Connect time: %{time_connect}s
TLS time: %{time_appconnect}s
" \
  "https://$API_FQDN/"
' \
  --query "value[0].message" \
  --output tsv

La commande teste la résolution DNS (Domain Name System), la connectivité TCP (Transmission Control Protocol) et la connectivité HTTPS. Si la connexion réussit, la sortie doit ressembler à l’exemple suivant.

Enable succeeded:
[stdout]
=== DNS resolution ===
Resolved IP: 172.199.220.208
=== TCP connectivity ===
TCP 443: connected
=== HTTPS response ===
HTTP status: 401
Remote IP: 172.199.220.208
Connect time: 0.018883s
TLS time: 0.058870s

[stderr]

Une réponse HTTP 401 est attendue, car la requête n’inclut pas d’informations d’identification d’authentification. La réponse confirme que la résolution DNS, la connexion TCP et la négociation TLS ont réussi et que le serveur d’API est accessible.

Si la connexion expire, la sortie doit ressembler à l’exemple suivant.

Enable succeeded:
[stdout]
=== DNS resolution ===
Resolved IP: 20.238.162.102
=== TCP connectivity ===
TCP 443: failed
=== HTTPS response ===
HTTP status: 000
Remote IP:
Connect time: 0.000000s
TLS time: 0.000000s

[stderr]
curl: (28) Connection timeout after 10000 ms

Si la connexion expire, l'instance Virtual Machine Scale Sets ne peut pas atteindre le serveur d'API sur le port TCP 443. Vérifiez les règles de groupe de sécurité réseau effectives, les itinéraires définis par l’utilisateur, les pare-feu, les appliances réseau virtuelles et d’autres équipements réseau susceptibles de bloquer la connexion.

Références