Beheben von CSE-Fehlern, die die Bereitstellung von AKS-Knoten verhindern

Zusammenfassung

In diesem Artikel wird beschrieben, wie Sie Szenarien behandeln, in denen Azure Kubernetes Service (AKS) aufgrund eines Fehlers der benutzerdefinierten Skripterweiterung (CSE) einen neuen Knoten nicht bereitstellen können.

Voraussetzungen

Stellen Sie sicher, dass Azure CLI installiert sind und auf die neueste Version aktualisiert wird. Verwenden Sie az --version, um die installierte Version zu überprüfen.

Symptome

Eine neu bereitgestellte VM-Skalierungssatzinstanz registriert sich nicht als AKS-Knoten. Nach einem Knotenpool-Skalierungsvorgang können Sie feststellen, dass die Anzahl der Virtual Machine Scale Sets (VMSS)-Instanzen steigt, während die Anzahl der Kubernetes-Knoten unverändert bleibt.

Wenn die Clusterautoskaler aktiviert ist, wird möglicherweise die nicht registrierte VMSS-Instanz nach einem bestimmten Zeitraum entfernt.

Problembehandlung

Rufen Sie zum Identifizieren der Ursache den CSE-Exitcode aus der betroffenen VMSS-Instanz ab.

Verwenden Sie Azure CLI, um die folgenden Schritte auszuführen:

  1. Legen Sie die Variablen für den AKS-Cluster fest.

    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. Listen Sie die VM-Skalierungsgruppen in der Knotenressourcengruppe auf, und identifizieren Sie die VM-Skalierungsgruppe für den betroffenen Knotenpool.

    az vmss list \
      --resource-group "$NODE_RG" \
      --query "[].{Name:name,Capacity:sku.capacity,ProvisioningState:provisioningState}" \
      --output table
    
    export VMSS_NAME="<affected-vmss-name>"
    
  3. Suchen Sie die Instanz-ID der betroffenen VMSS-Instanz, und exportieren Sie den Wert.

    export INSTANCE_ID="<affected-vmss-instance-id>"
    
  4. Rufen Sie den CSE-Status aus der betroffenen Instanz ab.

    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
    

    Es folgt eine Beispielausgabe.

     [
       {
         "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..."
       }
     ]
    

Exitcodes identifizieren das spezifische Problem, das zu einem Bereitstellungsfehler führte. Im vorherigen Beispiel gibt CSE den Ausgangscode 51zurück, der ein Verbindungsproblem mit dem Kubernetes-API-Server angibt.

Für die Zuordnungen anderer Exit-Codes siehe das CSE-Hilfsprogramm.

Lösung: API-Netzwerk-Timeouts testen und beheben

Stellen Sie sicher, dass der API-Server über die betroffene VMSS-Instanz erreichbar ist. Überprüfen Sie die folgenden Netzwerkkonfigurationen:

  • Überprüfen Sie, ob die netzwerksicherheitsgruppe (Network Security Group, NSG), die dem AKS-Subnetz zugeordnet ist, ausgehenden Datenverkehr an die IP-Adresse des API-Servers an TCP-Port 443 blockiert.
  • Überprüfen Sie, ob eine zusätzliche NSG der VMSS-Netzwerkschnittstelle zugeordnet ist. Jeder anwendbare NSG muss ausgehenden Datenverkehr an die IP-Adresse des API-Servers am TCP-Port 443 zulassen.
  • Überprüfen Sie, ob sich eine Firewall oder eine virtuelle Netzwerkanwendung (Virtual Appliance, NVA) im ausgehenden Datenverkehrspfad befindet. Eine NVA wird in der Regel über eine Routetabelle konfiguriert, die dem Subnetz des AKS-Knotens zugeordnet ist. Stellen Sie sicher, dass die Firewall oder NVA ausgehenden Datenverkehr an die IP-Adresse des API-Servers am TCP-Port 443 zulässt. Weitere Informationen finden Sie unter Steuern des ausgehenden Datenverkehrs für Clusterknoten in Azure Kubernetes Service (AKS).

Um die Konnektivität von der VMSS-Instanz mit dem API-Server zu testen, verwenden Sie Azure CLI, um die folgenden Befehle auszuführen.

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

Der Befehl testet die DNS-Auflösung (Domain Name System), TCP-Konnektivität (Transmission Control Protocol) und HTTPS-Konnektivität. Wenn die Verbindung erfolgreich ist, sollte die Ausgabe dem folgenden Beispiel ähneln.

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]

Es wird eine HTTP-Antwort 401 erwartet, da die Anforderung keine Authentifizierungsanmeldeinformationen enthält. Die Antwort bestätigt, dass die DNS-Auflösung, die TCP-Verbindung und der TLS-Handshake erfolgreich war und dass der API-Server erreichbar ist.

Wenn die Verbindung zu einem Ausfall kommt, sollte die Ausgabe dem folgenden Beispiel ähneln.

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

Wenn die Verbindung zu einem Ausfall kommt, kann die VMSS-Instanz den API-Server am TCP-Port 443 nicht erreichen. Überprüfen Sie die effektiven NSG-Regeln, benutzerdefinierte Routen, Firewalls, NVAs und andere Netzwerkgeräte, die die Verbindung blockieren könnten.

Referenzmaterial