Por que não consigo me conectar ao cluster do Amazon EKS?

6 minuto de leitura
0

Criei um cluster do Amazon Elastic Kubernetes Service (Amazon EKS), mas não consigo me conectar a ele.

Breve descrição

Talvez você não consiga se conectar ao cluster do EKS por um dos seguintes motivos:

  • Você não criou o arquivo kubeconfig para o cluster.
  • Você não consegue se conectar ao endpoint do servidor de API do Amazon EKS.

Resolução

Você não criou o arquivo kubeconfig

Depois de criar o cluster do Amazon EKS, você deve configurar o arquivo kubeconfig usando a AWS Command Line Interface (AWS CLI). Essa configuração permite conectar-se ao cluster usando a linha de comando kubectl. A resolução a seguir mostra como criar um arquivo kubeconfig para o cluster com o comando update-kubeconfig da AWS CLI. Para atualizar manualmente o arquivo kubeconfig sem usar a AWS CLI, consulte Criar ou atualizar um arquivo kubeconfig para um cluster do Amazon EKS. Observação: se você receber erros ao executar comandos da AWS CLI, certifique-se de estar usando a versão mais recente da AWS CLI.

1.    Verifique se a AWS CLI versão 1.16.308 ou posterior está instalada no seu sistema:

$ aws --version

Importante: você deve ter o Python versão 2.7.9 ou posterior instalado no seu sistema. Caso contrário, você receberá um erro.

Dica: use gerenciadores de pacotes, como o yum, apt-get ou homebrew para macOS para instalar a AWS CLI.

2.    Verifique a identidade atual para confirmar se você está usando as credenciais corretas com as permissões para o cluster do Amazon EKS:

aws sts get-caller-identity

Observação: o usuário ou a função da entidade do AWS Identity and Access Management (IAM) que cria um cluster da Amazon recebe automaticamente as permissões quando o cluster é criado. As permissões são concedidas na configuração RBAC do cluster no ambiente de gerenciamento. Usuários ou funções do IAM também podem ter acesso a um cluster do Amazon EKS em aws-auth ConfigMap. Por padrão, o AWS IAM Authenticator for Kubernetes usa a identidade configurada da AWS CLI ou do AWS SDK. Para obter mais informações, consulte Ativar o acesso de usuários e perfis do IAM ao cluster.

3.    Crie ou atualize o arquivo kubeconfig do cluster:

aws eks --region example_region update-kubeconfig --name cluster_name

Observação: substitua example_region pelo nome da sua região da AWS. Substitua cluster_name pelo nome do seu cluster do EKS.

Por padrão, o arquivo de configuração para Linux é criado no caminho do kubeconfig ($HOME/.kube/config) no diretório inicial. O arquivo também pode ser mesclado com um kubeconfig existente nesse local. No Windows, o arquivo está em %USERPROFILE%.kube\config.

Você também pode especificar outro caminho definindo a variável de ambiente KUBECONFIG (do site da Kubernetes) ou com a seguinte opção --kubeconfig:

$ kubectl get pods --kubeconfig ./.kube/config

Observação: para autenticação ao executar comandos kubectl, você pode especificar um nome do recurso da Amazon (ARN) de um perfil do IAM com a opção --role-arn. Caso contrário, a entidade do IAM na cadeia de credenciais padrão da AWS CLI ou do AWS SDK será usada. Para obter mais informações, consulte update-kubeconfig. Ou então, conclua a etapa 6 na seção Criar o arquivo kubeconfig manualmente de Criar ou atualizar um arquivo kubeconfig para um cluster do Amazon EKS.

4.    Teste sua configuração:

$ kubectl get svc

Exemplo de saída:

NAME             TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
svc/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   1m

Observação: se você receber outros erros de autorização ou de tipo de recurso, consulte Não autorizado ou acesso negado (kubectl).

Você não consegue se conectar ao endpoint do servidor de API do Amazon EKS

1.    Verifique se você está se conectando à URL correta do servidor de API do Amazon EKS. Para fazer isso, ative kubectl verbosity e execute o seguinte comando:

$ kubectl get svc --v=9

A saída é semelhante à seguinte:

