Richiedi log del proxy

Le pagine Cloud Service Mesh forniscono link a due diversi tipi di log in Cloud Logging: Log degli accessi (noti anche come log di Envoy) e Log del traffico (anche noti come log di accesso di Google Cloud Observability).

Log degli accessi

Abilita i log di accesso

I passaggi necessari per abilitare i log di accesso dipendono dal tipo di Cloud Service Mesh. gestito o in-cluster:

Visualizza log di accesso

Per visualizzare i log degli accessi in Esplora log:

  1. Vai a Esplora log:

    Vai a Esplora log

  2. Seleziona il progetto Google Cloud appropriato.

  3. Esegui questa query:

    resource.type="k8s_container" \
    resource.labels.container_name="istio-proxy"
    resource.labels.cluster_name="CLUSTER_NAME" \
    resource.labels.namespace_name="NAMESPACE_NAME" \
    resource.labels.pod_name="POD_NAME"
    

Log sul traffico

Attiva log sul traffico

I log sul traffico sono abilitati per impostazione predefinita a meno che Cloud Service Mesh non sia installato su Google Distributed Cloud with Istio CA (precedentemente noto come Citadel).

Per attivare i log del traffico su Google Distributed Cloud con la CA Istio durante l'installazione di Cloud Service Mesh nel cluster, utilizza il flag --option stackdriver. In alternativa, puoi attivare i log del traffico su Google Distributed Cloud con la CA Istio dopo aver installato Cloud Service Mesh nel cluster.

Visualizza log di traffico

Visualizzare i log di traffico in Esplora log

Per visualizzare i log di traffico nel Esplora log:

  1. Vai a Esplora log:

    Vai a Esplora log

  2. Seleziona il progetto Google Cloud appropriato.

  3. Esegui la seguente query a seconda che tu stia visualizzando i log di accesso del client o del server:

    Log del server

    resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/server-accesslog-stackdriver"
    

    Log client

    resource.labels.cluster_name="CLUSTER_NAME" logName="projects/PROJECT_NAME/logs/client-accesslog-stackdriver"
    

Visualizza i log del traffico nella pagina Anthos Service Mesh

Per visualizzare i log del traffico nella pagina Cloud Service Mesh per un servizio durante un periodo di tempo specificato:

  1. Nella console Google Cloud, vai alla pagina Cloud Service Mesh.

    Vai alla pagina Cloud Service Mesh

  2. Nella sezione Servizi, seleziona il nome del servizio che vuoi ispezionare.

  3. Vai alla pagina Metriche.

  4. Specifica un intervallo di tempo dal menu a discesa Intervallo di tempo oppure impostare un intervallo personalizzato con la sequenza temporale.

  5. Fai clic su Visualizza log di traffico.

Il log del traffico si chiama server-accesslog-stackdriver ed è associato alla risorsa monitorata corrispondente (k8s_container o gce_instance) utilizzata dal servizio. Il log del traffico contiene le seguenti informazioni:

  • Proprietà delle richieste HTTP, come ID, URL, dimensioni, latenza e intestazioni comuni.

  • Informazioni sui carichi di lavoro di origine e di destinazione, ad esempio nome, spazio dei nomi identità ed etichette comuni.

  • Se il tracciamento è abilitato, le informazioni di traccia, come campionamento, ID traccia e ID intervallo.

Un esempio di voce di log ha il seguente aspetto:

