Risoluzione dei problemi di supporto delle VM in Anthos Service Mesh

I passaggi e i log seguenti sono utili per la risoluzione dei problemi relativi al supporto delle VM di Anthos Service Mesh.

Esegui il debug della VM

Se noti che le istanze VM sono in esecuzione ma non raggiungibili dal mesh, esegui i passaggi seguenti nell'istanza VM.

Verifica l'agente

  1. Controlla lo stato del proxy del mittente:

    curl localhost:15000/ready -v
    
  2. Controlla il log degli errori di inviati

    less /var/log/envoy/envoy.err.log
    
  3. Verifica la presenza di errori service-proxy-agent:

    journalctl -u service-proxy-agent
    
  4. Controlla il log syslog della suite operativa di Google Cloud per l'istanza o nella VM in /var/log/syslog per Debian e /var/log/messages per Centos.

Verifica integrità proxy

  1. Per eseguire il debug della configurazione del proxy, esegui il comando seguente sulla VM:

    curl localhost:15000/config_dump > config.out
    
  2. Copia il file ed esegui il comando seguente:

    istioctl proxy-config [cluster|route|listener] --file config.out
    

Errori del token non validi

Nel log degli errori inviati, potresti visualizzare un errore simile al seguente:

E0217 17:59:17.206995798    2411 oauth2_credentials.cc:152]  Call to http server ended with error 500 [{
  "error": "invalid_target",
  "error_description": "federated token response does not have access token. {\"error\":\"invalid_grant\",\"error_description\":\"JWT expired.\"}",
  "error_uri": ""
}].

In questo caso, controlla se il token in /var/run/secrets/tokens/istio-token nella VM è scaduto e verifica che il valore di exp (epoca) non sia scaduto:

cat /var/run/secrets/tokens/istio-token | cut -d '.' -f2 | base64 -d | python -m json.tool
{
    ...
    "azp": "...",
    "email": "example-service-account@developer.gserviceaccount.com",
    "email_verified": true,
    "exp": 1613995395,
    "google": {
        "compute_engine": {
            "instance_creation_timestamp": 1613775765,
            "instance_id": "5678",
            "instance_name": "vm-instance-03-0mqh",
            "project_id": "...",
            "project_number": 1234,
            "zone": "us-central1-c"
        }
    },
    "iat": ...,
    "iss": "https://accounts.google.com",
    "sub": "..."
}

Informazioni sugli avvisi di distribuzione del sistema operativo non supportati

In verifica l'agente, se nel log service-proxy-agent viene visualizzato un messaggio di avviso simile al seguente:

E0217 17:59:17.206995798    2021-04-09T21:21:29.6091Z service-proxy-agent Warn
Detected image is unsupported: [Ubuntu|Fedora|Suse]. Envoy may not work correctly.

Ciò significa che la distribuzione di Linux potrebbe non essere supportata, causando potenzialmente un comportamento imprevisto del proxy.

Esegui il debug del cluster

Utilizza la seguente procedura per la risoluzione dei problemi relativi al cluster.

Verificare il funzionamento della registrazione automatica

  1. Controlla la WorkloadEntry generata automaticamente da istiod:

    kubectl get workloadentry -n WORKLOAD_NAMESPACE
    

    Inoltre, puoi verificarne l'esistenza nel browser degli oggetti Kubernetes.

  2. Se non esiste, verifica la presenza di errori nei log di istiod, che dovrebbero essere disponibili nella suite operativa di Google Cloud. In alternativa, puoi recuperarli direttamente:

    kubectl -n istio-system get pods -l app=istiod
    

    L'output previsto è simile al seguente:

    NAME                                       READY   STATUS    RESTARTS   AGE
    istiod-asm-190-1-7f6699cfb-5mzxw           1/1     Running   0          5d13h
    istiod-asm-190-1-7f6699cfb-pgvpf           1/1     Running   0          5d13h
    
  3. Imposta la variabile di ambiente del pod e utilizzala per esportare i log:

    export ISTIO_POD=istiod-asm-190-1-7f6699cfb-5mzxw
    kubectl logs -n istio-system ${ISTIO_POD} | grep -i 'auto-register\|WorkloadEntry'
    

Controlla i proxy connessi

Puoi utilizzare il comando proxy-status per elencare tutti i proxy connessi, inclusi quelli per le VM:

istioctl proxy-status

L'output dovrebbe mostrare proxy connessi simili a:

