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

Última actualización: 30/01/2023

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

Descripción breve

Es posible que no pueda conectarse a su clúster de EKS por alguno de los siguientes motivos:

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

Solución

No creó el archivo kubeconfig

Una vez que cree el clúster de Amazon EKS, deberá configurar el archivo kubeconfig con 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 de kubectl. La siguiente resolución muestra cómo crear un archivo kubeconfig para su clúster con el comando update-kubeconfig de la AWS CLI. Para actualizar de forma manual el archivo kubeconfig sin utilizar la AWS CLI, consulte Creación o actualización de un archivo kubeconfig para un clúster de Amazon EKS.

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

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

$ aws --version

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

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

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

aws sts get-caller-identity

Nota: El usuario o 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 conceden en la configuración RBAC del clúster en el plano de control. Los usuarios o roles de IAM también pueden conseguir acceso a un clúster de Amazon EKS desde aws-auth ConfigMap. De manera predeterminada, el AWS IAM Authenticator para Kubernetes utiliza la AWS CLI configurada o la identidad del AWS SDK. Para obtener más información, consulte Habilitación del acceso de usuarios y roles de IAM al 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 por el nombre de su región de AWS. Sustituya cluster_name por el nombre de su clúster de EKS.

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

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

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

Nota: Para obtener la autenticación cuando ejecute comandos de kubectl, puede especificar el nombre de recurso de Amazon (ARN) de un rol de IAM con la opción --role-arn. De lo contrario, se utilizará la entidad de IAM en su cadena de credenciales predeterminada de la AWS CLI o del AWS SDK. Para obtener más información, consulte update-kubeconfig. También puede completar el paso 6 de la sección Creación del archivo kubeconfig de forma manual de Creación o actualización de un archivo kubeconfig para un clúster de Amazon EKS.

4.    Pruebe su configuración:

$ kubectl get svc

Salida de 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 recursos, consulte Acceso denegado o no autorizado (kubectl).

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

1.    Verifique que se está conectando a la URL correcta del servidor de la API de Amazon EKS. Para ello, active el nivel de detalle de kubectl 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.    Verifique que el servidor de la API de Amazon EKS sea accesible públicamente ejecutando el 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 (verdadero), asegúrese de incluir en la lista de direcciones IP de origen permitidas a todas aquellas que figuran en la lista publicAccessCidrs. Para ello, haga lo siguiente:
  1. Abra la consola de Amazon EKS.
  2. Elija el clúster que desea actualizar.
  3. Elija la pestaña Networking (Redes) y, a continuación, elija Manage Networking (Administrar redes).
  4. Seleccione Public (Público).
  5. En Advanced settings (Configuración avanzada), para CIDR block (Bloque de CIDR), ingrese todo el rango de CIDR público que debe incluirse en la lista de direcciones permitidas.
  6. Seleccione Save changes (Guardar cambios).

En el resultado anterior, si endPointPrivateAccess es true (verdadero), asegúrese de que la solicitud de kubectl provenga de la red del clúster. Si la solicitud de kubectl no proviene de su nube de Amazon Virtual Private Cloud (Amazon VPC), aparecerá 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 la IP de origen o el rango de CIDR estén en la lista de direcciones permitidas. Esto permite que el cliente de kubectl se conecte al punto de conexión del servidor de la API de Amazon EKS.