Risoluzione dei problemi gestiti di Cloud Service Mesh

Questo documento illustra i problemi comuni di Cloud Service Mesh e come risolverli ad esempio quando in un pod viene inserito istio.istio-system, il processo di installazione genera errori come codici di stato HTTP 400 e appartenenza al cluster errori.

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

Revisioni segnalate come errori di stato non integro

Potresti visualizzare un errore Revision(s) reporting unhealthy generico se il servizio per la gestione di Cloud Service Mesh non dispone dell'autorizzazione Ruolo IAM (Identity and Access Management). In genere, questo si verifica quando il ruolo viene revocato tramite la riconfigurazione di Terraform, Puppet o CI/CD.

I passaggi necessari per risolvere questo errore variano a seconda che tu stia utilizzando o meno la console Google Cloud o Google Cloud CLI.

Console Google Cloud

  1. Nella console Google Cloud, vai alla sezione IAM e Amministratore > IAM.

  2. Seleziona Includi concessioni dei ruoli fornite da Google.

  3. Esamina l'elenco Entità.

    Se vedi l'agente di servizio con il ruolo IAM richiesto in dall'elenco, significa che sia configurato correttamente.

    Se l'elenco non include l'agente di servizio e il ruolo richiesto: vai al passaggio successivo.

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

Google Cloud CLI

  1. In Google Cloud CLI, esegui questo comando per verificare se è stato concesso il ruolo IAM richiesto:

    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 ruoli, significa che è configurato correttamente.

    Se nell'elenco non vedi alcun ruolo, significa che il ruolo richiesto è revocata.

  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 abilitato Identità carico di lavoro sul tuo cluster Kubernetes, che puoi fare utilizzando questo 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 comando seguente visualizza lo stato del piano dati gestito:

gcloud container fleet mesh describe --project PROJECT_ID

La seguente tabella 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 è presente nessuno spazio dei nomi o revisione configurato per utilizzarlo. Segui le istruzioni per abilitare Cloud Service Mesh gestito tramite l'API del parco risorse oppure abilitare il piano dati 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 abilitato il piano dati gestito annotando uno spazio dei nomi o una revisione. L'annotazione dei singoli pod fa sì che vengano gestiti, ma con un lo stato della funzionalità DISABLED se non sono presenti spazi dei nomi o revisioni annotato.
FAILED_PRECONDITION MANAGED_CONTROL_PLANE_REQUIRED Il piano dati gestito richiede un controllo Cloud Service Mesh attivo e gestito aereo.
PROVISIONING PROVISIONING È in corso il provisioning del piano dati gestito. Se questo stato persiste per non superino i 10 minuti, è probabile che si sia verificato un errore ed è necessario contatta l'assistenza.
STALLED INTERNAL_ERROR Il funzionamento del piano dati gestito è bloccato a causa di un errore interno . Se il problema persiste, contatta l'assistenza.
NEEDS_ATTENTION UPGRADE_FAILURES Il piano dati gestito richiede un intervento manuale per trasferire per ripristinare lo stato normale del servizio. Per ulteriori informazioni e per la risoluzione del problema questo problema, vedi Stato NEEDS_ATTENTION.

NEEDS_ATTENTION stato

Se il comando gcloud container fleet mesh describe indica che l'URL gestito lo stato del piano dati è in stato NEEDS_ATTENTION e il codice è UPGRADE_FAILURES, l'upgrade del piano dati gestito non è riuscito carichi di lavoro con scale out impegnativi. Questi carichi di lavoro verranno etichettati con dataplane-upgrade: failed da il servizio piano dati gestito per ulteriori analisi. I proxy devono essere riavviato manualmente per eseguire l'upgrade. per ottenere l'elenco dei pod che richiedono 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 con errori di appartenenza al cluster come il 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 disponi di Identità dei carichi di lavoro GKE abilitata prima di registrare il cluster. Puoi registrare di nuovo il cluster nel comando utilizzando la riga Comando gcloud container fleet memberships register --enable-workload-identity.

Verifica lo stato del piano di controllo gestito

Per verificare lo stato del piano di controllo gestito, esegui gcloud container fleet mesh describe --project FLEET_PROJECT_ID.

Nella risposta, membershipStates[].servicemesh.controlPlaneManagement.details campo potrebbe a spiegare l'errore specifico.

Se hai bisogno di ulteriori dettagli, controlla la risorsa personalizzata ControlPlaneRevision nel cluster, che viene aggiornato quando viene eseguito il provisioning del piano di controllo gestito o se non riesce a eseguire il provisioning.

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 a questo:

    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 è non funziona correttamente. Se true, il piano di controllo è in esecuzione correttamente. Stalled determina se il processo di provisioning del piano di controllo gestito ha ha riscontrato un errore. Se Stalled, il campo Message contiene altri le informazioni sull'errore specifico. Consulta Codici bloccati per ulteriori informazioni su possibili errori.

Codici in stalla ControlPlaneRevision

Esistono diversi motivi per cui la condizione Stalled potrebbe diventare vera nel Stato ControlPlaneRevisions.

Motivo Messaggio Descrizione
PreconditionFailed Sono supportate solo le appartenenze a GKE, ma ${CLUSTER_NAME} non è un cluster GKE. Il cluster attuale non sembra essere un cluster GKE. Il piano di controllo gestito funziona solo su cluster GKE.
Nome revisione piano di controllo non supportato: ${NAME} Il nome della revisione del piano di controllo 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}. Previsto ${OTHER_CHANNEL} Il nome di ControlPlaneRevision deve corrispondere al canale di ControlPlaneRevision con quanto segue:
  • gestito da asm -> regolare
  • asm-managed-rapid -> rapida
  • asm-managed-stable -> stabile
Il canale non deve essere omesso o vuoto Channel è un campo obbligatorio di ControlPlaneRevision. Mancante 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.
Workload Identity non è abilitato Abilita Workload Identity sul tuo cluster.
Pool di carichi di lavoro non supportato: ${POOL} Il pool di carichi di lavoro deve essere nel 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 nel 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. Aggiorna manualmente il comportamento desiderato.
ConvalidaWebhookConfiguration ${NAME} contiene un webhook con URL ${EXISTING_URL} ma previsto ${expected_URL} Google non sovrascriverà i webhook esistenti per evitare di interrompere l'installazione. Aggiorna manualmente il comportamento desiderato.

Managed Cloud Service Mesh non è in grado di connettersi al cluster GKE

Tra giugno 2022 e settembre 2022, Google ha completato le attività di sicurezza relative a reti autorizzate, Cloud Run e Cloud Functions Google Kubernetes Engine (GKE). 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 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 query seguente:

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 file collaterali e il deployment di eventuali risorse personalizzate Kubernetes correlate a Cloud Service Mesh avranno esito negativo. 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 query seguente:

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 sui carichi di lavoro.

Le API Google Cloud non sono abilitate

Se il tuo parco risorse Cloud Service Mesh gestito utilizza TRAFFIC_DIRECTOR l'implementazione del piano di controllo, alcune API devono essere abilitate.

  1. Abilita tutte le API richieste, incluse quelle con la dicitura "Può essere disattivata" se 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 disporre di strumenti automatizzati per annullare questa operazione modifica. Se l'errore si ripete, aggiorna le configurazioni pertinenti oppure in liste consentite.