EKS – Elastic Container Service para Kubernetes (AWS)

¡Hola!

Es la primera vez que voy a empezar a realizar una incursión con Docker y me he puesto los calzoncillos por fuera (cual superman) para enfrentarme a esto que me ha dado más de un dolor de cabeza en Amazon.

Había leídos muchos manuales y había seguido la documentación oficial de Amazon … Pero siempre puede haber una piedra en mitad de camino.

Al igual que yo vosotr@s os podéis encontrar con lo mismo así que os explicaré en detalle de todos los posibles problemas que os podéis encontrar en el.

Tengo que remarcar que este es un manual para principiantes en este mundo y a raíz que vaya conociendo más sobre el tema lo iré compartiendo con todos vosotros.

Documentación en la que nos hemos inspirado:


¿Qué es Amazon EKS?

Amazon Elastic Container Service for Kubernetes (Amazon EKS) es un servicio administrado que le permite ejecutar fácilmente Kubernetes en AWS sin necesidad de crear ni mantener su propio plano de control de Kubernetes. Kubernetes es un sistema de código abierto para automatizar la implementación, escalado y administración de las aplicaciones en contenedores.

Amazon EKS ejecuta instancias del plano de control de Kubernetes en varias zonas de disponibilidad para garantizar una alta disponibilidad. Amazon EKS detecta y reemplaza automáticamente las instancias del plano de control en mal estado y proporciona actualizaciones de versiones y parches automatizados para ellas.

Con todo esto Amazon nos ofrece poder enlazarlos con los siguientes servicios:

  • Amazon ECR: Contenedor de imágenes.
  • ELB: El balanceador para distribuir las cargas.
  • IAM: Para la autenticación.
  • VPC: La red privada para su comunicación.

¿Como funciona Amazon EKS?


    Cómo funciona Amazon EKS
Source: Amazon

Siguiendo la estructura los pasos que conlleva esto son:

  1. Provisionar un EKS Cluster
  2. Agregaremos los nodos donde se va a desplegar.
  3. Configuramos un servidor para conectar/gestionar el cluster.
  4. Correremos aplicaciones.

Pues bien teniendo claro los pasos que vamos a seguir, es hora de ponernos manos a la obra con ello. Como dije antes me detendré antes de cada punto para avisar los posibles problemas que encuentro.

REQUISITOS PREVIOS

CREAR UN USUARIO NUEVO

Bajo nuestro punto de vista crearlo con un usuario distinto al general (root) es lo ideal, para ello vamos a crear un usuario con permisos necesarios para ello y accederemos al panel con el.

Servicios > Seguridad, Identidad y Conformidad > IAM

En Usuarios, añadimos el usuario:

La primera regla para crear el EKS es que sólo tiene acceso al EKS el usuario que lo ha creado, por lo tanto este punto es de los más importantes.

Si se crea con el usuario por defecto este toma el nombre de root, os lo digo porque estuve sin acceso al cluster desde SSH por desconocimiento de cómo funcionaba 🙁

  • Acceso mediante programación: Lo hemos dejado ya que en nuestra SHELL SSH lo vamos a necesitar.
  • Acceso a la consola de administración de AWS: Lo hemos dejado ya que desde allí ejecutaremos la configuración.

Vamos a darle temporalmente «Administrator Access» ya que los pasos que va a realizar para la creación de cluster son:

  • Crear un ROL IAM asociado al usuario.
  • Crear el cluster y los nodos de trabajo.

Luego lo podremos limitar a lo único que vayamos a necesitar por temas de seguridad.

Terminamos el flujo de crear un usuario y al final nos dará un resumen de lo creado. Importante que apuntemos los datos que nos da:

Como veis he censurado la parte sensible por temas de seguridad, pero debéis apuntar:

  • URL de acceso.
  • Usuario y Contraseña.
  • Id de clave de acceso (necesaria para SSH)
  • Clave de acceso secreta (necesaria para SSH)