{
  insertId: "1awb4hug5pos2qi"
  httpRequest: {
    requestMethod: "GET"
    requestUrl: "YOUR-INGRESS/productpage"
    requestSize: "952"
    status: 200
    responseSize: "5875"
    remoteIp: "10.8.0.44:0"
    serverIp: "10.56.4.25:9080"
    latency: "1.587232023s"
    protocol: "http"
  }
  resource: {
    type: "k8s_container"
    labels: {
      location: "us-central1-a"
      project_id: "YOUR-PROJECT"
      pod_name: "productpage-v1-76589d9fdc-ptnt9"
      cluster_name: "YOUR-CLUSTER-NAME"
      container_name: "productpage"
      namespace_name: "default"
    }
  }
  timestamp: "2020-04-28T19:55:21.056759Z"
  severity: "INFO"
  labels: {
    destination_principal: "spiffe://cluster.local/ns/default/sa/bookinfo-productpage"
    response_flag: "-"
    destination_service_host: "productpage.default.svc.cluster.local"
    source_app: "istio-ingressgateway"
    service_authentication_policy: "MUTUAL_TLS"
    source_name: "istio-ingressgateway-5ff85d8dd8-mwplb"
    mesh_uid: "YOUR-MESH-UID"
    request_id: "021ce752-9001-4ac6-b6d6-3b15f5d3632"
    destination_namespace: "default"
    source_principal:  "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
    destination_workload: "productpage-v1"
    destination_version: "v1"
    source_namespace: "istio-system"
    source_workload: "istio-ingressgateway"
    destination_name: "productpage-v1-76589d9fdc-ptnt9"
    destination_app: "productpage"
  }
  trace: "projects/YOUR-PROJECT/traces/d4197f59b7a43e3aeff3571bac99d536"
  receiveTimestamp: "2020-04-29T03:07:14.362416217Z"
  spanId: "43226343ca2bb2b1"
  traceSampled: true
  logName: "projects/YOUR-PROJECT/logs/server-accesslog-stackdriver"
  receiveTimestamp: "2020-04-28T19:55:32.185229100Z"
}

Interpretare la telemetria di Anthos Service Mesh

Le sezioni seguenti spiegano come controllare lo stato della mesh e esaminare le varie telemetrie che contengono dettagli utili per la risoluzione dei problemi.

Interpreta le metriche del piano di controllo

Quando installi Cloud Service Mesh con il piano di controllo interno al cluster, istiod esporta le metriche in Google Cloud Observability per il monitoraggio, per impostazione predefinita. istiod antepone queste metriche a istio.io/control e fornisce informazioni sullo stato del piano di controllo, ad esempio il numero di proxy connessi a ogni istanza del piano di controllo, eventi di configurazione, push e convalide.

Osserva il piano di controllo o risolvi i relativi problemi seguendo questa procedura.

  1. Carica una dashboard di esempio:

    git clone https://github.com/GoogleCloudPlatform/monitoring-dashboard-samples && cd monitoring-dashboard-samples/dashboards && git checkout servicemesh
  2. Installa la dashboard di Cloud Service Mesh:

    gcloud monitoring dashboards create --config-from-file=dashboards/servicemesh/anthos-service-mesh-control-plane-monitoring.json
  3. Cerca una dashboard denominata Istio Control Plane Dashboard nell'elenco. Per ulteriori informazioni, vedi Visualizzazione della dashboard installata.

Per l'elenco completo delle metriche disponibili, consulta: Metriche esportate.

Diagnostica dei ritardi nella configurazione

I seguenti passaggi spiegano come utilizzare la metrica pilot_proxy_convergence_time per diagnosticare un ritardo tra una modifica della configurazione e la convergenza di tutti i proxy.

  1. Esegui un comando shell in un pod:

    kubectl exec -it $(kubectl get pod -l app=pilot -o jsonpath='{.items[0].metadata.name}' -n istio-system) -n istio-system -c istio-proxy -- curl -s
  2. Accedi a localhost:15014 e grep per convergence nelle metriche:

    curl http://localhost:15014/metrics | grep convergence

Interpreta i log di accesso di Google Cloud Observability

Le seguenti informazioni spiegano come utilizzare i log di accesso di Google Cloud Observability per risolvere i problemi di connessione. Osservabilità di Google Cloud i log di accesso/traffico sono abilitati per impostazione predefinita.

