Risolvere i problemi di deployment di Envoy
Questa guida fornisce informazioni per aiutarti a risolvere i problemi di configurazione dei client Envoy quando esegui Cloud Service Mesh con le API di Google. Per informazioni su come utilizzare l'API Client Status Discovery Service (CSDS) ed esaminare i problemi relativi a Cloud Service Mesh, consulta la sezione Comprendere lo stato del client Cloud Service Mesh.
Determinare la versione di Envoy installata su una VM
Segui queste istruzioni per verificare quale versione di Envoy è in esecuzione su un'istanza di macchina virtuale (VM).
Per verificare o controllare la versione di Envoy, puoi eseguire una delle seguenti operazioni:
Controlla gli attributi guest della VM nel percorso
gce-service-proxy/proxy-version:
gcloud compute --project cloud-vm-mesh-monitoring instances get-guest-attributes INSTANCE_NAME
--zone ZONEc --query-path=gce-service-proxy/proxy-versionNAMESPACE KEY VALUE gce-service-proxy proxy-version dc78069b10cc94fa07bb974b7101dd1b42e2e7bf/1.15.1-dev/Clean/RELEASE/BoringSSL
Controlla i log dell'istanza Cloud Logging dalla pagina Logging dei dettagli dell'istanza VM nella console Google Cloud con una query come questa:
resource.type="gce_instance" resource.labels.instance_id="3633122484352464042" jsonPayload.message:"Envoy version"
Ricevi una risposta come questa:
{
"insertId": "9zy0btf94961a",
"jsonPayload": {
"message": "Envoy Version: dc78069b10cc94fa07bb974b7101dd1b42e2e7bf/1.15.1-dev/Clean/RELEASE/BoringSSL",
"localTimestamp": "2021-01-12T11:39:14.3991Z"
},
"resource": {
"type": "gce_instance",
"labels": {
"zone": "asia-southeast1-b",
"instance_id": "3633122484352464042",
"project_id": "cloud-vm-mesh-monitoring"
}
},
"timestamp": "2021-01-12T11:39:14.399200504Z",
"severity": "INFO",
"logName": "projects/cloud-vm-mesh-monitoring/logs/service-proxy-agent",
"receiveTimestamp": "2021-01-12T11:39:15.407023427Z"
}
Utilizza SSH per connetterti a una VM e controllare la versione del file binario:
YOUR_USER_NAME@backend-mig-5f5651e1-517a-4269-b457-f6bdcf3d98bc-m3wt:~$ /usr/local/bin/envoy --version/usr/local/bin/envoy version: dc78069b10cc94fa07bb974b7101dd1b42e2e7bf/1.15.1-dev/Clean/RELEASE/BoringSSL
Utilizza SSH per connetterti a una VM e all'interfaccia di amministrazione come root:
root@backend-mig-5f5651e1-517a-4269-b457-f6bdcf3d98bc-m3wt:~# curl localhost:15000/server_info
{
"version": "dc78069b10cc94fa07bb974b7101dd1b42e2e7bf/1.15.1-dev/Clean/RELEASE/BoringSSL",
"state": "LIVE",
"hot_restart_version": "disabled",
...
}
Posizioni dei log di Envoy
Per risolvere alcuni problemi, devi esaminare i log del proxy Envoy.
Puoi utilizzare SSH per connetterti all'istanza VM e ottenere il file di log. Il percorso dovrebbe essere il seguente.
/var/log/envoy/envoy.err.log
I proxy non si connettono a Cloud Service Mesh
Se i proxy non si connettono a Cloud Service Mesh, segui questi passaggi:
Controlla i log del proxy Envoy per verificare la presenza di errori di connessione a
trafficdirector.googleapis.com.Se configuri
netfilter(utilizzandoiptables) per reindirizzare tutto il traffico al proxy Envoy, assicurati che l'utente (UID) con cui esegui il proxy sia escluso dal reindirizzamento. In caso contrario, il traffico verrà reindirizzato continuamente al proxy.Assicurati di aver abilitato l'API Cloud Service Mesh per il progetto. In API e servizi per il tuo progetto, cerca possibili errori per l'API Cloud Service Mesh.
Verifica che l'ambito di accesso API della VM sia impostato in modo da consentire l'accesso completo alle APIGoogle Cloud specificando quanto segue durante la creazione della VM:
--scopes=https://www.googleapis.com/auth/cloud-platform
Verifica che il service account disponga delle autorizzazioni corrette. Per ulteriori informazioni, vedi Abilitare il service account per accedere all'API Traffic Director.
Verifica di poter accedere a
trafficdirector.googleapis.com:443dalla VM. Se riscontri problemi con questo accesso, i possibili motivi potrebbero essere un firewall che impedisce l'accesso atrafficdirector.googleapis.comtramite la porta TCP443o problemi di risoluzione DNS per il nome hosttrafficdirector.googleapis.com.Se utilizzi Envoy per il proxy sidecar, verifica che la versione di Envoy sia la release 1.24.9 o versioni successive.
Il servizio configurato con Cloud Service Mesh non è raggiungibile
Se un servizio configurato con Cloud Service Mesh non è raggiungibile, verifica che il proxy sidecar sia in esecuzione e in grado di connettersi a Cloud Service Mesh.
Se utilizzi Envoy come proxy sidecar, puoi verificarlo eseguendo i seguenti comandi:
Dalla riga di comando, verifica che il processo Envoy sia in esecuzione:
ps aux | grep envoy
Ispeziona la configurazione di runtime di Envoy per verificare che Cloud Service Mesh abbia configurato le risorse dinamiche. Per visualizzare la configurazione, esegui questo comando:
curl http://localhost:15000/config_dump
Assicurati che l'intercettazione del traffico per il proxy sidecar sia configurata correttamente. Per la configurazione del reindirizzamento con
iptables, esegui il comandoiptablese poi esegui ilgrepdell'output per assicurarti che le regole siano presenti:sudo iptables -t nat -S | grep ISTIO
Di seguito è riportato un esempio di output per
iptablesche intercetta l'indirizzo IP virtuale (VIP)10.0.0.1/32e lo inoltra a un proxy Envoy in esecuzione sulla porta15001come UID1006:-N ISTIO_IN_REDIRECT -N ISTIO_OUTPUT -N ISTIO_REDIRECT -A OUTPUT -p tcp -j ISTIO_OUTPUT -A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15001 -A ISTIO_OUTPUT -m owner --uid-owner 1006 -j RETURN -A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN -A ISTIO_OUTPUT -d 10.0.0.1/32 -j ISTIO_REDIRECT -A ISTIO_OUTPUT -j RETURN
Se l'istanza VM viene creata tramite la console Google Cloud , alcuni moduli
correlati a IPv6 non vengono installati e resi disponibili prima del riavvio. Di conseguenza, iptables
non riesce a essere eseguito a causa delle dipendenze mancanti. In questo caso, riavvia la VM ed esegui di nuovo
la procedura di configurazione, che dovrebbe risolvere il problema. Una VM Compute Engine creata
utilizzando Google Cloud CLI non dovrebbe presentare questo problema.
Il servizio non è più raggiungibile quando viene configurato il logging degli accessi di Envoy
Se hai utilizzato TRAFFICDIRECTOR_ACCESS_LOG_PATH per configurare un
log di accesso di Envoy come descritto in
Configurazione degli attributi di bootstrap di Envoy per Cloud Service Mesh,
assicurati che l'utente di sistema che esegue il proxy Envoy disponga delle autorizzazioni per scrivere
nella posizione del log di accesso specificata.
La mancata concessione delle autorizzazioni necessarie impedisce la programmazione dei listener sul proxy e può essere rilevata controllando il seguente messaggio di errore nel log del proxy Envoy:
gRPC config for type.googleapis.com/envoy.api.v2.Listener rejected: Error adding/updating listener(s) TRAFFICDIRECTOR_INTERCEPTION_PORT: unable to open file '/var/log/envoy.log': Permission denied
Per risolvere il problema, modifica le autorizzazioni del file scelto in modo che il log di accesso sia accessibile in scrittura dall'utente Envoy.
I messaggi di errore nei log di Envoy indicano un problema di configurazione
Questa sezione si applica ai deployment che utilizzano le API di bilanciamento del carico.
Se hai difficoltà con la configurazione di Cloud Service Mesh, potresti visualizzare uno dei seguenti messaggi di errore nei log di Envoy:
warning envoy config StreamAggregatedResources gRPC config stream closed: 5, Cloud Service Mesh configuration was not found for network "VPC_NAME" in project "PROJECT_NUMBER".
warning envoy upstream StreamLoadStats gRPC config stream closed: 5, Cloud Service Mesh configuration was not found for network "VPC_NAME" in project "PROJECT_NUMBER".
warning envoy config StreamAggregatedResources gRPC config stream closed: 5, Requested entity was not found.
warning envoy upstream StreamLoadStats gRPC config stream closed: 5, Requested entity was not found.
Cloud Service Mesh configuration was not found.
L'ultimo messaggio di errore (Traffic Director configuration was not found)
indica in genere che Envoy sta richiedendo la configurazione a
Cloud Service Mesh, ma non è possibile trovare una configurazione corrispondente. Quando Envoy
si connette a Cloud Service Mesh, presenta un nome di rete VPC
(ad esempio, my-network). Cloud Service Mesh cerca quindi le regole di forwarding
che hanno lo schema di bilanciamento del carico INTERNAL_SELF_MANAGED e fanno riferimento allo
stesso nome di rete VPC.
Per correggere questo errore, segui questi passaggi:
Assicurati che nella tua rete esista una regola di forwarding con lo schema di bilanciamento del carico
INTERNAL_SELF_MANAGED. Prendi nota del nome della rete VPC della regola di forwarding.Se utilizzi Cloud Service Mesh con deployment automatici di Envoy su Compute Engine, assicurati che il valore fornito al flag
--service-proxy:networkcorrisponda al nome della rete VPC della regola di forwarding.Se utilizzi Cloud Service Mesh con deployment manuali di Envoy su Compute Engine, controlla il file di bootstrap di Envoy verificando quanto segue:
- Assicurati che il valore della variabile
TRAFFICDIRECTOR_NETWORK_NAMEcorrisponda al nome della rete VPC della regola di forwarding. - Assicurati che il numero di progetto sia impostato nella
variabile
TRAFFICDIRECTOR_GCP_PROJECT_NUMBER.
- Assicurati che il valore della variabile
Se esegui il deployment su GKE e utilizzi l'inserimento automatico, assicurati che il numero di progetto e il nome della rete VPC siano configurati correttamente, in base alle indicazioni riportate in Configurazione di Cloud Service Mesh per i pod GKE con inserimento automatico di Envoy.
Risoluzione dei problemi relativi a Compute Engine
Questa sezione fornisce istruzioni per la risoluzione dei problemi relativi ai deployment di Envoy per Compute Engine.
I processi di bootstrap di Envoy e della VM e le successive operazioni di gestione del ciclo di vita possono interrompersi per diversi motivi, tra cui problemi di connettività temporanei, repository danneggiati, bug negli script di bootstrap e negli agenti sulla VM e azioni impreviste degli utenti.
Canali di comunicazione per la risoluzione dei problemi
Google Cloud fornisce canali di comunicazione che puoi utilizzare per comprendere il processo di bootstrap e lo stato attuale dei componenti che risiedono sulle tue VM.
Logging dell'output della porta seriale virtuale
Il sistema operativo, il BIOS e altre entità a livello di sistema di una VM in genere scrivono l'output sulle porte seriali. Questo output è utile per la risoluzione dei problemi di arresti anomali del sistema, avvii non riusciti e problemi di avvio o di arresto.
Gli agenti di bootstrap di Compute Engine registrano tutte le azioni eseguite sulla porta
seriale 1. Sono inclusi gli eventi di sistema, a partire dall'installazione di base dei pacchetti
fino all'ottenimento dei dati dal server dei metadati di un'istanza, dalla configurazione di iptables
e dallo stato di installazione di Envoy.
Gli agenti sulla VM registrano lo stato di integrità del processo Envoy, i servizi Cloud Service Mesh appena scoperti e qualsiasi altra informazione che potrebbe essere utile quando esamini i problemi relativi alle VM.
Logging di Cloud Monitoring
I dati esposti nell'output della porta seriale vengono registrati anche in Monitoring, che utilizza la libreria Golang ed esporta i log in un log separato per ridurre il "rumore". Poiché questo log è un log a livello di istanza, è possibile che i log del Service Proxy si trovino nella stessa pagina degli altri log di istanza.
Attributi guest della VM
Gli attributi guest sono un tipo specifico di metadati personalizzati su cui le applicazioni possono scrivere durante l'esecuzione su una VM. Qualsiasi applicazione o utente sulle tue istanze può leggere e scrivere dati in questi valori dei metadati degli attributi guest.
Gli script di bootstrap di Compute Engine Envoy e gli agenti sulla VM espongono attributi
con informazioni sul processo di bootstrap e sullo stato attuale di Envoy.
Tutti gli attributi guest sono esposti nello spazio dei nomi gce-service-proxy:
gcloud compute instances get-guest-attributes INSTANCE_NAME \
--query-path=gce-service-proxy/ \
--zone=ZONE
Se riscontri problemi, ti consigliamo di controllare il valore degli attributi
guest bootstrap-status e bootstrap-last-failure. Qualsiasi valore
bootstrap-status diverso da FINISHED indica che l'ambiente
Envoy non è ancora configurato. Il valore di bookstrap-last-failure
potrebbe indicare il problema.
Impossibile raggiungere il servizio Cloud Service Mesh da una VM creata utilizzando un modello di istanza abilitato per i Service Proxy
Per risolvere il problema, segui questi passaggi:
L'installazione dei componenti del Service Proxy sulla VM potrebbe non essere stata completata o non essere riuscita. Utilizza il seguente comando per determinare se tutti i componenti sono installati correttamente:
gcloud compute instances get-guest-attributes INSTANCE_NAME \ --query-path=gce-service-proxy/ \ --zone=ZONEL'attributo guest
bootstrap-statusè impostato su uno dei seguenti valori:[none]indica che l'installazione non è ancora iniziata. La VM potrebbe essere ancora in fase di avvio. Ricontrolla lo stato tra qualche minuto.IN PROGRESSindica che l'installazione e la configurazione dei componenti del Service Proxy non sono ancora completate. Ripeti il controllo dello stato per verificare eventuali aggiornamenti sul processo.FAILEDindica che l'installazione o la configurazione di un componente non è riuscita. Controlla il messaggio di errore eseguendo una query sull'attributogce-service-proxy/bootstrap-last-failure1.FINISHEDindica che i processi di installazione e configurazione sono stati completati senza errori. Segui queste istruzioni per verificare che l'intercettazione del traffico e il proxy Envoy siano configurati correttamente.
L'intercettazione del traffico sulla VM non è configurata correttamente per i servizi basati su Cloud Service Mesh. Accedi alla VM e controlla la configurazione di
iptables:gcloud compute ssh INSTANCE_NAME \ --zone=ZONE \ sudo iptables -L -t natEsamina la catena
SERVICE_PROXY_SERVICE_CIDRSper trovare vociSERVICE_PROXY_REDIRECTcome queste:Chain SERVICE_PROXY_SERVICE_CIDRS (1 references) target prot opt source destination ... SERVICE_PROXY_REDIRECT all -- anywhere 10.7.240.0/20
Per ogni servizio, deve essere presente un indirizzo IP o CIDR corrispondente nella colonna
destination. Se non è presente alcuna voce per l'indirizzo IP virtuale (VIP), significa che si è verificato un problema con il popolamento della configurazione del proxy Envoy da Cloud Service Mesh oppure l'agente sulla VM non ha funzionato.I proxy Envoy non hanno ancora ricevuto la configurazione da Cloud Service Mesh. Accedi alla VM per controllare la configurazione del proxy Envoy:
gcloud compute ssh INSTANCE_NAME \ --zone=ZONE \ sudo curl localhost:15000/config_dumpEsamina la configurazione del listener ricevuta da Cloud Service Mesh. Ad esempio:
"dynamic_active_listeners": [ ... "filter_chains": [{ "filter_chain_match": { "prefix_ranges": [{ "address_prefix": "10.7.240.20", "prefix_len": 32 }], "destination_port": 80 }, ... "route_config_name": "URL_MAP/PROJECT_NUMBER.td-routing-rule-1" ... ]address_prefixè l'indirizzo IP virtuale (VIP) di un servizio Cloud Service Mesh e indirizza alla mappa URL denominatatd-routing-rule-1. Verifica se il servizio a cui vuoi connetterti è già incluso nella configurazione del listener.L'agente sulla VM non è in esecuzione. L'agente sulla VM configura automaticamente l'intercettazione del traffico quando vengono creati nuovi servizi Cloud Service Mesh. Se l'agente non è in esecuzione, tutto il traffico verso i nuovi servizi va direttamente ai VIP, bypassando il proxy Envoy e si verifica il timeout.
Verifica lo stato dell'agente sulla VM eseguendo il seguente comando:
gcloud compute instances get-guest-attributes INSTANCE_NAME \ --query-path=gce-service-proxy/ \ --zone=ZONE
Esamina gli attributi dell'agente sulla VM. Il valore dell'attributo
agent-heartbeatindica l'ora in cui l'agente ha eseguito l'ultima azione o l'ultimo controllo. Se il valore risale a più di cinque minuti fa, l'agente è bloccato e devi ricreare la VM utilizzando il seguente comando:gcloud compute instance-groups managed recreate-instance
L'attributo
agent-last-failureespone l'ultimo errore che si è verificato nell'agente. Potrebbe essere dovuto a un problema temporaneo che si risolve al successivo controllo dell'agente, ad esempio se l'errore èCannot reach the Cloud Service Mesh API server, oppure potrebbe trattarsi di un errore permanente. Attendi qualche minuto e poi ricontrolla l'errore.
L'intercettazione del traffico in entrata è configurata sulla porta del workload, ma non è possibile connettersi alla porta dall'esterno della VM
Per risolvere il problema, segui questi passaggi:
L'installazione dei componenti del Service Proxy sulla VM potrebbe non essere stata completata o non essere riuscita. Utilizza il seguente comando per determinare se tutti i componenti sono installati correttamente:
gcloud compute instances get-guest-attributes INSTANCE_NAME \ --query-path=gce-service-proxy/ \ --zone=ZONEL'attributo guest
bootstrap-statusè impostato su uno dei seguenti valori:[none]indica che l'installazione non è ancora iniziata. La VM potrebbe essere ancora in fase di avvio. Ricontrolla lo stato tra qualche minuto.IN PROGRESSindica che l'installazione e la configurazione dei componenti del Service Proxy non sono ancora completate. Ripeti il controllo dello stato per verificare eventuali aggiornamenti sul processo.FAILEDindica che l'installazione o la configurazione di un componente non è riuscita. Controlla il messaggio di errore eseguendo una query sull'attributogce-service-proxy/bootstrap-last-failure1.FINISHEDindica che i processi di installazione e configurazione sono stati completati senza errori. Segui queste istruzioni per verificare che l'intercettazione del traffico e il proxy Envoy siano configurati correttamente.
L'intercettazione del traffico sulla VM non è configurata correttamente per il traffico in entrata. Accedi alla VM e controlla la configurazione di
iptables:gcloud compute ssh INSTANCE_NAME \ --zone=ZONE \ sudo iptables -L -t natEsamina la catena
SERVICE_PROXY_INBOUNDper trovare vociSERVICE_PROXY_IN_REDIRECTcome queste:Chain SERVICE_PROXY_INBOUND (1 references) target prot opt source destination ... SERVICE_PROXY_IN_REDIRECT tcp -- anywhere anywhere tcp dpt:mysql
Per ogni porta definita in
service-proxy:serving-ports, deve esistere una porta corrispondente nella colonnadestination. Se non è presente alcuna voce per la porta, tutto il traffico in entrata viene indirizzato direttamente a questa porta, bypassando il proxy Envoy.Verifica che non ci siano altre regole che eliminano il traffico verso questa porta o tutte le porte tranne una specifica.
I proxy Envoy non hanno ancora ricevuto la configurazione per la porta in entrata da Cloud Service Mesh. Accedi alla VM per controllare la configurazione del proxy Envoy:
gcloud compute ssh INSTANCE_NAME \ --zone=ZONE \ sudo curl localhost:15000/config_dumpCerca la configurazione del listener in entrata ricevuta da Cloud Service Mesh:
"dynamic_active_listeners": [ ... "filter_chains": [{ "filter_chain_match": { "prefix_ranges": [{ "address_prefix": "10.0.0.1", "prefix_len": 32 }], "destination_port": 80 }, ... "route_config_name": "inbound|default_inbound_config-80" ... ]route_config_name, che inizia coninbound, indica un servizio speciale creato per intercettare il traffico in entrata. Verifica se la porta a cui vuoi connetterti è già inclusa nella configurazione del listener indestination_port.
Problemi quando le connessioni utilizzano protocolli server-first
Alcune applicazioni, come MySQL, utilizzano protocolli in cui il server invia il primo pacchetto. Ciò significa che al momento della connessione iniziale il server invia i primi byte. Questi protocolli e applicazioni non sono supportati da Cloud Service Mesh.
Risolvere i problemi relativi all'integrità del mesh di servizi
Questa guida fornisce informazioni per aiutarti a risolvere i problemi di configurazione di Cloud Service Mesh.
Comportamento di Cloud Service Mesh quando la maggior parte degli endpoint non è integro
Per una maggiore affidabilità, quando il 99% degli endpoint non è integro, Cloud Service Mesh configura il piano dati in modo da ignorare lo stato di integrità degli endpoint. Il piano dati bilancia invece il traffico tra tutti gli endpoint perché è possibile che la porta di pubblicazione sia ancora funzionante.
I backend non integri causano una distribuzione non ottimale del traffico
Cloud Service Mesh utilizza le informazioni nella risorsa HealthCheck
collegata a un servizio di backend per valutare l'integrità dei backend.
Cloud Service Mesh utilizza questo stato di integrità per instradare il traffico al
backend integro più vicino. Se alcuni dei tuoi backend non sono integri, il traffico potrebbe
continuare a essere elaborato, ma con una distribuzione non ottimale. Ad esempio, il traffico
potrebbe essere indirizzato a una regione in cui sono ancora presenti backend integri, ma che è
molto più lontana dal client, introducendo latenza. Per identificare e monitorare lo
stato di integrità dei tuoi backend, prova a seguire questi passaggi:
- Controlla lo stato di integrità del servizio di backend nella console Google Cloud .
Vai ai servizi Cloud Service Mesh - Assicurati che il logging sia abilitato
per la risorsa
HealthCheck. - Se i controlli di integrità hanno iniziato a non andare a buon fine di recente, esamina Cloud Audit Logs
per determinare se la configurazione di
HealthCheckè stata modificata di recente.
Passaggi successivi
- Per risolvere i problemi di configurazione durante il deployment dei servizi gRPC senza proxy, consulta Risoluzione dei problemi dei deployment che utilizzano gRPC senza proxy.
- Per ulteriore assistenza sull'utilizzo di Cloud Service Mesh, consulta la pagina Richiedere assistenza.