Ojo con la clave de Acceso que solo te la dan 1 vez, en el caso de haberse olvidado anotarla sólo te tienes que crear otra en el usuario y listo.


DESDE EL NUEVO PANEL

Recordamos que obtuvimos la URL nueva de acceso anteriormente, accederemos con nuestro usuario y contraseña.

Creando un ROL

Una vez dentro lo primero que haremos será crear un ROL, esto es necesario a la hora de crear el cluster desde el portal de Amazon.

Nos muestra en el paso 2 las políticas que vamos añadir
El paso 3 es si queremos añadir TAGS, pasamos al paso 4 añadiendo un nombre a la política.

Creando VPC

Otra opción recomendable (seguridad y no ocupar espacios de otros rangos) es la de crear un VPC distinta para nuestras máquinas o servicio de EKS.

Para ello vamos a usar CloudFormation y un Template que nos creará la red de una manera sencilla.

Seleccionamos «Template is Ready» + «Amazon S3 URL» y agregamos la URL.
Añadimos el nombre y modificamos la red a nuestro antojo, lo recomendable es un /16 para tener muchas IP disponibles.

Vamos a finalizar los pasos tal cual están y esperamos a que finalice el proceso. Una vez finalizado iremos a Outputs y apuntaremos los siguientes valores:

  • SecuirityGroups
  • SubnetIds
  • VpcId

Esto nos permitirá saber la red que tenemos que usar en todo momento y no equivocarnos con otras que hayamos configurado anteriormente.

Mi Primer Cluster

Ha llegado el momento de crear nuestro primer cluster (¡biennnnn!) pero la verdad que no es tan impresionante como suena jajajaja.

Recordamos que seguimos en nuestro nuevo usuario y el panel de amazon para este usuario (ESTO ES MUY IMPORTANTE) así que vamos a seguir los pasos siguientes:

  • https://console.aws.amazon.com/eks/home#/clusters
  • Elegimos el nombre de nuestro cluster.
  • Elegimos la versión, por defecto me coge la 1.12 (la 1.13 está disponible)
  • Rol Name, el que hemos creado en este manual.
  • VPC + Security Groups, la red que hemos creado + El grupo de seguridad.
  • El login es opcional ya que tiene un costo extra por usar CloudWatch.
Nombre del cluster, versión de Kubernetes y el nombre del rol.
Elegimos nuestra red y nuestro security group.
Los dejamos deshabilitado a no ser que sean necesarios ya que conllevan costes.

La creación del cluster puede tardar entre 10 y 15 minutos así que aquí podéis ver como gira el gif de Creating o montar el servidor SSH (si no está montado) con la configuración necesaria para su gestión.


DESDE SSH

Podemos tener una máquina nueva o alguna que podamos estar usando de puente etc… esto lo dejamos a elección de la persona.

Lo que vamos hacer en este caso es lo siguiente:

  • Instalar los comandos necesarios para interactuar con Amazon y con nuestro Cluster EKS.
  • Configuración para acceder a los servicios de Amazon con el usuario que hemos creado.
  • Configurar el acceso de nuestro Cluster.

Preparando el entorno

Kubectl

Lo primero que haremos será instalar «kubectl» este comando nos permitirá realizar gestiones sobre nuestro EKS.

Revisando la documentación oficial de Kubernetes debemos instalar siempre una versión menos a la versión del cluster. Es decir, si usamos el cliente 1.2 funcionaría en el 1.1 y 1.3.

Lo recomiendan para que no haya problemas a la hora de funcionar.

Como vamos a seguir el entorno de EKS amazon nos proporciona la documentación actualizada para poder usar su entorno. Como recordamos actualmente existe desde la versión 1.13 a 1.11 de Kubernetes.

Kubernetes 1.12

curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.12.7/2019-03-27/bin/linux/amd64/kubectl

Kubernetes 1.11

curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.11.9/2019-03-27/bin/linux/amd64/kubectl

Kubernetes 1.10

curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.13/2019-03-27/bin/linux/amd64/kubectl

Damos permisos de ejecución:

chmod +x ./kubectl

Ahora tenemos dos opciones (a elección propia) o lo instalamos en el sistema en general o lo configuramos para el usuario específico.

# Sistema en general

mv ./kubectl /usr/bin

# Para el usuario en concreto

Con estos comandos creamos un directorio bin en nuestro home y lo movemos a dicho directorio. Además exportamos la variable de entorno y lo guardamos en nuestro fichero .bashrc para que cargue la variable siempre que accedamos en la shell.

mkdir -p $HOME/bin && mv ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

AWS CLI

AWS CLI es el comando que nos permite la comunicación de nuestro sistema contra los productos de Amazon. Esto nos permitirá enlazar con el comando kubectl para realizar configuraciones sobre nuestro EKS. Queda claro que es importante y es necesario este fichero para poder avanzar.

Requisitos previos

  • Python 2 (2.6.5 +) o Python 3 (3.3+)
  • Windows, Linux, macOS o Unix

Voy a contar con que no se tiene nada instalado en el sistema y vamos a instalarlo desde cero:

# Instalación de python3 y sus paquetes necesarios para el awscli
apt install python3-pip python3-setuptools python3-dev

# Instalación y/o actualización del paquete awscli
# --user, crea una carpeta dentro del home actual del usuario
pip3 install awscli --upgrade --user

# Si queremos desinstalar el paquete
pip3 uninstall awscli

Esto nos lo crea en un subdirectorio localizado en $HOME/.local/bin/aws, por lo tanto lo recomendable es crear un alias.

echo "alias aws='.local/bin/aws'" >> ~/.bash_aliases

Si no queremos salir de la shell y recargar las variables del sistema:

source ~/.bashrc

Comprobamos la versión que tenemos:

aws --version

Configurando el AWS

Os acordáis del usuario y que guardarais ciertas cosas del usuario que hemos creado, pues bien ha llegado el momento.

Ejecutamos el comando siguiente

aws configure
Nos solicitará los datos necesarios para configurarlo. En mi caso mis productos están en la zona «eu-central-1» y le he puesto que me devuelva las salidas de comando en formato JSON.

Ver regiones disponibles en AWS.

Creando el archivo kubeconfig

Como ya tenemos montado nuestro sistema en Linux vamos a crear la configuración de manera automática con el siguiente comando:

aws eks --region eu-central-1 update-kubeconfig --name mi-primer-cluster

Esto creará un fichero en ~/.kube/config con la configuración necesaria para comunicarnos con nuestro Kubernetes.

Para comprobar que ha ido todo bien entonces ejecutamos:

kubectl get svc
Con este comando obtener el Cluster de EKS (el de mi-primer-cluster)

Si te ha salido esto o ha dado respuesta con las redes que habéis configurado es que todo ha ido bien.


CREANDO LOS NODOS DE TRABAJO

Hasta el momento lo que hemos creado ha sido lo siguiente:

  • VPC (La red)
  • KUBERNETES (El Organizador)

Es decir que lo que nos queda ahora es crear servidores que se encarguen del trabajo y alojar nuestras aplicaciones.

El concepto que sigue amazon para esto es lo mismo que con las máquinas de EC2, por lo tanto los precios son los establecidos por ello (Ver Precios).

Para crear los servidores o grupo de servidores lo vamos a ejecutar con Cloud Formation una vez más para que sea más sencillo.

Ahora vamos a rellenar la siguiente pestaña:

  • Stack name: Nombre identificativo, le puse el nombre del cluster para identificarlo de manera más fácil.
  • ClusterName: El nombre del cluster que hemos creado anteriormente.
  • ClusterControlPanelSecurityGroup: El mismo que hemos usado para crear la configuración.
  • NodeGroupName: Un nombre identificativo para detectar los autoscaling (es como lo hace Amazon para tener disponibilidad).
  • NodeAutoScalingGroupMinSize: El número mínimo de máquinas que debe tener el grupo de escalado.
  • NodeAutoScalingGroupDesiredCapacity: El número de máquinas que se van a crear cuando se cree los workers.
  • NodeAutoScalingGroupMaxSize: El número máximo de máquinas que puede llegar el grupo en caso de necesitar más recursos.

