Risolvere i problemi di Cloud Service Mesh gestito

Questo documento illustra i problemi comuni di Cloud Service Mesh e come risolverli. Ad esempio, quando un pod viene iniettato con istio.istio-system, lo strumento di installazione genera errori come i codici di stato HTTP 400 e gli errori di appartenenza al cluster.

Se hai bisogno di ulteriore assistenza per la risoluzione dei problemi di Cloud Service Mesh, consulta Ricevere assistenza.

Revisioni segnalate come errori non integri

Potresti visualizzare un errore Revision(s) reporting unhealthy generico se l'agente di servizio per Cloud Service Mesh gestito non dispone del ruolo IAM (Identity and Access Management) 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 dall'utilizzo della console Google Cloud o di Google Cloud CLI.

Console Google Cloud

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

  2. Seleziona Includi concessioni di ruoli fornite da Google.

  3. Esamina l'elenco Principale.

    Se nell'elenco è presente l'agente di servizio con il ruolo IAM richiesto, significa che è configurato correttamente.

    Se l'elenco non include l'agente di servizio e il ruolo richiesto, continua con il passaggio successivo.

  4. Concedi il ruolo Agente di servizio Anthos Service Mesh (roles/anthosservicemesh.serviceAgent) all'agente di servizio Cloud Service Mesh nel progetto. Per le istruzioni, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.

Google Cloud CLI

  1. In Google Cloud CLI, esegui il seguente 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 sono presenti 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 all'agente di servizio, 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 attivato Workload Identity sul tuo cluster Kubernetes, 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 di dati gestito:

Stato Codice Descrizione
ACTIVE OK Il piano dati gestito funziona normalmente.
DISABLED DISABLED Il piano di dati gestito sarà in questo stato se non è configurato alcun spazio dei nomi o revisione per utilizzarlo. Segui le istruzioni per abilitare Cloud Service Mesh gestito tramite l'API Fleet o abilitare il data plane gestito dopo il provisioning di Cloud Service Mesh gestito con asmcli. Tieni presente che i report sullo stato del piano dati gestito sono disponibili solo se hai attivato il piano dati gestito annotando un nome di spazio o una revisione. L'annotazione dei singoli pod ne consente la gestione, ma con stato della funzionalità DISABLED se non vengono annotati spazi dei nomi o revisioni.
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED Il data plane gestito richiede un piano di controllo 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 funzionamento del data plane gestito è bloccato 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 Stato NEEDS_ATTENTION.

Stato NEEDS_ATTENTION

Se il comando gcloud container fleet mesh describe mostra che lo stato del piano di dati gestito è NEEDS_ATTENTION e il codice è UPGRADE_FAILURES, significa che non è stato possibile eseguire l'upgrade di determinati carichi di lavoro nel piano di dati gestito. Questi carichi di lavoro verranno etichettati con dataplane-upgrade: failed dal servizio del piano di dati gestito per ulteriori analisi. Per eseguire l'upgrade, i proxy devono essere riavviati manualmente. Per ottenere l'elenco dei pod che richiedono attenzione, esegui il seguente 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 con 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 attivato Workload Identity di GKE prima di registrare il cluster. Puoi registrare di nuovo il cluster sulla riga di comando utilizzando il comando gcloud container fleet memberships register --enable-workload-identity.

Controllare lo stato del piano di controllo gestito

Per controllare lo stato del piano di controllo 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 piano di controllo gestito o se il provisioning non va a buon fine.

Per controllare lo stato della risorsa, sostituisci NAME con il valore corrispondente a ciascun 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 piano di controllo gestito è in funzione correttamente. Se true, il piano di controllo è in esecuzione correttamente. Stalled determina se il processo di provisioning del piano di controllo gestito ha riscontrato un errore. Se Stalled, il campo Message contiene maggiori informazioni sull'errore specifico. Per ulteriori informazioni su possibili errori, consulta la sezione Codici in stallo.

ControlPlaneRevision Stalled Codes

Esistono diversi motivi per cui la condizione Stalled potrebbe diventare vera nello stato ControlPlaneRevisions.