Cloud Service Mesh esporta i dati nei log di accesso di Google Cloud Observability che possono aiutarti a eseguire il debug dei seguenti tipi di problemi:

  • Flusso di traffico e errori
  • Routing delle richieste end-to-end

I log di accesso di Google Cloud Observability sono abilitati per impostazione predefinita per le installazioni di Cloud Service Mesh su Google Kubernetes Engine. Puoi attivare i log di accesso di Google Cloud Observability eseguendo di nuovo asmcli install. Utilizza le stesse opzioni che hai scelto installato inizialmente, ma ometti l'overlay personalizzato che ha disabilitato Stackdriver.

Esistono due tipi di log degli accessi:

  • I log di accesso al server forniscono una vista lato server delle richieste. Si trovano in server-accesslog-stackdriver, collegate alla risorsa monitoratak8s_container. Utilizza la seguente sintassi dell'URL per visualizzare i log di accesso lato server:

    https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/server-accesslog-stackdriver"&project=PROJECT_ID
  • I log degli accessi client forniscono una vista lato client delle richieste. Si trovano in client-accesslog-stackdriver, associate alla risorsa monitorata k8s_pod. Utilizza la seguente sintassi dell'URL per visualizzare i log dell'accesso lato client:

    https://console.cloud.google.com/logs/viewer?advancedFilter=logName="projects/PROJECT_ID/logs/client-accesslog-stackdriver"&project=PROJECT_ID

I log di accesso contengono le seguenti informazioni:

  • Proprietà delle richieste HTTP, ad esempio ID, URL, dimensioni, latenza e intestazioni comuni.
  • Informazioni sui carichi di lavoro di origine e di destinazione, ad esempio nome, spazio dei nomi, identità ed etichette comuni.
  • Informazioni sulle revisioni e sui servizi canonici di origine e di destinazione.
  • Se il monitoraggio è attivato, i log contengono informazioni sulla traccia, come il campionamento, l'ID traccia e l'ID intervallo.

Le informazioni visualizzate nei log di accesso di Google Cloud Observability provengono dai log di accesso di Envoy, se li attivi nella configurazione di Istio. Contengono le seguenti intestazioni:

  • route_name
  • upstream_cluster
  • X-Envoy-Original-Path
  • X-Envoy-Original-Host

Ecco un esempio di voce di log:

{
  "insertId": "1j84zg8g68vb62z",
  "httpRequest": {
    "requestMethod": "GET",
    "requestUrl": "http://35.235.89.201:80/productpage",
    "requestSize": "795",
    "status": 200,
    "responseSize": "7005",
    "remoteIp": "10.168.0.26:0",
    "serverIp": "10.36.3.153:9080",
    "latency": "0.229384205s",
    "protocol": "http"
  },
  "resource": {
    "type": "k8s_container",
    "labels": {
      "cluster_name": "istio-e2e22",
      "namespace_name": "istio-bookinfo-1-68819",
      "container_name": "productpage",
      "project_id": "***",
      "location": "us-west2-a",
      "pod_name": "productpage-v1-64794f5db4-8xbtf"
    }
  },
  "timestamp": "2020-08-13T21:37:42.963881Z",
  "severity": "INFO",
  "labels": {
    "protocol": "http",
    "upstream_host": "127.0.0.1:9080",
    "source_canonical_service": "istio-ingressgateway",
    "source_namespace": "istio-system",
    "x-envoy-original-path": "",
    "source_canonical_revision": "latest",
    "connection_id": "32",
    "upstream_cluster": "inbound|9080|http|productpage.istio-bookinfo-1-68819.svc.cluster.local",
    "requested_server_name": "outbound_.9080_._.productpage.istio-bookinfo-1-68819.svc.cluster.local",
    "destination_version": "v1",
    "destination_workload": "productpage-v1",
    "source_workload": "istio-ingressgateway",
    "destination_canonical_revision": "v1",
    "mesh_uid": "cluster.local",
    "source_principal": "spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account",
    "x-envoy-original-dst-host": "",
    "service_authentication_policy": "MUTUAL_TLS",
    "destination_principal": "spiffe://cluster.local/ns/istio-bookinfo-1-68819/sa/bookinfo-productpage",
    "response_flag": "-",
    "log_sampled": "false",
    "destination_service_host": "productpage.istio-bookinfo-1-68819.svc.cluster.local",
    "destination_name": "productpage-v1-64794f5db4-8xbtf",
    "destination_canonical_service": "productpage",
    "destination_namespace": "istio-bookinfo-1-68819",
    "source_name": "istio-ingressgateway-6845f6d664-lnfvp",
    "source_app": "istio-ingressgateway",
    "destination_app": "productpage",
    "request_id": "39013650-4e62-9be2-9d25-78682dd27ea4",
    "route_name": "default"
  },
  "logName": "projects/***/logs/server-accesslog-stackdriver",
  "trace": "projects/***t/traces/466d77d15753cb4d7749ba5413b5f70f",
  "receiveTimestamp": "2020-08-13T21:37:48.758673203Z",
  "spanId": "633831cb1fda4fd5",
  "traceSampled": true
}