NAME                                                    CDS        LDS        EDS        RDS          ISTIOD                               VERSION
details-v1-5f449bdbb9-bhl8d.default                     SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0-asm.1
httpbin-779c54bf49-647vd.default                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-eastwestgateway-5b6d4ddd9d-5rzx2.istio-system     SYNCED     SYNCED     SYNCED     NOT SENT     istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-ctb6b.istio-system      SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0-asm.1
istio-ingressgateway-66b6ddd7cb-vk4bb.istio-system      SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0-asm.1
vm-instance-03-39b3.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0
vm-instance-03-nh5k.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-pgvpf     1.9.0
vm-instance-03-s4nl.496270428946                        SYNCED     SYNCED     SYNCED     SYNCED       istiod-asm-190-1-7f6699cfb-5mzxw     1.9.0

Per maggiori informazioni sulle opzioni dei comandi, consulta la pagina istioctl proxy-config.

Controlla la configurazione dell'identità del carico di lavoro

Controlla lo stato mesh per individuare potenziali errori nel cluster. La versione più recente di gcloud è obbligatoria. Per maggiori informazioni, consulta l'aggiornamento all'ultima versione.

gcloud alpha container hub mesh describe --project=PROJECT_ID

Una configurazione valida avrà un codice di stato OK per il cluster dei membri:

createTime: '2021-06-15T21:56:10.221032150Z'
featureState:
  detailsByMembership:
    projects/<your project number>/locations/global/memberships/<your cluster name>:
      code: OK
      description: Revision(s) ready for use: istiod-asm-195-2.
      updateTime: 2021-06-15T21:56:10.221032402Z
  lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T21:56:10.221032402Z'

Se la VM non è configurata correttamente, il codice di stato sarà WARNING con dettagli aggiuntivi nella descrizione:

createTime: '2021-06-15T22:56:10.227167202Z'
featureState:
  detailsByMembership:
    projects/<your project number>/locations/global/memberships/<your cluster name>:
      code: WARNING
      description: |-
        Revision(s) ready for use: istiod-asm-195-2.
        WorkloadGroup <namespace>/<workloadgroup name> missing ServiceAccount field, please see https://cloud.google.com/service-mesh/docs/troubleshooting/troubleshoot-vms#verify_the_workloadgroup_is_set_up_correctly.
      servicemeshFeatureState: {}
      updateTime: '2021-06-15T22:56:00.220164192Z'
  lifecycleState: ENABLED
name: projects/<your project name>/locations/global/features/servicemesh
servicemeshFeatureSpec: {}
updateTime: '2021-06-15T22:56:10.227167402Z'

Verifica che il provider di identità sia configurato correttamente

Controlla i campi della risorsa IdentityProvider:

 kubectl describe identityprovider

Assicurati che i campi soddisfino i seguenti requisiti:

  • Il campo serviceAccount è impostato su request.auth.claims["email"]
  • Il campo issuerURI è impostato su https://accounts.google.com (al momento supportiamo google solo come emittenteURI).
  • Il campo name del fornitore in Metadati deve essere impostato su google, che è l'unico fornitore attualmente supportato.

    Un esempio di RP IdentityProvider valido:

    apiVersion: security.cloud.google.com/v1alpha1
    kind: IdentityProvider
    metadata:
      name: google
    spec:
      authentication:
        oidc:
          issuerUri: https://accounts.google.com
      serviceAccount: request.auth.claims["email"]
    

Verifica che WorkloadGroup sia configurato correttamente

Controlla WorkloadGroup:

 kubectl get workloadgroup -n WORKLOAD_NAMESPACE

Assicurati che i risultati soddisfino questi requisiti:

  • Il campo serviceAccount è impostato correttamente, ad esempio 373206437219-compute@developer.gserviceaccount.com, dove l'account è lo stesso dell'account di servizio utilizzato dall'istanza VM.
  • Il security.cloud.google.com/IdentityProvider nel campo dell'annotazione è impostato, ad esempio security.cloud.google.com/IdentityProvider: google
  • Il gruppo di carichi di lavoro fa riferimento a un IdentityProvider valido, che puoi verificare controllando il provider di identità esistente:

    kubectl describe identityprovider
    

    L'output dovrebbe essere un elenco di provider esistenti come questo:

     NAME     AGE
     google   39m
    

    Controlla il campo security.cloud.google.com/IdentityProvider in WorkloadGroup se il provider esiste nell'elenco dei provider esistenti.

    Un esempio di RP WorkloadGroup valido:

    apiVersion: networking.istio.io/v1alpha3
    kind: WorkloadGroup
    metadata:
    name: wg-a
    namespace: foo
    spec:
    metadata:
      annotations:
        security.cloud.google.com/IdentityProvider: google
      labels:
        app: wg-a
    template:
      ports:
        grpc: 3550
        http: 8080
      serviceAccount: 373206437219-compute@developer.gserviceaccount.com
    

Trovato errore interno

Se ricevi il messaggio Internal Error Found, consulta l'articolo Assistenza.

Guida alla risoluzione dei problemi di Istio VM

Per ulteriori passaggi per la risoluzione dei problemi, consulta Debug delle macchine virtuali.