I0110 16:43:36.920095   48173 loader.go:373] Config loaded from file:  /Users/abs/.kube/config
I0110 16:43:36.936844   48173 round_trippers.go:466] curl -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500'
I0110 16:43:37.362185   48173 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/ resolved to [{18.119.155.77 } {3.136.153.3 }]
I0110 16:43:37.402538   48173 round_trippers.go:510] HTTP Trace: Dial to tcp:18.119.155.77:443 succeed
I0110 16:43:37.500276   48173 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com//api/v1/namespaces/default/services?limit=500 200 OK in 563 milliseconds
I0110 16:43:37.500302   48173 round_trippers.go:570] HTTP Statistics: DNSLookup 1 ms Dial 40 ms TLSHandshake 44 ms ServerProcessing 52 ms Duration 563 ms
I0110 16:43:37.500308   48173 round_trippers.go:577] Response Headers:
I0110 16:43:37.500316   48173 round_trippers.go:580] Audit-Id: 37c17136-7fa7-40e9-8fe6-b24426e81564
I0110 16:43:37.500323   48173 round_trippers.go:580] Cache-Control: no-cache, private
I0110 16:43:37.500329   48173 round_trippers.go:580] Content-Type: application/json
I0110 16:43:37.500334   48173 round_trippers.go:580] X-Kubernetes-Pf-Flowschema-Uid: 508eb99e-d99b-44db-8ade-838c99fe8e9f
I0110 16:43:37.500340   48173 round_trippers.go:580] X-Kubernetes-Pf-Prioritylevel-Uid: d324d3db-05ce-441b-a0ff-c31cbe8f696c
I0110 16:43:37.500345   48173 round_trippers.go:580] Date: Tue, 10 Jan 2023 21:43:37 GMT

2.    Verifique se o servidor de API do Amazon EKS está acessível publicamente executando o seguinte comando:

$ aws eks describe-cluster --name cluster_name --region example_region --query cluster.resourcesVpcConfig

A saída é semelhante à seguinte:

{
    "subnetIds": [
        "subnet-abc1",
        "subnet-abc2",
        "subnet-abc3",
        "subnet-abc4",
        "subnet-abc5",
        "subnet-abc6"
    ],
    "securityGroupIds": [
       "sg-abc7"
    ],
    "clusterSecurityGroupId": "sg-abc7",
    "vpcId": "vpc-abc9",
    "endpointPublicAccess": true,
    "endpointPrivateAccess": false,
    "publicAccessCidrs": [
        "0.0.0.0/0"
    ]
}

3.    Na saída anterior, se EndpointPublicAccess for true, certifique-se de incluir na lista de permitidos todos os endereços IP de origem da lista PublicAccessCIDRS. Para isso, faça o seguinte:

  1. Abra o console do Amazon EKS.
  2. Escolha o cluster que você deseja atualizar.
  3. Escolha a guia Networking (Rede) e, depois escolha Manage Networking (Gerenciar rede).
  4. Selecione Public (Público).
  5. Em Advanced settings (Configurações avançadas), para CIDR block (Bloco CIDR), insira todo o intervalo de CIDR público que precise ser incluído na lista de permitissões.
  6. Escolha Save changes (Salvar alterações).

Na saída anterior, se endpointPrivateAccess for true, certifique-se de que a solicitação kubectl esteja vindo de dentro da rede do cluster. Se a solicitação kubectl vier de fora da Amazon Virtual Private Cloud (Amazon VPC), você receberá o seguinte erro de tempo limite:

$ kubectl get svc --v=9
I0110 17:15:58.889798   50514 loader.go:373] Config loaded from file:  /Users/example-user/.kube/config
I0110 17:15:58.896715   50514 round_trippers.go:466] curl -v -XGET  -H "Accept: application/json;as=Table;v=v1;g=meta.k8s.io,application/json;as=Table;v=v1beta1;g=meta.k8s.io,application/json" -H "User-Agent: kubectl/v1.26.0 (darwin/arm64) kubernetes/b46a3f8" 'https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500'
I0110 17:15:59.374499   50514 round_trippers.go:495] HTTP Trace: DNS Lookup for S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com resolved to [{192.168.126.17 } {192.168.144.26 }]
I0110 17:16:14.285027   50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.126.17:443 failed: dial tcp 192.168.126.17:443: i/o timeout
I0110 17:16:29.191768   50514 round_trippers.go:508] HTTP Trace: Dial to tcp:192.168.144.26:443 failed: dial tcp 192.168.144.26:443: i/o timeout
I0110 17:16:29.196959   50514 round_trippers.go:553] GET https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500  in 30300 milliseconds
I0110 17:16:29.197724   50514 round_trippers.go:570] HTTP Statistics: DNSLookup 183 ms Dial 14906 ms TLSHandshake 0 ms Duration 30300 ms
I0110 17:16:29.197768   50514 round_trippers.go:577] Response Headers:
I0110 17:16:29.199254   50514 helpers.go:264] Connection error: Get https://S123GBNS3HJUFN467UFGH6782JHCH2891.yl4.us-east-2.eks.amazonaws.com/api/v1/namespaces/default/services?limit=500: dial tcp 192.168.126.17:443: i/o timeout
Unable to connect to the server: dial tcp 192.168.126.17:443: i/o timeout

Além disso, atualize o grupo de segurança do cluster para garantir que o intervalo IP ou CIDR de origem esteja listado na lista de permissões. Isso permite que o cliente kubectl se conecte ao endpoint do servidor de API do Amazon EKS.


Informações relacionadas

Solução de problemas do Amazon EKS

Como resolvo o erro “You must be logged in to the server (Unauthorized)” (Você deve ter feito login no servidor [não autorizado]) quando me conecto ao servidor de API do Amazon EKS?

AWS OFICIAL
AWS OFICIALAtualizada há 10 meses