Puoi utilizzare questo log in vari modi:

  • Esegui l'integrazione con Cloud Trace, una funzionalità facoltativa di Cloud Service Mesh.
  • Esporta i log del traffico in BigQuery, dove puoi eseguire query come selezionare tutte le richieste che richiedono più di 5 secondi.
  • Crea metriche basate su log.
  • Risolvere i problemi relativi agli errori 404 e 503

Risolvi i problemi relativi a 404 e 503

L'esempio seguente spiega come utilizzare questo log per risolvere i problemi quando una richiesta non va a buon fine con un codice di risposta 404 o 503.

  1. Nel log di accesso client, cerca una voce simile alla seguente:

    httpRequest: {
    requestMethod: "GET"
    requestUrl: "://IP_ADDRESS/src/Util/PHP/eval-stdin.php"
    requestSize: "2088"
    status: 404
    responseSize: "75"
    remoteIp: "10.168.0.26:34165"
    serverIp: "10.36.3.149:8080"
    latency: "0.000371440s"
    protocol: "http"
    }
  2. Vai alle etichette nella voce del log di accesso. Trova il campo response_flag con un aspetto simile al seguente:

    response_flag: "NR"

    Il valore NR è l'acronimo di NoRoute, il che significa che non è stata trovata alcuna route per destinazione o non esisteva una catena di filtri corrispondente per un downstream connessione. Analogamente, puoi utilizzare l'etichetta response_flag anche per risolvere i problemi relativi agli errori 503.

  3. Se vedi errori 503 sia nei log di accesso del client sia in quelli del server, verifica che i nomi delle porte impostati per ciascun servizio corrispondano al nome del protocollo in uso tra di loro. Ad esempio, se un client binario golang si connette a un server golang tramite HTTP, ma la porta è denominata http2, il protocollo non verrà negoziata automaticamente in modo corretto.

Per ulteriori informazioni, consulta la sezione flag di risposta.

Interpreta i log degli accessi

I passaggi riportati di seguito spiegano come utilizzare i log di accesso (noti anche come log proxy Envoy) per mostrare il traffico tra le due estremità di una connessione a scopo di risoluzione dei problemi.

I log degli accessi sono utili per diagnosticare problemi quali:

  • Flusso di traffico e errori
  • Routing delle richieste end-to-end

I log di accesso non sono abilitati per impostazione predefinita in Cloud Service Mesh e possono essere attivati solo a livello globale nell'intero mesh.

Puoi risolvere gli errori di connessione/richiesta generando attività nel tuo un'applicazione che attiva una richiesta HTTP, esaminando la richiesta associata nei log di origine o di destinazione.

