Risoluzione dei problemi

Stai visualizzando la documentazione di Apigee Edge.
Consulta la documentazione di Apigee X.
info

Errore 404 (non trovato) di Istio

Il debug di un errore 404 (non trovato) su Istio può essere frustrante. Speriamo che questo ti dia un punto di partenza per capire dove potrebbero esserci problemi.

Conflitto tra gateway con caratteri jolly

Può esistere una sola definizione di gateway che utilizza un valore di host con caratteri jolly "*". Se hai eseguito il deployment di qualsiasi altro elemento che includa un gateway con caratteri jolly, le chiamate client non andranno a buon fine con uno stato 404.

Esempio:

$ istioctl get gateways
GATEWAY NAME         HOSTS     NAMESPACE   AGE
bookinfo-gateway     *         default     20s
httpbin-gateway      *         default     3s

In questo caso, devi eliminare o modificare uno dei gateway in conflitto.

Traccia il punto in cui la route non va a buon fine

Istio è come una cipolla (o, forse, un orco): ha degli strati. Un modo sistematico per eseguire il debug di un errore 404 è lavorare verso l'esterno a partire dalla destinazione.

Il workload di backend

Verifica di poter accedere al workload dal sidecar:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl localhost:80/headers

Il sidecar di backend

Imposta l'indirizzo del servizio e recupera l'indirizzo IP del pod del workload.

SERVICE=httpbin.default.svc.cluster.local:80
  POD_IP=$(kubectl get pod $WORKLOAD_POD -o jsonpath='{.status.podIP}')

Accedi al workload tramite il sidecar:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v http://$SERVICE/headers --resolve "$SERVICE:$POD_IP"

Oppure, se Istio mTLS è abilitato:

kubectl exec $WORKLOAD_POD -c istio-proxy -- curl -v https://$SERVICE/headers --resolve "$SERVICE:$POD_IP" --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

Il gateway (o un sidecar frontend)

Accedi al servizio dal gateway:

kubectl -n istio-system exec $GATEWAY_POD -- curl -v http://$SERVICE/header

Oppure, se Istio mTLS è abilitato:

kubectl -n istio-system exec $GATEWAY_POD -- curl -v https://$SERVICE/headers --key /etc/certs/key.pem --cert /etc/certs/cert-chain.pem --cacert /etc/certs/root-cert.pem --insecure

Analisi mancanti

Se non vedi le analisi nell'interfaccia utente di Analytics, prendi in considerazione queste possibili cause:

  • L'inserimento di Apigee può essere ritardato di alcuni minuti
  • Il log di accesso gRPC di Envoy non è configurato correttamente
  • Envoy non riesce a raggiungere il servizio remoto
  • Il caricamento del servizio remoto non va a buon fine

La chiave API mancante o non valida non viene rifiutata

Se la convalida della chiave API non funziona correttamente, prendi in considerazione queste possibili cause:

Proxy diretto

Controlla la configurazione di ext-authz.

Sidecar
  • Assicurati che il listener sia configurato per l'intercettazione.
  • Controlla la configurazione di ext-authz.

Le richieste non valide vengono controllate e consentite

  • Servizio remoto configurato per l'apertura in caso di errore
  • Envoy non è configurato per i controlli RBAC

Per informazioni su come risolvere questi problemi, consulta il seguente argomento della documentazione di Envoy: Autorizzazione esterna, e consulta le informazioni sulla proprietà failure_mode_allow. Questa proprietà consente di modificare il comportamento del filtro in caso di errori.

Il JWT mancante o non valido non viene rifiutato

La causa probabile è che il filtro JWT di Envoy non è configurato.

La chiave API valida non funziona

Cause probabili

  • Envoy non riesce a raggiungere il servizio remoto
  • Le tue credenziali non sono valide
  • Il prodotto API Apigee non è configurato per la destinazione e l'ambiente

Procedura per la risoluzione dei problemi

Controlla il prodotto API su Apigee

  • È abilitato per il tuo ambiente (test o produzione)?

    Il prodotto deve essere associato allo stesso ambiente del servizio remoto.

  • È associato alla destinazione a cui stai accedendo?

    Controlla la sezione Destinazioni del servizio remoto Apigee. Ricorda che il nome del servizio deve essere un nome host completo. Se si tratta di un servizio Istio, il nome sarà simile a helloworld.default.svc.cluster.localcode> - che rappresenta il helloworld servizio nello spazio dei nomi default.

  • Il percorso della risorsa corrisponde alla tua richiesta?

    Ricorda che un percorso come / o /** corrisponderà a qualsiasi percorso. Puoi anche utilizzare i caratteri jolly '*' o '**' per la corrispondenza.

  • Hai un'app per sviluppatori?

    Il prodotto API deve essere associato a un'app per sviluppatori per controllare le relative chiavi.

Controlla la richiesta

  • Stai passando la chiave utente nel x-api-key header

    Esempio:

    curl http://localhost/hello -H "x-api-key: wwTcvmHvQ7Dui2qwj43GlKJAOwmo"
  • Stai utilizzando una chiave utente valida?

    Assicurati che le credenziali dell'app che stai utilizzando siano approvate per il tuo prodotto API.

Controlla i log del servizio remoto

  • Avvia il servizio remoto con la registrazione al debug level

    Utilizza l'opzione -l debug nella riga di comando.

  • Prova ad accedere alla destinazione e controlla i log

    Controlla i log per una riga simile alla seguente:

    Resolve api: helloworld.default.svc.cluster.local, path: /hello, scopes: []
    Selected: [helloworld]
    Eliminated: [helloworld2 doesn't match path: /hello]