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

  1. Nella Google Cloud console, vai a IAM e amministrazione > IAM.

  2. Seleziona Includi concessioni di ruoli fornite da Google.

  3. 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.

  4. 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

  1. 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)'
    
  2. 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.

  3. 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:
  • asm-managed
  • asm-managed-rapid
  • asm-managed-stable
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:
  • asm-managed -> regular
  • asm-managed-rapid -> rapid
  • asm-managed-stable -> stable
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:

  1. Abilita l'API connectgateway richiesta:

     gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
    
  2. Reinstalla Cloud Service Mesh gestito.

  3. 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.

  1. 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.com
    
  2. Assicurati di non avere strumenti automatizzati che ripristinino questa modifica. Se l'errore si ripresenta, aggiorna le configurazioni o le liste consentite pertinenti.