CSE-fouten oplossen die verhinderen dat Azure Kubernetes Service-knooppunten worden ingericht

Overzicht

Dit artikel helpt u bij het oplossen van fouten met Custom Script Extension (CSE) die verhinderen dat Azure Kubernetes Service (AKS) een nieuw knooppunt inricht. Identificeer de CSE-afsluitcode en los de fout op, zodat nieuwe instanties van virtuele-machineschaalsets zich registreren als AKS-knooppunten.

Voorwaarden

Zorg ervoor dat u Azure CLI geïnstalleerd en of deze is bijgewerkt naar de nieuwste versie. Gebruik az --version dit om de geïnstalleerde versie te controleren.

Symptomen

Een nieuw ingericht schaalsetexemplaar van een virtuele machine wordt niet geregistreerd als een AKS-knooppunt. Na een uitschaalbewerking voor een knooppuntgroep ziet u mogelijk dat het aantal Virtual Machine Scale Sets instanties toeneemt terwijl het aantal Kubernetes-knooppunten ongewijzigd blijft.

Als de cluster-autoscaler is ingeschakeld, kan het niet-geregistreerde Virtual Machine Scale Sets-exemplaar na een bepaalde periode worden verwijderd.

Troubleshooting

Als u de oorzaak wilt identificeren, haalt u de CSE-afsluitcode op uit de betrokken Virtual Machine Scale Sets-instantie.

Gebruik Azure CLI om de volgende stappen uit te voeren:

  1. Stel de variabelen voor het AKS-cluster in.

    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. Maak een lijst van de VM-schaalsets in de knooppuntresourcegroep en identificeer de VM-schaalset voor de betreffende knooppuntpool.

    az vmss list \
      --resource-group "$NODE_RG" \
      --query "[].{Name:name,Capacity:sku.capacity,ProvisioningState:provisioningState}" \
      --output table
    
    export VMSS_NAME="<affected-vmss-name>"
    
  3. Zoek de exemplaar-id van het betrokken Virtual Machine Scale Sets exemplaar en exporteer de waarde.

    export INSTANCE_ID="<affected-vmss-instance-id>"
    
  4. Haal de CSE-status op uit het betrokken exemplaar.

    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
    

    Hier volgt voorbeelduitvoer.

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

Afsluitcodes identificeren het specifieke probleem dat de inrichtingsfout heeft veroorzaakt. In het voorgaande voorbeeld retourneert CSE afsluitcode 51, wat een verbindingsprobleem met de Kubernetes-API-server aangeeft.

Zie de CSE-helper voor toewijzingen van andere exitcodes.

Oplossing: Netwerktime-outs van de API-server testen en oplossen

Zorg ervoor dat de API-server bereikbaar is vanaf de betrokken Virtual Machine Scale Sets-instance. Controleer de volgende netwerkconfiguraties:

  • Controleer of de netwerkbeveiligingsgroep (NSG) die is gekoppeld aan het AKS-subnet uitgaand verkeer blokkeert naar het IP-adres van de API-server op TCP-poort 443.
  • Controleer of er een extra NSG is gekoppeld aan de Virtual Machine Scale Sets netwerkinterface. Elke toepasselijke NSG moet uitgaand verkeer naar het IP-adres van de API-server op TCP-poort 443 toestaan.
  • Controleer of een firewall of virtueel netwerkapparaat (NVA) zich in het pad voor uitgaand verkeer bevindt. Doorgaans configureert u een NVA via een routetabel die is gekoppeld aan het subnet van het AKS-knooppunt. Zorg ervoor dat de firewall of NVA uitgaand verkeer toestaat naar het IP-adres van de API-server op TCP-poort 443. Zie Uitgaand verkeer voor clusterknooppunten in AKS beheren voor meer informatie.

Als u de connectiviteit van het Virtual Machine Scale Sets exemplaar naar de API-server wilt testen, gebruikt u Azure CLI om de volgende opdrachten uit te voeren.

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

Met de opdracht wordt de DNS-omzetting (Domain Name System), TCP-connectiviteit (Transmission Control Protocol) en HTTPS-connectiviteit getest. Als de verbinding slaagt, moet de uitvoer er ongeveer uitzien als in het volgende voorbeeld.

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]

Er wordt een HTTP-antwoord 401 verwacht omdat de aanvraag geen verificatiereferenties bevat. Het antwoord bevestigt dat de DNS-resolutie, de TCP-verbinding en de TLS-handshake zijn geslaagd en dat de API-server bereikbaar is.

Als er een time-out optreedt voor de verbinding, moet de uitvoer er ongeveer uitzien als in het volgende voorbeeld.

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

Als er een time-out optreedt voor de verbinding, kan het Virtual Machine Scale Sets exemplaar de API-server niet bereiken op TCP-poort 443. Controleer de effectieve NSG-regels, door de gebruiker gedefinieerde routes, firewalls, NVA's en andere netwerkapparaten die de verbinding kunnen blokkeren.

References