Eu recebo erros de tempo de conexão esgotado quando me conecto ao meu serviço que está hospedado no meu cluster Amazon Elastic Kubernetes Service (Amazon EKS).
Breve descrição
Os problemas mais comuns de conexão de serviço ocorrem porque o grupo de segurança ou a lista de controle de acesso à rede (ACL de rede) restringem o tráfego dos endpoints do pod.
Para resolver isso, verifique os grupos de segurança e as ACLs de rede associados às instâncias do node de trabalho e ao balanceador de carga. Se você usa um Network Load Balancer, verifique se seu serviço tem os rótulos corretos selecionados para seus pods.
**Observação:**As seguintes soluções se aplicam a Serviços inacessíveis. Para saber mais sobre os tipos de serviços do Kubernetes, consulte Como faço para expor os serviços do Kubernetes em execução no meu cluster Amazon EKS?
Resolução
Verifique seu grupo de segurança e suas ACLs de rede
ClusterIP
O Serviço tipo ClusterIP é usado para comunicação entre microsserviços executados no mesmo cluster do Amazon EKS. Certifique-se de que o grupo de segurança da instância do pod de destino tenha uma regra de entrada que permita que a instância do pod do cliente se comunique.
Na maioria dos casos, há uma regra self que permite toda a comunicação em todas as portas nos grupos de segurança do node de trabalho. Se você usar vários grupos de nós, cada um com seu próprio grupo de segurança, permita toda a comunicação entre os grupos de segurança. Isso permite que os microsserviços que são executados em vários nós se comuniquem facilmente.
Para obter mais informações, consulte Considerações e requisitos sobre grupos de segurança do Amazon EKS.
NodePort
O grupo de segurança do node de trabalho deve permitir o tráfego de entrada na porta especificada na definição do Serviço NodePort. Se não estiver especificado na definição do Serviço, o valor do parâmetro port será o mesmo do parâmetro ** targetPort**. A porta está exposta em todos os nós do cluster Amazon EKS.
Verifique as ACLS de rede que estão vinculadas às sub-redes do nó de processamento. Certifique-se de que o endereço IP do seu cliente esteja na lista de permissões na porta que o Serviço usa.
Se você acessar o Kubernetes Service pela Internet, confirme se seus nós têm um endereço IP público. Para acessar o Serviço, você deve usar o endereço IP público e a combinação de portas do nó.
LoadBalancer
Certifique-se de que o seguinte seja verdadeiro:
- O grupo de segurança do balanceador de carga permite portas de escuta de entrada.
- O grupo de segurança do balanceador de carga permite tráfego de saída na porta de tráfego de destino.
- O grupo de segurança do nó de processamento permite o tráfego de entrada do grupo de segurança do balanceador de carga pela porta em que o contêiner do aplicativo é executado.
- Se você usa um Network Load Balancer sem uma associação de grupo de segurança que usa a preservação do IP do cliente, os nós de processamento permitem o tráfego do cliente.
- O nó de processamento permite tráfego que corresponda ao targetPort, se for diferente da porta mapeada no serviço.
- As ACLs de rede permitem que o endereço IP do cliente alcance o balanceador de carga na porta do receptor.
- Se você acessar o balanceador de carga pela Internet, você criou um balanceador de carga voltado para a Internet.
Confirme se seu serviço selecionou os endpoints do pod corretamente
Se seus pods não estiverem registrados como back-ends para o Serviço, você poderá receber um erro de tempo esgotado. Isso pode acontecer quando você acessa o Serviço a partir de um navegador. Ou isso pode acontecer quando você executa o comando curl podIP:podPort.
Verifique as etiquetas dos pods e verifique se o Serviço tem os seletores de etiquetas apropriados. Para obter mais informações, consulte Rótulos e seletores no site do Kubernetes.
Execute os comandos a seguir para verificar se seu serviço Kubernetes está selecionado corretamente e registrou seus pods.
Comando:
kubectl get pods -o wide
Exemplo de saída:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-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
**Observação:**Substitua seu\ _service\ _name pelo nome do serviço e seu_namespace pelo seu namespace.
Exemplo de saída:
Events: noneSession Affinity: none
Endpoints: 172.31.33.214:80
....
No exemplo de saída, 172.31.33.214 é o endereço IP do pod retornado pelo comando kubectl get pods -o wide. O endereço IP 172.31.33.214 também serve como back-end para um serviço executado em um cluster Amazon EKS.