Risoluzione dei problemi di Cloud Service Mesh gestito
Questo documento spiega i problemi più comuni di Cloud Service Mesh e come risolverli, ad esempio quando un pod viene inserito con istio.istio-system, lo strumento di installazione genera errori come codici di stato HTTP 400 ed errori di appartenenza al cluster.
Se hai bisogno di ulteriore assistenza per la risoluzione dei problemi di Cloud Service Mesh, consulta la pagina Richiedere assistenza.
Errore di segnalazione di revisioni non integre
Potresti visualizzare un errore generico Revision(s) reporting unhealthy se il service agent per Cloud Service Mesh gestito non ha il ruolo Identity and Access Management (IAM) richiesto. In genere, questo si verifica quando il ruolo viene revocato da Terraform, Puppet o dalla riconfigurazione CI/CD.
I passaggi necessari per risolvere questo errore dipendono dal fatto che tu stia utilizzando la Google Cloud console o Google Cloud CLI.
Google Cloud Console
Nella Google Cloud console, vai a IAM e amministrazione > IAM.
Seleziona Includi concessioni di ruoli fornite da Google.
Esamina l'elenco Entità.
Se nell'elenco vedi il service agent con il ruolo IAM richiesto, significa che è configurato correttamente.
Se l'elenco non include il service agent e il ruolo richiesto, vai al passaggio successivo.
Concedi il ruolo Service Agent Anthos Service Mesh (
roles/anthosservicemesh.serviceAgent) al service agent Cloud Service Mesh nel progetto. Per istruzioni, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Google Cloud CLI
In Google Cloud CLI, esegui questo comando per verificare se il ruolo IAM richiesto è stato concesso:
gcloud projects get-iam-policy PROJECT_ID \ --flatten="bindings[].members" \ --filter="bindings.members:serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com AND bindings.role:roles/anthosservicemesh.serviceAgent" \ --format='table(bindings.role)'Esamina l'elenco
ROLE.Se nell'elenco vedi dei ruoli, significa che è configurato correttamente.
Se non vedi alcun ruolo nell'elenco, significa che il ruolo richiesto è stato revocato.
Per concedere il ruolo richiesto al service agent, esegui questo comando:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \ --role="roles/anthosservicemesh.serviceAgent"
Lo strumento di installazione genera errori HTTP 400
Lo strumento di installazione potrebbe generare errori HTTP 400 come i seguenti:
HealthCheckContainerError, message: Cloud Run error: Container failed to start.
Failed to start and then listen on the port defined by the PORT environment
variable. Logs for this revision might contain more information.
L'errore può verificarsi se non hai abilitato Workload Identity nel cluster Kubernetes, cosa che puoi fare utilizzando il seguente comando:
export CLUSTER_NAME=...
export PROJECT_ID=...
export LOCATION=...
gcloud container clusters update $CLUSTER_NAME --zone $LOCATION \
--workload-pool=$PROJECT_ID.svc.id.goog
Stato del piano dati gestito
Il seguente comando mostra lo stato del piano dati gestito:
gcloud container fleet mesh describe --project PROJECT_ID
La tabella seguente elenca tutti i possibili stati del piano dati gestito:
| Stato | Codice | Descrizione |
|---|---|---|
ACTIVE |
OK |
Il piano dati gestito funziona normalmente. |
DISABLED |
DISABLED |
Il piano dati gestito sarà in questo stato se non è configurato alcuno spazio dei nomi o revisione
per utilizzarlo. Segui le istruzioni per
abilitare Cloud Service Mesh gestito tramite l'API Fleet o
abilitare il piano dati gestito dopo aver eseguito il provisioning di Cloud Service Mesh gestito con asmcli.
Tieni presente che la segnalazione dello stato del piano dati gestito è disponibile solo se hai
abilitato il piano dati gestito annotando uno spazio dei nomi o una revisione.
L'annotazione dei singoli pod fa sì che questi pod vengano gestiti, ma con uno
stato della funzionalità DISABLED se non vengono annotati spazi dei nomi o revisioni. |
FAILED_PRECONDITION |
MANAGED_CONTROL_PLANE_REQUIRED |
Il piano dati gestito richiede un control plane Cloud Service Mesh gestito attivo. |
PROVISIONING |
PROVISIONING |
È in corso il provisioning del piano dati gestito. Se questo stato persiste per più di 10 minuti, è probabile che si sia verificato un errore e devi contattare l'assistenza. |
STALLED |
INTERNAL_ERROR |
Il piano dati gestito non può funzionare a causa di una condizione di errore interno. Se il problema persiste, contatta l'assistenza. |
NEEDS_ATTENTION |
UPGRADE_FAILURES |
Il piano dati gestito richiede un intervento manuale per riportare il
servizio allo stato normale. Per ulteriori informazioni e su come risolvere
questo problema, consulta lo stato
NEEDS_ATTENTION. |
Stato NEEDS_ATTENTION
Se il comando gcloud container fleet mesh describe mostra che lo stato del piano dati gestito è NEEDS_ATTENTION e il codice è UPGRADE_FAILURES, significa che l'upgrade di determinati workload del piano dati gestito non è riuscito. Questi workload verranno etichettati con dataplane-upgrade: failed dal servizio del piano dati gestito per ulteriori analisi. Per eseguire l'upgrade dei proxy, è necessario riavviarli manualmente. Per visualizzare l'elenco dei pod che richiedono attenzione, esegui questo comando:
kubectl get pods --all-namespaces -l dataplane-upgrade=failed
Errore di appartenenza al cluster (nessun provider di identità specificato)
Lo strumento di installazione potrebbe non riuscire a causa di errori di appartenenza al cluster come i seguenti:
asmcli: [ERROR]: Cluster has memberships.hub.gke.io CRD but no identity
provider specified. Please ensure that an identity provider is available for the
registered cluster.
L'errore può verificarsi se non hai
abilitato Workload Identity GKE
prima di registrare il cluster. Puoi registrare di nuovo il cluster dalla riga
di comando utilizzando il
gcloud container fleet memberships register --enable-workload-identity comando.
Controlla lo stato del control plane gestito
Per controllare lo stato del control plane gestito, esegui
gcloud container fleet mesh describe --project FLEET_PROJECT_ID.
Nella risposta, il campo membershipStates[].servicemesh.controlPlaneManagement.details potrebbe spiegare l'errore specifico.
Se hai bisogno di ulteriori dettagli, controlla la risorsa personalizzata ControlPlaneRevision nel cluster, che viene aggiornata quando viene eseguito il provisioning del control plane gestito o se il provisioning non riesce.
Per esaminare lo stato della risorsa, sostituisci NAME con il valore
corrispondente a ogni canale: asm-managed, asm-managed-stable, o
asm-managed-rapid.
kubectl describe controlplanerevision NAME -n istio-system
L'output è simile al seguente:
Name: asm-managed
…
Status:
Conditions:
Last Transition Time: 2021-08-05T18:56:32Z
Message: The provisioning process has completed successfully
Reason: Provisioned
Status: True
Type: Reconciled
Last Transition Time: 2021-08-05T18:56:32Z
Message: Provisioning has finished
Reason: ProvisioningFinished
Status: True
Type: ProvisioningFinished
Last Transition Time: 2021-08-05T18:56:32Z
Message: Provisioning has not stalled
Reason: NotStalled
Status: False
Type: Stalled
La condizione Reconciled determina se il control plane gestito è in esecuzione correttamente. Se true, il control plane è in esecuzione correttamente.
Stalled determina se il processo di provisioning del control plane gestito ha riscontrato un errore. Se Stalled, il campo Message contiene ulteriori informazioni sull'errore specifico. Per ulteriori informazioni sui possibili errori, consulta la sezione
Codici di stallo.
Codici di stallo di ControlPlaneRevision
Esistono diversi motivi per cui la condizione Stalled potrebbe diventare true nello stato ControlPlaneRevisions.
| Motivo | Messaggio | Descrizione |
|---|---|---|
| PreconditionFailed | Sono supportate solo le appartenenze GKE, ma ${CLUSTER_NAME} non è un cluster GKE. | Il cluster attuale non sembra essere un cluster GKE. Il control plane gestito funziona solo sui GKE clusters. |
| Nome ControlPlaneRevision non supportato: ${NAME} | Il nome di ControlPlaneRevision deve essere uno dei seguenti:
|
|
| Spazio dei nomi ControlPlaneRevision non supportato: ${NAMESPACE} | Lo spazio dei nomi di ControlPlaneRevision deve essere istio-system. |
|
| Canale ${CHANNEL} non supportato per ControlPlaneRevision con nome${NAME}. Valore previsto ${OTHER_CHANNEL} | Il nome di ControlPlaneRevision deve corrispondere al canale di ControlPlaneRevision con quanto segue:
|
|
| Il campo relativo al canale non deve essere omesso o vuoto | Channel è un campo obbligatorio in ControlPlaneRevision. Manca o è vuoto nella risorsa personalizzata. |
|
| Tipo di revisione del control plane non supportato: ${TYPE} | managed_service è l'unico campo consentito per il campo ControlPlaneRevisionType. |
|
| Versione di Kubernetes non supportata: ${VERSION} | Sono supportate le versioni di Kubernetes 1.15 e successive. | |
| Workload Identity non è abilitato | Abilita Workload Identity nel cluster. | |
| Pool di workload non supportato: ${POOL} | Il pool di workload deve avere il formato ${PROJECT_ID}.svc.id.goog. |
|
| ProvisioningFailed | Si è verificato un errore durante l'aggiornamento delle risorse del cluster | Google non è riuscita ad aggiornare le risorse in-cluster, come CRD e webhook. |
| MutatingWebhookConfiguration "istiod-asm-managed" contiene un webhook con l'URL ${EXISTING_URL}, ma è previsto ${EXPECTED_URL} | Google non sovrascriverà i webhook esistenti per evitare di interrompere l'installazione. Aggiorna manualmente se è il comportamento desiderato. | |
| ValidatingWebhookConfiguration ${NAME} contiene un webhook con l'URL ${EXISTING_URL}, ma è previsto ${EXPECTED_URL} | Google non sovrascriverà i webhook esistenti per evitare di interrompere l'installazione. Aggiorna manualmente se è il comportamento desiderato. |
Cloud Service Mesh gestito non è in grado di connettersi al cluster GKE
Tra giugno 2022 e settembre 2022, Google ha completato il lavoro di sicurezza relativo a Reti autorizzate, Cloud Run e Cloud Run Functions su Google Kubernetes Engine (GKE). I progetti che in precedenza utilizzavano Cloud Service Mesh gestito, ma hanno smesso di utilizzarlo prima della migrazione, non hanno l'API richiesta per la comunicazione tra Cloud Run e GKE.
In questo scenario, il provisioning di Cloud Service Mesh gestito non riuscirà e Cloud Logging visualizzerà il seguente messaggio di errore:
Connect Gateway API has not been used in project [*PROJECT_NUMBER*] before or it is disabled.
Enable it by visiting https://console.developers.google.com/apis/api/connectgateway.googleapis.com/overview?project=[*PROJECT_NUMBER*] then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
Filtra questo messaggio utilizzando la seguente query:
resource.type="istio_control_plane"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
severity=ERROR
jsonPayload.message=~"Connect Gateway API has not been used in project"
Nel frattempo, anche l'inserimento di sidecar e il deployment di qualsiasi risorsa personalizzata Kubernetes correlata a Cloud Service Mesh non riusciranno e Cloud Logging visualizzerà il seguente messaggio di avviso:
Error creating: Internal error occurred: failed calling webhook
"rev.namespace.sidecar-injector.istio.io": failed to call webhook: an error on
the server ("unknown") has prevented the request from succeeding.
Filtra questo messaggio utilizzando la seguente query:
resource.type="k8s_cluster"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
resource.labels.cluster_name=[*CLUSTER_NAME*]
severity=WARNING
jsonPayload.message=~"Internal error occurred: failed calling webhook"
Per risolvere il problema:
Abilita l'API
connectgatewayrichiesta:gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]Esegui un riavvio in sequenza dei workload.
Google Cloud Le API non sono abilitate
Se il parco risorse di Cloud Service Mesh gestito utilizza l'implementazione del TRAFFIC_DIRECTOR
control plane,
devono essere abilitate determinate API.
Abilita tutte le API richieste, incluse quelle elencate come "Può essere disabilitato" quando non utilizzi Cloud Service Mesh gestito.
gcloud services enable --project=[*PROJECT_ID*] \ trafficdirector.googleapis.com \ networkservices.googleapis.com \ networksecurity.googleapis.comAssicurati di non avere strumenti automatizzati che ripristinino questa modifica. Se l'errore si ripresenta, aggiorna le configurazioni o le liste consentite pertinenti.