Por que meus pods não se conectam a outros pods no Amazon EKS?

6 minuto de leitura
0

Meus pods não se conectam a outros pods no Amazon Elastic Kubernetes Service (Amazon EKS).

Breve descrição

Observação: se você receber erros ao executar comandos da AWS Command Line Interface (AWS CLI), certifique-se de estar usando a versão mais recente da AWS CLI.

Se os seus pods não conseguirem se conectar a outros pods, você poderá receber os seguintes erros, dependendo da sua aplicação.

Se o grupo de segurança de um nó de trabalho não permitir a comunicação entre nós, você receberá o seguinte erro:

curl: (7) Failed to connect to XXX.XXX.XX.XXX port XX: Connection timed out

Se o DNS não estiver funcionando, você receberá o seguinte erro:

curl nginx  
curl: (6) Could not resolve host: nginx

Se o DNS estiver funcionando, mas houver um problema de conectividade do pod, você receberá o seguinte erro:

Error: RequestError: send request failed caused by: Post  dial tcp 1.2.3.4.5:443: i/o timeout

Se você tentar resolver o DNS do pod que não está exposto por meio de um serviço, receberá o seguinte erro:

kubectl exec -it busybox -- nslookup nginx
Server:   10.100.0.10
Address:  10.100.0.10:53
** server can't find nginx.default.svc.cluster.local: NXDOMAIN
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer
*** Can't find nginx.default.svc.cluster.local: No answer
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer

Para resolver esses erros, verifique se seu ambiente está configurado corretamente:

  • Seus grupos de segurança atendem às diretrizes do Amazon EKS.
  • A lista de controle de acesso da rede (ACL da rede) não nega a conexão.
  • Sua sub-rede tem uma rota local para se comunicar na sua Amazon Virtual Private Cloud (Amazon VPC).
  • Há endereços IP suficientes disponíveis na sub-rede.
  • Seus grupos de segurança para pods permitem que os pods se comuniquem entre si.
  • Seus nós de processamento têm o encaminhamento de IP ativado.
  • Você atende aos requisitos de rede do Kubernetes (excluindo qualquer NetworkPolicy intencional).
  • Seus pods estão usando o DNS corretamente para se comunicarem uns com os outros.
  • Seus pods estão programados e estão no estado RUNNING (em execução).
  • Você tem a versão recomendada do plug-in Container Network Interface (CNI) da Amazon VPC para Kubernetes.

Resolução

Seus grupos de segurança atendem às diretrizes do Amazon EKS

Para restringir o tráfego permitido no grupo de segurança do seu nó de processamento, crie regras de entrada. Crie essas regras para qualquer protocolo ou qualquer porta que seus nós de processamento usem para comunicação entre nós.

É uma prática recomendada permitir todo o tráfego para o grupo de segurança do seu nó de processamento. Você não precisa alterar as regras do grupo de segurança todas as vezes que um novo pod com uma nova porta é criado.

Para obter mais informações, consulte Requisitos e considerações de grupos de segurança do Amazon EKS.

A ACL da rede não nega a conexão

1.    Confirme se o tráfego entre seu cluster do Amazon EKS e o CIDR da VPC flui livremente na ACL da rede.

2.    (Opcional) Para adicionar uma camada extra de segurança à sua VPC, considere configurar ACLs de rede com regras semelhantes às dos seus grupos de segurança.

Sua sub-rede tem uma rota local para se comunicar na sua VPC

Confirme se suas sub-redes têm a rota padrão para comunicação dentro da VPC.

Há endereços IP suficientes disponíveis na sub-rede

Confirme se as sub-redes especificadas têm endereços IP disponíveis suficientes para as interfaces de rede elástica entre contas e seus pods.

Para obter mais informações, consulte Requisitos e considerações de VPC e sub-rede do Amazon EKS.

Para verificar endereços IP disponíveis, execute o seguinte comando da AWS CLI:

$ aws ec2 describe-subnets --subnet-id YOUR-SUBNET-ID --query 'Subnets[0].AvailableIpAddressCount'

Seus grupos de segurança para pods permitem que os pods se comuniquem entre si

Se você usa grupos de segurança para pods ou redes personalizadas CNI, pode alocar qualquer grupo de segurança a pods. Nesse cenário, confirme se os grupos de segurança permitem a comunicação correta entre pods.

Seus nós de processamento têm o encaminhamento de IP ativado

Se você usa uma AMI personalizada, certifique-se de que a variável de kernel net.ipv4.ip_forward esteja ativada. Para verificar essa configuração em um nó de processamento, execute um dos seguintes comandos:

# sysctl net.ipv4.ip_forward

# cat /proc/sys/net/ipv4/ip_forward

Se a saída for 0, use um dos comandos a seguir para ativar a variável de kernel net.ipv4.ip_forward.

# sysctl -w net.ipv4.ip_forward=1

# echo 1 > /proc/sys/net/ipv4/ip_forward

Para AMIs do Amazon EKS em tempo de execução containerd, consulte as linhas de 184 a 188 do script install-worker.sh (no GitHub) para ver a ativação da configuração. Como o containerd é o runtime padrão nas versões 1.24 e posteriores do Amazon EKS, essa etapa é necessária para solucionar problemas de conectividade de rede entre pods.

Você atende aos requisitos de rede do Kubernetes (excluindo qualquer NetworkPolicy intencional)

Confirme se você atende aos requisitos de rede do Kubernetes (no site do Kubernetes).

Por padrão, pods não são isolados. Pods aceitam tráfego de qualquer origem. Pods ficam isolados com uma NetworkPolicy que os seleciona.

Observação: para configurações de NetworkPolicy, consulte Instalar o complemento do mecanismo de política de rede Calico.

Seus pods estão usando o DNS corretamente para se comunicarem uns com os outros

Primeiro, você deve expor seus pods por meio de um serviço. Caso contrário, eles não poderão receber nomes DNS e apenas poderão ser acessados por seus endereços IP específicos.

O exemplo de saída a seguir mostra uma tentativa de resolver o nome DNS do serviço nginx. Nesse caso, ClusterIP 10.100.94.70 é retornado:

$ kubectl run nginx --image=nginx --replicas=5 -n web
deployment.apps/nginx created

$ kubectl expose deployment nginx --port=80 -n web
service/nginx exposed

$ kubectl get svc -n web
NAME    TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx   ClusterIP   10.100.94.70   <none>        80/TCP    2s

# kubectl exec -ti busybox -n web -- nslookup nginx
Server:    10.100.0.10
Address 1: 10.100.0.10 ip-10-100-0-10.ap-southeast-2.compute.internal
Name:      nginx
Address 1: 10.100.94.70 ip-10-100-94-70.ap-southeast-2.compute.internal

Se os seus pods ainda falharem em resolver o DNS, consulte Como soluciono falhas de DNS com o Amazon EKS?

Observação: para obter mais informações, consulte Pods, Serviços e Serviços descentralizados no site do Kubernetes.

Seus pods estão programados e estão no estado RUNNING (em execução)

Confirme se os seus pods estão programados e no estado RUNNING (em execução).

Para solucionar problemas com o status do seu pod, consulte Como solucionar problemas com o status de pods no Amazon EKS?

Você tem a versão recomendada do plug-in CNI da Amazon VPC para Kubernetes

Se você não tiver a versão recomendada do plug-in CNI da Amazon VPC para Kubernetes, atualize para a versão mais recente.

Se você tiver a versão recomendada, mas tiver problemas com ela, consulte Como resolvo problemas com o kubelet ou o plug-in CNI para Amazon EKS?

AWS OFICIAL
AWS OFICIALAtualizada há um ano