Por que não consigo me conectar ao meu 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 ao meu cluster.

Breve descrição

Talvez você não consiga se conectar ao seu 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 APIs do Amazon EKS.

Resolução

Você não criou o arquivo kubeconfig

Depois de criar o cluster do Amazon EKS, você deverá configurar o arquivo kubeconfig com 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 seu arquivo kubeconfig sem usar a AWS CLI, consulte Como criar ou atualizar um arquivo kubeconfig para um cluster do Amazon EKS.

Observação: se você receber erros ao executar comandos da AWS CLI, verifique se está usando a versão mais recente da AWS CLI.

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

$ aws --version

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

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

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

aws sts get-caller-identity

Observação: o usuário ou perfil da entidade do AWS Identity and Access Management (IAM) que cria um cluster da Amazon recebe permissões automaticamente quando esse cluster é criado. Essas permissões são concedidas na configuração RBAC do cluster no plano de controle. Usuários ou perfis 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 Como ativar o acesso de usuários e perfis do IAM ao seu cluster.

3.    Crie ou atualize o arquivo kubeconfig do seu 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 kubeconfig ($HOME/.kube/config) no seu diretório inicial. O arquivo também pode ser mesclado com um kubeconfig existente nesse local. Para Windows, o arquivo está em %USERPROFILE%\.kube\config.

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

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

Observação: para autenticação ao executar comandos kubectl, você pode especificar o 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, conclua a Etapa 6 na seção Crie o arquivo kubeconfig manualmente de Como 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 tipo de recurso, consulte Não autorizado ou acesso negado (kubectl).

Não é possível conectar-se ao endpoint do servidor de APIs do Amazon EKS.

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

$ kubectl get svc --v=9

A saída é semelhante ao 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 APIs 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 ao 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 permissões todos os endereços IP de origem na lista publicAccessCidrs. Para fazer isso, siga estas etapas:

  1. Abra o console do Amazon EKS.
  2. Escolha o cluster que você deseja atualizar.
  3. Escolha a guia Rede e depois escolha Gerenciar redes.
  4. Selecione Público.
  5. Em Configurações avançadas, para Bloco CIDR, insira todo o intervalo público de CIDRs que precisa ser incluído na lista de permissões.
  6. Escolha Salvar alterações.

Na saída anterior, se endPointPrivateAccess for true, certifique-se de que a solicitação de kubectl esteja vindo da rede do cluster. Se a solicitação de kubectl vier de fora da sua 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 IP de origem ou o intervalo de CIDRs estejam na lista de permissões. Isso permite que o cliente kubectl se conecte ao endpoint do servidor de APIs do Amazon EKS.

Informações relacionadas

Solução de problemas do Amazon EKS

Como resolver o erro “Você deve estar conectado ao servidor (Não autorizado)” quando me conecto ao servidor de APIs do Amazon EKS?

AWS OFICIAL
AWS OFICIALAtualizada há um ano