Se attivi una richiesta e questa viene visualizzata nei log del proxy di origine, significa che il reindirizzamento del traffico iptables funziona correttamente e che il proxy Envoy gestisce il traffico. Se noti errori nei log, genera un file Envoy della configurazione e controlla la configurazione del cluster Envoy per assicurarti che risposta esatta. Se vedi la richiesta, ma il log non contiene errori, controlla i log del proxy di destinazione.

Se la richiesta viene visualizzata nei log del proxy di destinazione, significa che il mesh funziona correttamente. Se viene invece visualizzato un errore, esegui un comando Envoy il dump della configurazione e verificare i valori corretti per la porta di traffico impostata la configurazione del listener.

Se il problema persiste dopo aver eseguito i passaggi precedenti, Envoy potrebbe non essere in grado di negoziare automaticamente il protocollo tra il sidecar e il relativo pod di applicazioni. Assicurati che il nome della porta del servizio Kubernetes, ad esempio http-80, corrisponda al protocollo utilizzato dall'applicazione.

Utilizza Esplora log per eseguire query sui log

Puoi utilizzare l'interfaccia Esplora log. per eseguire query su log di accesso specifici. Ad esempio, per eseguire query su tutte le richieste per le quali è attivato MULTUAL_TLS e che utilizzano il protocollo grpc, aggiungi quanto segue alla query dei log di accesso al server:

labels.protocol="grpc" labels.service_authentication_policy="MULTUAL_TLS"

Imposta un criterio per i log di accesso

Per configurare il logging proxy per Cloud Service Mesh gestito, consulta Log di accesso Envoy.

Per impostare un criterio di log di accesso per Cloud Service Mesh con il controllo nel cluster aereo:

  1. Crea un file di overlay personalizzato IstioOperator che includa i campi applicabili AccessLogPolicyConfig per il tuo scenario.

  2. Passa questo file a asmcli utilizzando l'opzione --custom_overlay per aggiornare la configurazione del piano di controllo in-cluster. Per informazioni sulla corsa asmcli install con un file di overlay personalizzato, vedi Installazione con funzionalità facoltative.

Visualizzare le informazioni specifiche del servizio o del carico di lavoro

Se hai un problema con un servizio o un carico di lavoro specifico anziché con un problema su larga scala, controlla i singoli proxy Envoy e raccogli le informazioni pertinenti. Per raccogliere informazioni su un determinato carico di lavoro e sui suoi proxy, puoi usare pilot-agent:

kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- pilot-agent request GET SCOPE

Nell'esempio, SCOPE è uno dei seguenti:

  • certs - Certificati all'interno dell'istanza Envoy
  • clusters - Cluster con Envoy configurato
  • config_dump - Esegue il dump della configurazione Envoy
  • listeners - Listener con Envoy configurato
  • logging - Visualizza e modifica le impostazioni di logging
  • stats - Statistiche di Envoy
  • stats/prometheus - Statistiche di Envoy come record Prometheus

Visualizza gli stati del socket del proxy

Puoi esaminare direttamente lo stato dei socket proxy Envoy utilizzando il seguente e il processo di sviluppo.

  1. Mostra un elenco di socket stabiliti, inclusi i socket nello stato TIME_WAIT, che possono influire negativamente sulla scalabilità se il loro numero è elevato:

    kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- ss -anopim
  2. Mostra un riepilogo delle statistiche del socket:

    kubectl exec POD_NAME -n NAMESPACE_NAME -c istio-proxy -- ss -s

Per ulteriori informazioni, consulta Introduzione al comando ss.

Log di istio-proxy e istio-init

Inoltre, recupera i log di istio-proxy ed esamina i relativi contenuti per verificare la presenza di eventuali errori che potrebbero suggerire la causa del problema:

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-proxy

Puoi fare lo stesso per il contenitore init:

kubectl logs POD_NAME -n NAMESPACE_NAME -c istio-init

Passaggi successivi