Motivo Messaggio Descrizione
PreconditionFailed Sono supportate solo le iscrizioni a GKE, ma ${CLUSTER_NAME} non è un cluster GKE. Il cluster attuale non sembra essere un cluster GKE. Il control plane gestito funziona solo su cluster GKE.
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 canale non deve essere omesso o vuoto Channel è un campo obbligatorio in ControlPlaneRevision. Non è presente o è vuoto nella risorsa personalizzata.
Tipo di revisione del piano di controllo 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.
L'identità del carico di lavoro non è abilitata Abilita Workload Identity sul cluster.
Pool di workload non supportato: ${POOL} Il pool di workload deve essere nel formato ${PROJECT_ID}.svc.id.goog.
ProvisioningFailed Si è verificato un errore durante l'aggiornamento delle risorse del cluster Google non è stato in grado di aggiornare le risorse all'interno del cluster, come CRD e webhook.
MutatingWebhookConfiguration "istiod-asm-managed" contiene un webhook con URL ${EXISTING_URL}, ma è previsto ${EXPECTED_URL} Google non sovrascriverà i webhook esistenti per evitare di interrompere l'installazione. Aggiornalo manualmente se si tratta del comportamento desiderato.
ValidatingWebhookConfiguration ${NAME} contiene un webhook con URL ${EXISTING_URL}, ma si prevedeva ${EXPECTED_URL} Google non sovrascriverà i webhook esistenti per evitare di interrompere l'installazione. Aggiornalo manualmente se si tratta del comportamento desiderato.

Cloud Service Mesh gestito non riesce a connettersi al cluster GKE

Tra giugno e settembre 2022, Google ha completato i lavori di sicurezza relativi a reti autorizzate, Cloud Run e funzioni Cloud Run su Google Kubernetes Engine (GKE). I progetti che in precedenza utilizzavano Cloud Service Mesh gestito, ma hanno smesso di utilizzarlo prima della migrazione, non dispongono dell'API richiesta per la comunicazione tra Cloud Run e GKE.

In questo scenario, il provisioning di Cloud Service Mesh gestito non andrà a buon fine e Cloud Logging mostrerà 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'iniezione di sidecar e il deployment di eventuali risorse personalizzate Kubernetes correlate a Cloud Service Mesh non andranno a buon fine e Cloud Logging mostrerà 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 graduale dei carichi di lavoro.

Le API Google Cloud non sono abilitate

Se il tuo parco risorse Cloud Service Mesh gestito utilizza l'TRAFFIC_DIRECTOR implementazione del control plane, devono essere attivate alcune API.

  1. Abilita tutte le API richieste, incluse quelle indicate come "Può essere disattivata" 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 automatici che annullano questa modifica. Se l'errore si ripresenta, aggiorna le configurazioni o le liste consentite pertinenti.

La federazione delle identità per i carichi di lavoro di NodePool per GKE è disattivata

Il seguente comando mostra lo stato di Cloud Service Mesh gestito:

    gcloud container fleet mesh describe

Potresti visualizzare il codice di errore NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED nel campo Conditions del tuo abbonamento:

    membershipStates:
      projects/test-project/locations/us-central1/memberships/my-membership:
        servicemesh:
          conditions:
          - code: NODEPOOL_WORKLOAD_IDENTITY_FEDERATION_REQUIRED
            details: One or more node pools have workload identity federation disabled.
            documentationLink: https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
            severity: ERROR
          controlPlaneManagement:
            details:
            - code: REVISION_FAILED_PRECONDITION
              details: Required in-cluster components are not ready. This will be retried
                within 15 minutes.
            implementation: TRAFFIC_DIRECTOR
            state: FAILED_PRECONDITION

Questo errore viene visualizzato se nel cluster GKE non è abilitata la federazione Workload Identity su tutti i pool di nodi del cluster, poiché questo è un prerequisito per l'installazione di Cloud Service Mesh.

Per risolvere questo messaggio di errore, devi seguire le istruzioni per abilitare la federazione di Workload Identity su tutti i pool di nodi. Tieni presente che l'attivazione può variare a seconda della richiesta specifica del cluster.

Dopo l'attivazione, il messaggio di errore dovrebbe essere rimosso automaticamente e il tuo cluster dovrebbe tornare allo stato ACTIVE. Se il problema persiste e hai bisogno di ulteriore assistenza, consulta la sezione Ricevere assistenza.