Come posso risolvere i timeout di connessione quando mi connetto al servizio ospitato in Amazon EKS?

Ultimo aggiornamento: 22/12/2021

Si verificano timeout di connessione quando mi connetto al servizio ospitato nel cluster Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrizione

Due dei motivi più comuni per cui non è possibile connettersi al servizio nel cluster Amazon EKS sono:

  • Le restrizioni del gruppo di sicurezza o della lista di controllo degli accessi di rete (ACL di rete) impediscono al traffico di raggiungere gli endpoint del pod.
  • Il servizio non seleziona gli endpoint del pod perché le etichette non corrispondono.

Per risolvere questi problemi, controlla i gruppi di sicurezza e le liste di controllo degli accessi di rete associati alle istanze del nodo (worker) e al bilanciatore del carico. Inoltre, verifica che il servizio abbia le etichette corrette selezionate per i pod.

Nota: la risoluzione dei problemi varia a seconda dei tipi di servizio. Le seguenti risoluzioni sono applicabili per risolvere i problemi relativi a servizi inaccessibili. Per ulteriori informazioni sui tipi di servizi Kubernetes, consulta Come posso esporre i servizi Kubernetes in esecuzione sul cluster Amazon EKS?

Risoluzione

Controlla il gruppo di sicurezza e le liste di controllo degli accessi di rete

IP cluster

Il tipo di servizio IP cluster viene utilizzato per la comunicazione tra i microservizi eseguiti nello stesso cluster Amazon EKS. Assicurati che il gruppo di sicurezza collegato all'istanza in cui si trova il pod di destinazione disponga di una regola in ingresso per consentire la comunicazione dall'istanza del pod client.

Nella maggior parte dei casi, esiste un'autoregola che consente tutte le comunicazioni su tutte le porte nei gruppi di sicurezza dei nodi (worker). Se utilizzi più gruppi di nodi, ognuno con il proprio gruppo di sicurezza, assicurati di consentire tutte le comunicazioni tra i gruppi di sicurezza. Ciò consente ai microservizi che vengono eseguiti su più nodi di comunicare facilmente.

Per ulteriori informazioni, consulta Considerazioni sui gruppi di sicurezza di Amazon EKS.

Porta del nodo

Il gruppo di sicurezza del nodo (worker) dovrebbe permettere il traffico in ingresso sulla porta specificata nella definizione del servizio NodePort. Se non è specificato nella definizione del servizio, il valore del parametro port è lo stesso del parametro targetPort. La porta è esposta su tutti i nodi del cluster Amazon EKS.

Controlla le liste di controllo degli accessi di rete collegate alle sottoreti del nodo (worker). Assicurati che l'indirizzo IP del tuo client sia nell'elenco di indirizzi IP consentiti sulla porta utilizzata dal servizio.

Se accedi al servizio Kubernetes tramite Internet, assicurati che i nodi dispongano di un indirizzo IP pubblico. Per accedere al servizio, è necessario utilizzare la combinazione di indirizzo IP pubblico e porta del nodo.

Bilanciatore del carico

Assicurati che il gruppo di sicurezza del bilanciatore del carico consenta le porte del listener. Inoltre, assicurati che il gruppo di sicurezza del nodo (worker) permetta il traffico in ingresso dal gruppo di sicurezza del bilanciatore del carico sulla porta in cui è in esecuzione il container dell'applicazione.

Se la porta specificata nella definizione del servizio è diversa da targetPort, è necessario consentire il traffico in ingresso sulla porta nel gruppo di sicurezza del nodo (worker) per il gruppo di sicurezza del bilanciatore del carico. La porta e targetPort in genere coincidono nella definizione del servizio.

Le liste di controllo degli accessi di rete devono consentire all'indirizzo IP del client di raggiungere il bilanciatore del carico sulla porta del listener. Se accedi al bilanciatore del carico tramite Internet, assicurati di aver creato un bilanciatore del carico pubblico.

Controlla se il servizio ha selezionato correttamente gli endpoint del pod

Se i pod non sono registrati come back-end per il servizio, puoi ricevere un errore di timeout. Questo può accadere quando si accede al servizio da un browser o quando si esegue il comando curl podIP:podPort.

Controlla le etichette per i pod e verifica che il servizio disponga dei selettori di etichette appropriati (dal sito Web di Kubernetes).

Esegui i seguenti comandi per verificare se il servizio Kubernetes ha selezionato e registrato correttamente i pod.

Comando:

kubectl get pods -o wide

Output di esempio:

NAME                    READY   STATUS    RESTARTS   AGE       IP                           NODE                         NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-2rtn8   1/1     Running     0       3h4m   172.31.33.214   ip-172-31-33-109.us-west-2.compute.internal       none          none

Comando:

kubectl describe svc your_service_name -n your_namespace

Nota: sostituisci your_service_name con il nome del servizio e your_namespace con il tuo spazio dei nomi.

Output di esempio:

Events:            none
Session Affinity:  none
Endpoints:         172.31.33.214:80
....

Nell'ouput di esempio precedente, 172.31.33.214 è l'indirizzo IP del pod ottenuto eseguendo il comando kubectl get pods -o wide. L'indirizzo IP 172.31.33.214 funge anche da back-end per un servizio in esecuzione in un cluster Amazon EKS.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?