¿Por qué no puedo conectarme a mi clúster de Amazon EKS?

7 minutos de lectura
0

He creado un clúster de Amazon Elastic Kubernetes Service (Amazon EKS), pero no puedo conectarme a mi clúster.

Descripción corta

Es posible que no pueda conectarse al clúster de EKS por uno de los siguientes motivos:

  • No ha creado el archivo kubeconfig para su clúster.
  • No puede conectarse al punto de conexión del servidor de la API de Amazon EKS.

Solución

No ha creado el archivo kubeconfig

Tras crear el clúster de Amazon EKS, debe configurar el archivo kubeconfig mediante la interfaz de la línea de comandos de AWS (AWS CLI). Esta configuración le permite conectarse a su clúster mediante la línea de comandos kubectl. La siguiente solución muestra cómo crear un archivo kubeconfig para su clúster con el comando update-kubeconfig de AWS CLI. Para actualizar manualmente el archivo de kubeconfig sin utilizar AWS CLI, consulte Creating or updating a kubeconfig file for an Amazon EKS cluster.

Nota: Si recibe errores al ejecutar los comandos de AWS CLI, asegúrese de utilizar la versión más reciente de AWS CLI.

1.    Compruebe que la versión 1.16.308 o posterior de AWS CLI esté instalada en su sistema:

$ aws --version

Importante: Debe tener la versión 2.7.9 o posterior de Python instalada en su sistema. De lo contrario, recibirá un error.

Consejo: Utilice administradores de paquetes como yum, apt-get o homebrew para macOS para instalar AWS CLI.

2.    Compruebe la identidad actual para comprobar que está utilizando las credenciales correctas que tienen permisos para el clúster de Amazon EKS:

aws sts get-caller-identity

Nota: La entidad, el usuario o el rol de la entidad de AWS Identity and Access Management (IAM) que crea un clúster de Amazon recibe automáticamente los permisos cuando se crea el clúster. Estos permisos se otorgan en la configuración de RBAC del clúster en el plano de control. Los usuarios o roles de IAM también pueden obtener acceso a un clúster de Amazon EKS en aws-auth ConfigMap. De forma predeterminada, el autenticador de AWS IAM para Kubernetes usa la identidad de AWS CLI o AWS SDK configurada. Para obtener más información, consulte cómo activar el acceso de usuarios y roles de IAM a su clúster.

3.    Cree o actualice el archivo kubeconfig para su clúster:

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

Nota: Sustituya example_region con el nombre de su región de AWS. Sustituya cluster_name con el nombre de su clúster de EKS.

De forma predeterminada, el archivo de configuración para Linux se crea en la ruta kubeconfig ($HOME/.kube/config) de su directorio principal. El archivo también puede fusionarse con un kubeconfig existente en esa ubicación. Para Windows, el archivo está en %USERPROFILE%\.kube\config.

También puede especificar otra ruta configurando la variable de entorno KUBECONFIG (del sitio web de Kubernetes) o con la siguiente opción --kubeconfig:

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

Nota: Para la autenticación al ejecutar los comandos de kubectl, puede especificar un nombre de recurso de Amazon (ARN) para el rol de IAM con la opción --role-arn. De lo contrario, se utiliza la entidad de IAM de la cadena de credenciales de AWS CLI o AWS SDK predeterminada. Para obtener más información, consulte update-kubeconfig. O bien, complete el paso 6 de la sección Create kubeconfig file manually de Creating or updating a kubeconfig file for an Amazon EKS cluster.

4.    Probar la configuración:

$ kubectl get svc

Resultado del ejemplo:

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

Nota: Si recibe otros errores de autorización o tipo de recurso, consulte Unauthorized or access denied (kubectl).

No puede conectarse al punto de conexión del servidor de la API de Amazon EKS

1.    Compruebe que se está conectando a la URL correcta del servidor API de Amazon EKS. Para ello, active kubectl verbosity y, a continuación, ejecute el siguiente comando:

$ kubectl get svc --v=9

El resultado es similar al siguiente:

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.    Compruebe que el servidor API de Amazon EKS sea accesible de forma pública mediante la ejecución del siguiente comando:

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

El resultado es similar al siguiente:

{
    "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.    En el resultado anterior, si endpointPublicAccess es true, asegúrese de que permite incluir en la lista todas las direcciones IP de origen de la lista publicAccessCidrs. Para ello, haga lo siguiente:

  1. Abra la consola de Amazon EKS.
  2. Elija el clúster que desee actualizar.
  3. Seleccione la pestaña Redes y, a continuación, seleccione Administrar redes.
  4. Seleccione Público.
  5. En Configuración avanzada, para Bloqueo de CIDR, introduzca todo el rango de CIDR público que debe figurar en la lista de permitidos.
  6. Seleccione Guardar cambios.

En el resultado anterior, si endPointPrivateAccess es true, asegúrese de que la solicitud kubectl proviene de la red del clúster. Si su solicitud de kubectl proviene de fuera de su Amazon Virtual Private Cloud (Amazon VPC), recibirá el siguiente error de tiempo de espera:

$ 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

Además, actualice el grupo de seguridad del clúster para asegurarse de que el rango de direcciones IP o CIDR de origen esté en la lista de permitidos. Esto permite que el cliente kubectl se conecte al punto de conexión del servidor de la API de Amazon EKS.

Información relacionada

Amazon EKS troubleshooting

¿Cómo resuelvo el error “You must be logged in to the server (Unauthorized)” (Debe registrarse en el servidor (no autorizado)) cuando me conecto al servidor de la API de Amazon EKS?

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año