(Crearé un resumen hablado al final de la configuración)

1/2
  • NodeInstanceType: Tipo de instancia EC2, recordad que esto tiene que ver con los precios de Amazon.
  • NodeImageId: Elegimos la imagen que se instalará en las máquinas, podemos tener un listado de ellas en la documentación oficial de AWS.
    • Utilizaremos: ami-0d741ed58ca5b342e
  • NodeVolumeSize: Tamaño del espacio de los servidores, en este caso está en 20 GB.
  • KeyName: Para acceder a los nodos generalmente se usa una clave que tengamos configurada en AWS.
  • BootstrapArguments: Si queremos meter un script o comandos a ejecutar cuando se ejecute cada uno de los nodos.
  • VpcId: La red VPC que he creado, esto no tiene mucho misterio.
  • Subnets: Las subredes que vamos a usar de acuerdo a nuestra VPC elegida. He seleccionado las 3 subredes.
2/2

Los siguientes pasos es darle siguiente y siguiente hasta que finalice ya que no tenemos que rellenar nada más. El proceso en sí tarda un rato hasta que os crea las 3 máquinas en donde se encuentra el resto de EC2.

Recomendamos etiquetarlas luego las máquinas para saber qué es cada cosa.

Resumen de lo que hemos hecho:

Básicamente lo que hemos hecho es crear las máquinas que van almacenar los distintos servicios de docker con una regla de autoscaling del propio amazon. Es decir que de manera automática según necesidad pueda reescalar.


UNIENDO LOS NODOS AL CLUSTER

Entendemos que ya tenemos el punto anterior creado, es decir el de crear las máquinas que harán el trabajo duro, ahora lo que nos queda es autenticar este grupo de trabajo en nuestro Cluster de Kubernetes.

Lo primero que haremos será traer un valor que podemos obtener en la pestaña «Outputs» del Cloud Formation que hemos usado para crear las máquinas o workers.

En nuestro caso:

NoteInstanceRole o InstanceRoleARN:

arn:aws:iam::xxxxxxxx43:role/mi-primer-cluster-nodegroup-standard-wo-NodeInstanceRole-XXXXXXXXXX

NOTA: NO CONFUNDIR CON EL ARN PROFILE.

Descargamos desde nuestra máquina SSH:

curl -o aws-auth-cm.yaml https://amazon-eks.s3-us-west-2.amazonaws.com/cloudformation/2019-02-11/aws-auth-cm.yaml

Modificamos el fichero

apiVersion: v1
 kind: ConfigMap
 metadata:
   name: aws-auth
   namespace: kube-system
 data:
   mapRoles: |
     - rolearn: arn:aws:iam::xxxxxxxx43:role/mi-primer-cluster-nodegroup-standard-wo-NodeInstanceRole-XXXXXXXXXX
       username: system:node:{{EC2PrivateDNSName}}
       groups:
         - system:bootstrappers
         - system:nodes

Como veis en la parte de rolearn lo que hemos puesto es el texto que hemos adquirido en el output del CloudFormation.

Aplicamos la nueva configuración:

kubectl apply -f aws-auth-cm.yaml

Ahora comprobamos que todo ha ido bien:

Y con esto señoras y señores tenemos nuestro cluster de EKS montado con 3 máquinas aguantando el peso del mundo.

¿Qué es lo siguiente?

Pues en realidad lo siguiente es montar un panel donde poder administrarlo todo, pero este será el siguiente post.


POSIBLES FALLOS

Algunos de los casos que me he encontrado a lo largo de mi aprendizaje se puede resumir en la propia documentación oficial:

https://docs.aws.amazon.com/es_es/eks/latest/userguide/troubleshooting.html

Y como siempre si tenéis alguna duda tenéis los comentarios abajo para preguntar.

Deja una respuesta

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