Conectar kubectl a un clúster AWS EKS

El otro día publiqué un post acerca de cómo gestionar usuarios en un clúster EKS utilizando usuarios y roles IAM. Hoy es el turno de explicar cómo esos usuarios se pueden conectar al clúster.

Estas instrucciones las hemos probado en Ubuntu 18.04, 20.04 y MacOS.

Requerimientos

  • Interfaz de línea de comandos de AWS (AWS CLI). Hay instrucciones de como instalarla aquí.
  • kubectl. Todos los pasos explicados aquí .

Debes usar una versión de kubectl que esté a menos de una versión menor de diferencia con tu clúster. Por ejemplo, un cliente v1.2 debería funcionar con un máster v1.1, v1.2, y v1.3.

Documentación de kubectl

Configurando AWS CLI

AWS CLI guarda las credencials en un fichero local llamado credentials, en un directorio llamado .aws en tu directorio home . En ese fichero puede haber diferentes perfiles y el nombre del perfil es algo que debemos de recordar ya que lo usaremos más tarde.

La forma en la que organices los perfiles depende totalmente de ti y tus necesidades. Simplemente recuerda, el primer perfil default es el que se utiliza cuando no se le pasa ningun perfil a la hora de ejecutar comandso en el CLI.

Usuarios IAM

Si estás utilizando usuarios IAM con EKS lo único que necesitas añadir es el usuario que tiene permisos en el cluster.

Necesitarás recordar el nombre del perfil donde sus credencials están guardadas ya que lo usarás más tarde.

Roles IAM

Si estás usando roles IAM necesitas añadir el usuario IAM que está autorizado a adoptar el rol así como el rol autorizado en EKS

Necesitarás recordar el nombre del perfil donde el rol está definido ya que lo usarás más tarde.

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[daveops-eks]
role_arn = arn:aws:iam:1234567890:role/EKSRoleName
source_profile = default #This needs to match the profile where the details of the user are saved.

Puedes comprobar que tus datos son correctos ejecutando lo siguiente:

#Esto devuelve información sobre tu propio usuario
aws sts get-caller-identity                   
{
    "UserId": "XXXXXXXXXXXXXXXX",
    "Account": "1234567890",
    "Arn": "arn:aws:iam::1234567890:user/daveops"
}
#Esto devuelve información sobre tu propio usuario
aws sts get-caller-identity                   
{
    "UserId": "XXXXXXXXXXXXXXXX",
    "Account": "1234567890",
    "Arn": "arn:aws:iam::1234567890:user/daveops"
}

#Si los permisos son correctos y el usuario puede adoptar el rol, la respuesta debería ser similar a los que ves debajo
aws sts get-caller-identity --profile daveops-eks
{
    "UserId": "AROA22HCPPIFCOKNYURUS:botocore-session-1225235571",
    "Account": "accountNumber",
    "Arn": "arn:aws:sts::accountNumber:assumed-role/daveops-eks/botocore-session-1225235571"
}

Ya hemos configurado el cliente de AWS y comprobado que tiene los permisos correctos. Pasemos a kubectl.

kubeconfig

La configuración de kubectl se almacena en este fichero: .kube/config. Es un documento en YAML que sigue la siguiente forma cuando se utiliza con un clúster EKS.

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: some data here
    server: https://some-string.some-other-string.region.eks.amazon.com
    name: arn:arnOfTheCluster
contexts:
- context:
    cluster: arnOfTheCluster
    namespace: namespaceName
    user: arnOfTheCluster
current-context: arn:arnOfTheActiveCluster
kind: Config
preferences: {}
users:
- name: arnOfTheCluster
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - --region
      - regionId
      - eks
      - get-token
      - --cluster-name
      - clusterName
      command: aws
      env:
      - name: AWS_PROFILE
        value: profileName #Esto es importante!!
  

¿Qué debemos saber sobre esto?

  • Puedes configurar más de un clúster. Por cada uno tendrás que añadir un cluster, contex y user.
  • Esta configuración se genera y añade al fichero automáticamente por el AWS CLI. Si tú no creaste el clúster alguien te dará los datos que necesitas.
  • AWS_PROFILE es importante. ¿Recuerdas cuando dije que necesitabas recordar el nombre del perfil de AWS? Ahora es el momento de usarlo.
    • Si vas a utilizar un usuario IAM usa el nombre del perfil donde están guardados los detalles de tu usuario. En mi ejemplo esto era default.
    • Si vas a utilizar rol IAM, usa el nombre del perfil donde están los detalles del rol que vas a adoptar. En mi ejemplo esto era daveops-eks.

Para comprobar que podemos acceder correctamente al clúster vamos a ejecutar algo con kubectl. Por ejemplo, el siguiente comando devuelve una lista de pods.

kubectl get pods
NAME                                                              READY   STATUS             RESTARTS   AGE
my-service-fdcd8c95d-2862m                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-8hlc2                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-cg67k                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-fgh94                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-p5dqd                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-sfvzh                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-sr7pc                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-swghv                                     1/1     Running            0          6d1h
my-service-fdcd8c95d-t4ztb                                     1/1     Running            0          6d1h
...

¡Gracias por visitar mi blog! Por favor, déjame un comentario y dime qué te parece. ¿Te ha servido de ayuda? ¿Hay alguna otra información que te gustaría estuviese aquí?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *