Risolvere i problemi di gestione del traffico in Cloud Service Mesh

Questa sezione illustra i problemi comuni di Cloud Service Mesh e come risolverli che li rappresentano. Per ulteriore assistenza, consulta Assistenza.

Errori di connessione al server API nei log di istiod

Istiod non riesce a contattare apiserver se visualizzi errori simili ai seguenti:

error k8s.io/client-go@v0.18.0/tools/cache/reflector.go:125: Failed to watch *crd.IstioSomeCustomResource`…dial tcp 10.43.240.1:443: connect: connection refused

Puoi utilizzare la stringa di espressione regolare /error.*cannot list resource/ per trovare questo errore nei log.

Questo errore di solito è temporaneo e se hai raggiunto i log del proxy utilizzando kubectl, il problema potrebbe essere già stato risolto. Questo errore di solito è causato da eventi che rendono il server API temporaneamente non disponibile, ad esempio quando un'API un server che non si trova in una configurazione ad alta disponibilità si riavvia per un upgrade o una modifica alla scalabilità automatica.

Il contenitore istio-init si arresta in modo anomalo

Questo problema può verificarsi quando le regole iptables del pod non vengono applicate allo spazio dei nomi della rete del pod. Ciò può essere causato da:

  • Un'installazione istio-cni incompleta
  • Autorizzazioni del pod del carico di lavoro insufficienti (manca l'autorizzazione CAP_NET_ADMIN)

Se utilizzi il plug-in CNI Istio, verifica di aver seguito completamente le istruzioni. Verifica che il contenitore istio-cni-node sia pronto e controlla i log. Se il problema persiste, stabilisci una connessione Secure Shell (SSH) al nodo host e cerca i comandi nsenter nei log del nodo per verificare se sono presenti errori.

Se non utilizzi il plug-in CNI Istio, verifica che il pod del carico di lavoro abbia Autorizzazione CAP_NET_ADMIN, che viene impostata automaticamente dall'iniettore collaterale.

Connessione rifiutata dopo l'avvio del pod

Quando un pod si avvia e riceve connection refused quando tenta di connettersi a un endpoint, il problema potrebbe essere che il container dell'applicazione si è avviato prima il container isto-proxy. In questo caso, il contenitore dell'applicazione invia la richiesta a istio-proxy, ma la connessione viene rifiutata perché istio-proxy non è ancora in ascolto sulla porta.

In questo caso, puoi:

  • Modifica il codice di avvio dell'applicazione in modo da inviare richieste continue all'endpoint di statoistio-proxy finché l'applicazione non riceve un codice 200. L'endpoint di salute istio-proxy è:

    http://localhost:15020/healthz/ready
    
  • Aggiungi un meccanismo di richiesta di nuovo tentativo al carico di lavoro dell'applicazione.

I gateway delle schede restituiscono un valore vuoto

Sintomo: quando elenchi i gateway utilizzando kubectl get gateway --all-namespaces Dopo aver creato correttamente un gateway Cloud Service Mesh, il comando restituisce No resources found.

Questo problema può verificarsi in GKE 1.20 e versioni successive perché il controller di gateway GKE installa automaticamente la risorsa Gateway.networking.x-k8s.io/v1alpha1 GKE nei cluster. Per risolvere il problema:

  1. Controlla se nel cluster sono presenti più risorse personalizzate del gateway:

    kubectl api-resources | grep gateway
    

    Output di esempio:

    gateways                          gw           networking.istio.io/v1beta1            true         Gateway
    gatewayclasses                    gc           networking.x-k8s.io/v1alpha1           false        GatewayClass
    gateways                          gtw          networking.x-k8s.io/v1alpha1           true         Gateway

  2. Se l'elenco mostra voci diverse da Gateway con il apiVersion networking.istio.io/v1beta1, utilizza il nome completo della risorsa nomi brevi distinguibili nel comando kubectl. Ad esempio, esegui kubectl get gw o kubectl get gateways.networking.istio.io anziché kubectl get gateway per assicurarti che i gateway Istio siano elencati.

Per ulteriori informazioni su questo problema, consulta Gateway Kubernetes e gateway Istio.