Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Sommario
Questo articolo illustra come identificare e risolvere l'errore OutboundConnFailVMExtensionError (codice di errore ERR_OUTBOUND_CONN_FAIL, numero di errore 50) che può verificarsi quando si crea, si avvia, si ridimensiona o si aggiorna un cluster Servizio Azure Kubernetes (AKS). Seguire questa procedura per ripristinare la connettività in uscita in modo che il provisioning dei nodi abbia esito positivo.
Prerequisites
Prima di iniziare la risoluzione dei problemi, verificare che siano soddisfatti i prerequisiti seguenti:
- I seguenti strumenti da riga di comando. Eseguire questi strumenti nel nodo AKS in cui sono installati per impostazione predefinita, non nel computer locale:
-
interfaccia della riga di comando di Azure, se non è possibile connettersi al nodo usando SSH e si vogliono invece eseguire i comandi tramite
run-command.
Symptoms
Quando si tenta di creare, ridimensionare o aggiornare un cluster del servizio Azure Kubernetes, viene visualizzato un messaggio di errore simile all'esempio seguente:
Code: OutboundConnFailVMExtensionError
Message: Create or update virtual machine extension /subscriptions/<subscription-id>/resourceGroups/<node-resource-group>/providers/Microsoft.Compute/virtualMachines/<vm-name>/extensions/<extension-name> failed. VM has reported a user failure when processing extension '<extension-name>'. Please correct the error and try again. (publisher 'Microsoft.Azure.Extensions' and type 'CustomScript'). Error code: '2'. Error message: 'failed to execute command: command terminated with exit status=50
[stdout]
{ "ExitCode": "50", "Output": "...
+ retrycmd_if_failure 20 1 15 curl -v --insecure --proxy-insecure https://mcr.microsoft.com/v2/
...
+ exit 50", ... }
[stderr]
{"level":"ERROR","msg":"aks-node-controller failed","error":"provision failed: exitCode=50 ..."}
...
More information on troubleshooting is available at https://aka.ms/VMExtensionCSELinuxTroubleshoot.
Gli indicatori chiave di questo errore sono il codice OutboundConnFailVMExtensionError, il valore exit status=50 e il comando curl rispetto a https://mcr.microsoft.com/v2/ nell'output. Il nome dell'estensione dipende dal tipo di pool di nodi. Ad esempio, i pool di nodi di set di scalabilità di macchine virtuali usano vmssCSE, e i pool di nodi di Macchine virtuali usano nomi come cse-agent-<number>.
Note
L'output degli errori mostra il comando che non è riuscito, ma non include l'output del curl comando stesso. Di conseguenza, l'errore non indica se l'errore si è verificato a livello DNS, TCP, TLS o HTTP. Per identificare il punto di errore esatto, eseguire lo stesso controllo sul nodo come descritto nella sezione Risoluzione dei problemi manuale .
Questo errore potrebbe anche causare che i nodi in esecuzione diventino NotReady o causare errori di pull delle immagini perché la connettività in uscita è bloccata per alcuni o tutti i nodi del cluster.
Cause
Durante il provisioning dei nodi, Custom Script Extension (CSE) esegue un controllo di connettività sull'endpoint di Microsoft Container Registry (MCR) eseguendo curl -v --insecure --proxy-insecure https://mcr.microsoft.com/v2/. Il controllo viene ripetuto più volte. Se il nodo non riesce a raggiungere mcr.microsoft.com tramite HTTPS sulla porta 443, il CSE viene chiuso con codice 50 e il provisioning dei nodi ha esito negativo.
Questo requisito in uscita si applica a tutti i cluster AKS, indipendentemente dal fatto che il cluster sia pubblico o privato. L'impostazione pubblica o privata controlla solo la modalità di accesso al server API. Non modifica la connettività in uscita richiesta dai nodi. Per l'elenco completo degli endpoint e delle porte che i nodi di Servizio Azure Kubernetes (AKS) devono raggiungere, vedere Regole di rete in uscita e FQDN per i cluster Servizio Azure Kubernetes (AKS).
Note
Il controllo CSE è destinato solo a mcr.microsoft.com. Tuttavia, il pull di immagini da MCR richiede anche l'accesso ad altri endpoint, ad esempio *.data.mcr.microsoft.com. Se si blocca solo questi altri endpoint, è possibile eseguire correttamente il provisioning del nodo, ma il pull delle immagini avrà esito negativo in un secondo momento.
Tip
Per impostazione predefinita, i cluster del servizio Azure Kubernetes richiedono l'accesso in uscita agli endpoint elencati nelle regole di rete in uscita e FQDN per i cluster del servizio Azure Kubernetes. Se l'ambiente non deve consentire il traffico Internet in uscita, prendere in considerazione un cluster AKS isolato dalla rete. I cluster isolati di rete estraggono le immagini necessarie da un'istanza di Registro Azure Container privata e non richiedono l'accesso a Internet in uscita. Per altre informazioni, vedere Creare un cluster del servizio Azure Kubernetes isolato in rete.
Molti motivi possono bloccare il traffico in uscita. Un buon punto di partenza consiste nell'eseguire un'analisi della connettività con Rete virtuale di Azure Verifier. Eseguendo un'analisi della connettività, è possibile visualizzare gli hop all'interno del flusso di traffico ed eventuali configurazioni errate nelle risorse di rete di Azure che bloccano il traffico. Per risolvere manualmente gli errori di connettività in uscita, è possibile usare il protocollo SSH (Secure Shell Protocol) per connettersi al nodo. Questa sezione illustra le istruzioni per entrambi i tipi di indagini.
Controllare se le risorse di rete di Azure bloccano il traffico verso l'endpoint
Per determinare se le risorse di rete di Azure bloccano il traffico verso l'endpoint, eseguire un'analisi della connettività dai nodi del cluster AKS all'endpoint usando lo strumento Rete virtuale di Azure Verifier.
Note
- Rete virtuale di Azure Verifier non può accedere ad alcuna risorsa di rete esterna o di terze parti, ad esempio un firewall personalizzato. Se l'analisi della connettività non rileva traffico bloccato, controllare manualmente qualsiasi connettività esterna per coprire tutti gli hop nel flusso di traffico.
- Firewall di Azure viene valutato usando solo regole statiche di livello 4 (rete). Le regole app (filtro FQDN) non vengono valutate. Pertanto, l'analisi potrebbe segnalare che il traffico è consentito anche se una regola dell'applicazione Firewall di Azure lo blocca. In questo caso, usare i passaggi descritti in Risoluzione dei problemi manuali.
- Rete virtuale di Azure Verifier è disponibile solo in aree specifiche.
- Nel portale di Azure passare al cluster. Nella barra laterale passare a Impostazioni>Pool di nodi.
- Trovare il pool di nodi da cui si vuole eseguire un'analisi della connettività. Selezionare il pool di nodi per impostarlo come ambito.
- Selezionare Analisi della connettività (anteprima) sulla barra degli strumenti nella parte superiore della pagina. Se non lo vedi, seleziona i tre puntini (...) nella barra degli strumenti nella parte superiore della pagina per aprire il menu espanso.
- Selezionare un'istanza del set di scalabilità di macchine virtuali (VMSS) come origine. Gli indirizzi IP di origine vengono popolati automaticamente.
- Selezionare un nome di dominio pubblico/endpoint come destinazione per l'analisi, ad esempio
mcr.microsoft.com. Anche gli indirizzi IP di destinazione vengono popolati automaticamente. - Eseguire l'analisi e attendere fino a 2 minuti per i risultati. Nel diagramma risultante identificare le risorse di rete di Azure associate e la posizione in cui viene bloccato il traffico. Per visualizzare l'output dettagliato dell'analisi, selezionare la scheda Output JSON o selezionare le frecce nel diagramma.
Risoluzione dei problemi manuali
Se lo strumento Rete virtuale di Azure Verifier non fornisce informazioni sufficienti sul problema, è possibile risolvere manualmente gli errori di connettività in uscita usando il protocollo SSH (Secure Shell Protocol) per connettersi al nodo. Per stabilire la connessione, seguire le istruzioni in Connettersi ai nodi del cluster di Servizio Azure Kubernetes (AKS) per la manutenzione o la risoluzione dei problemi. Testare quindi la connettività nel cluster seguendo questa procedura.
Passo 1: Testare la connettività in uscita verso MCR
Dopo la connessione al nodo, eseguire la stessa verifica della connettività eseguita dal CSE:
curl -v --insecure --proxy-insecure https://mcr.microsoft.com/v2/
Se il comando restituisce una risposta HTTP, ad esempio HTTP/2 200, il nodo può raggiungere MCR. Se il comando non riesce, usare l'errore nell'output dettagliato per identificare dove viene bloccato il traffico:
curl risultato |
Causa possibile |
|---|---|
Could not resolve host |
Fallimento della risoluzione DNS. Controllare la configurazione DNS. |
Connection timed out oppure Connection refused |
Il traffico viene bloccato a livello di rete (livello 4), ad esempio da un gruppo di sicurezza di rete, da una tabella di route o da una regola di rete del firewall. |
La connessione TCP ha esito positivo, ma l'handshake TLS ha esito negativo o la connessione viene reimpostata (ad esempio, Connection reset by peer o SSL_ERROR_SYSCALL) |
Il traffico viene bloccato a livello di applicazione (livello 7), ad esempio da una regola dell'applicazione firewall che filtra in base al nome di dominio completo o da un proxy. |
Per limitare ulteriormente il problema, è possibile testare separatamente la risoluzione DNS e la connettività TCP:
# Test DNS resolution.
dig mcr.microsoft.com
# Test TCP connectivity on port 443 (layer 4 only).
nc -vz mcr.microsoft.com 443
Importante
Il nc comando verifica solo se è possibile stabilire una connessione TCP (livello 4). Non testa TLS o HTTP (livello 7). Se un firewall filtra il traffico in base al nome di dominio completo, nc può avere esito positivo anche se il controllo eseguito dalla CSE curl ha esito negativo. Usare sempre il comando curl per confermare la connettività.
Note
CSE viene eseguito curl con l'opzione --insecure, quindi l'ispezione TLS da parte di un firewall o un proxy non causa il codice di errore 50. Tuttavia, l'ispezione TLS può causare errori di pull delle immagini in un secondo momento. Per verificare se si verifica l'ispezione TLS, eseguire il curl comando senza l'opzione --insecure e verificare che il certificato venga emesso da un'autorità di certificazione pubblica.
Se non è possibile accedere al nodo tramite SSH, è possibile testare la connettività in uscita eseguendo il comando az vmss run-command invoke sull'istanza del set di scalabilità di macchine virtuali:
# Get the VMSS instance IDs.
az vmss list-instances --resource-group <mc-resource-group-name> \
--name <vmss-name> \
--output table
# Use an instance ID to test outbound connectivity.
az vmss run-command invoke --resource-group <mc-resource-group-name> \
--name <vmss-name> \
--command-id RunShellScript \
--instance-id <vmss-instance-id> \
--output json \
--scripts "curl -v --insecure --proxy-insecure https://mcr.microsoft.com/v2/"
Note
Questi comandi sono per set di scalabilità di macchine virtuali, il tipo di pool di nodi predefinito e più comune in AKS. Se si usa un pool di nodi Macchine virtuali, modificare i comandi per usare az vm run-command invoke.
Passaggio 2: Testare la connettività tramite un proxy HTTP
Se il cluster AKS usa un proxy HTTP, eseguire i comandi nc, curl e dig dopo la connessione al nodo:
# Test connectivity to the proxy server from the AKS node.
nc -vz <http-s-proxy-address> <port>
# Test HTTPS traffic to MCR through an HTTP proxy server.
curl -v --proxy http://<http-proxy-address>:<port>/ --head https://mcr.microsoft.com/v2/
# Test HTTPS traffic to MCR through an HTTPS proxy server.
curl -v --proxy https://<https-proxy-address>:<port>/ --head https://mcr.microsoft.com/v2/
# Test DNS functionality.
dig mcr.microsoft.com
Se non è possibile accedere al nodo tramite SSH, è possibile eseguire gli stessi test usando il comando az vmss run-command invoke sull'istanza di Virtual Machine Scale Set (o il comando az vm run-command invoke per i pool di nodi di Macchine virtuali):
# Get the VMSS instance IDs.
az vmss list-instances --resource-group <mc-resource-group-name> \
--name <vmss-name> \
--output table
# Use an instance ID to test HTTPS traffic to MCR through an HTTP proxy server.
az vmss run-command invoke --resource-group <mc-resource-group-name> \
--name <vmss-name> \
--command-id RunShellScript \
--instance-id <vmss-instance-id> \
--output json \
--scripts "curl -v --proxy http://<http-proxy-address>:<port>/ --head https://mcr.microsoft.com/v2/"
# Use an instance ID to test HTTPS traffic to MCR through an HTTPS proxy server.
az vmss run-command invoke --resource-group <mc-resource-group-name> \
--name <vmss-name> \
--command-id RunShellScript \
--instance-id <vmss-instance-id> \
--output json \
--scripts "curl -v --proxy https://<https-proxy-address>:<port>/ --head https://mcr.microsoft.com/v2/"
# Use an instance ID to test DNS functionality.
az vmss run-command invoke --resource-group <mc-resource-group-name> \
--name <vmss-name> \
--command-id RunShellScript \
--instance-id <vmss-instance-id> \
--output json \
--scripts "dig mcr.microsoft.com"
Solution
La tabella seguente elenca i motivi specifici per cui il traffico potrebbe essere bloccato e la soluzione corrispondente per ogni motivo:
| Issue | Solution |
|---|---|
| Il traffico è bloccato dalle regole del firewall o da un gruppo di sicurezza di rete (NSG) | Questo problema si verifica quando le porte richieste di AKS o i nomi di dominio completi (FQDN) sono bloccati da un firewall o un NSG. Verificare che queste porte e FQDN siano consentite. Se nc ha esito positivo ma curl non riesce, verificare la presenza di regole dell'applicazione firewall che filtrano il traffico in base al nome di dominio completo. Per determinare cosa è bloccato, controllare la connettività come descritto nella sezione Causa precedente. Per ulteriori informazioni sulle porte e sui nomi di dominio completi richiesti per Servizio Azure Kubernetes (AKS), vedere Regole di rete in uscita e FQDN per i cluster di Servizio Azure Kubernetes (AKS). |
| Le rotte definite dall'utente inviano traffico in uscita a un firewall o a un'appliance virtuale di rete che non lo consente | Se il cluster usa il tipo in uscita userDefinedRouting, o la subnet del nodo ha una tabella di routing che instrada il traffico 0.0.0.0/0 verso un firewall o un'appliance virtuale di rete, verificare che l'hop successivo sia raggiungibile e che consenta gli FQDN richiesti da AKS e le porte necessarie. Per altre informazioni, vedere Personalizzare l'uscita del cluster con i tipi di traffico in uscita in AKS. |
| Il proxy HTTP non è configurato correttamente | Se il cluster usa un proxy HTTP, verificare che l'indirizzo proxy e la porta siano corretti, che il proxy sia raggiungibile dalla subnet del nodo e che il proxy consenta gli FQDN richiesti da AKS. Per altre informazioni, vedere Supporto proxy HTTP in AKS. |
| I server DNS personalizzati non possono risolvere gli endpoint necessari | Se la rete virtuale usa server DNS personalizzati, tali server devono risolvere FQDN pubblici, ad esempio mcr.microsoft.com. In genere, è possibile configurarli per inoltrare le query a DNS di Azure (168.63.129.16). Per i cluster privati, i server DNS personalizzati devono anche risolvere la zona DNS privata del server API. Per altre informazioni, vedere Che cos'è l'indirizzo IP 168.63.129.16? e Creare un cluster del servizio Azure Kubernetes privato. |
| Le query DNS per gli endpoint necessari vengono bloccate | Verificare che il firewall o il proxy DNS non blocchi le query DNS, incluse le query di record AAAA (IPv6), per gli endpoint necessari. |