DEV Community

Cover image for EKS con Terraform: Todo lo necesario, desde la red hasta los nodos
Israel Oña Ordoñez 🚀
Israel Oña Ordoñez 🚀

Posted on

EKS con Terraform: Todo lo necesario, desde la red hasta los nodos

📝 TL;DR

EKS (Elastic Kubernetes Service) es un servicio de AWS que permite desplegar clústeres de Kubernetes de forma sencilla. Con Terraform, puedes automatizar la creación de un clúster de EKS y todos los recursos necesarios. En este artículo, encontrarás un proyecto completo que despliega un clúster de EKS con Terraform, incluyendo la creación de una VPC, subredes, grupos de seguridad, roles de IAM y nodos.

 

🌟 Una solución práctica

Elastic Kubernetes Service (EKS) es una de las opciones de Kubernetes más populares en la nube. Sin embargo, configurar un clúster de EKS manualmente puede ser un proceso tedioso y propenso a errores, por lo que es recomendable automatizarlo. Una forma de hacerlo es utilizando Terraform, una herramienta de infraestructura como código que te permite definir y gestionar la infraestructura de tu aplicación de forma declarativa.

He creado un proyecto de Terraform que despliega un clúster de EKS, incluyendo la creación de una VPC, subredes, grupos de seguridad, roles de IAM y nodos. Este proyecto te permitirá desplegar un clúster de EKS con un solo comando, ahorrándote tiempo y esfuerzo, pero también te servirá como punto de partida para personalizar y extender la configuración según tus necesidades.

 

🏗️ Estructura del proyecto

El proyecto está organizado en varios archivos de Terraform, cada uno de los cuales se encarga de crear un conjunto específico de recursos. A continuación, se muestra la estructura del proyecto:

.
├── 1.01-vpc.tf
├── 1.02-private_subnets.tf
├── 1.03-public_subnets.tf
├── 1.04-elastic_ips.tf
├── 1.05-nat_gateway.tf
├── 1.06-internet_gateway.tf
├── 1.07-private_route_tables.tf
├── 1.08-public_route_table.tf
├── 1.09-private_routes.tf
├── 1.10-public_routes.tf
├── 1.11-private_route_table_association.tf
├── 1.12-public_route_table_association.tf
├── 1.13-security_groups.tf
├── 2.01-control_plane_iam_role.tf
├── 2.02-worker_node_iam_role.tf
├── 3.01-eks_cluster.tf
├── 3.02-launch_template.tf
├── 3.03-node_group.tf
├── 3.04-eks_access.tf
├── eks_user_data.sh
├── outputs.tf
├── providers.tf
├── variables.auto.tfvars
├── variables.tf
└── versions.tf
Enter fullscreen mode Exit fullscreen mode

Cada archivo tiene un nombre descriptivo que indica su función en el proyecto. Por ejemplo, 1.01-vpc.tf se encarga de crear la VPC, 1.02-private_subnets.tf crea las subredes privadas, 1.03-public_subnets.tf crea las subredes públicas, etc. Los archivos están numerados para indicar el orden en que deberían ser aplicados aunque Terraform se encarga de gestionar las dependencias entre los recursos.

⚙️ Recursos creados

1. VPC

El primer archivo, 1.01-vpc.tf, crea una VPC con una CIDR 10.0.0.0/16, habilita el DNS hostnames que permite a los nodos de EKS tener nombres de dominio de AWS y habilita el DNS support que permite a los nodos de EKS resolver nombres de dominio de AWS.

Configuración de VPC

2. Subredes privadas y públicas

Los archivos 1.02-private_subnets.tf y 1.03-public_subnets.tf crean las subredes privadas y públicas respectivamente.

Para poder comunicarse con internet, las subredes privadas utilizan NAT Gateways 1.05-nat_gateway.tf que requieren una IP pública 1.04-elastic_ips.tf.

Configuración de subredes privadas

Las subredes públicas utilizan un Internet Gateway 1.06-internet_gateway.tf para permitir el tráfico de entrada y salida a internet.

Configuración de subredes públicas

Para habilitar la comunicación entre las subredes y el internet, se crean las tablas de rutas 1.07-private_route_tables.tf, 1.08-public_route_table.tf, las rutas 1.09-private_routes.tf, 1.10-public_routes.tf y se asocian las tablas de rutas a las subredes 1.11-private_route_table_association.tf, 1.12-public_route_table_association.tf.

3. Grupos de seguridad

El archivo 1.13-security_groups.tf crea los grupos de seguridad necesarios para el clúster de EKS.

Se crea un grupo de seguridad para el control plane de EKS que permite el tráfico de entrada desde el internet en el puerto 443 y el tráfico de salida a internet en todos los puertos.

Grupo de seguridad para el control plane

Se crea un grupo de seguridad para los nodos de EKS que permite el tráfico de entrada desde el control plane en el puerto 10250 y el tráfico de salida a internet en todos los puertos.

Grupo de seguridad para los nodos

4. Roles de IAM

El archivo 2.01-control_plane_iam_role.tf crea un rol de IAM para el control plane de EKS que permite a EKS administrar recursos en tu cuenta de AWS.

Rol de IAM para el control plane

El archivo 2.02-worker_node_iam_role.tf crea un rol de IAM para los nodos de EKS que permite a los nodos de EKS acceder a los repositorios de imágenes de Amazon ECR, al control plane de EKS, a los servicios de SSM y CloudWatch.

Rol de IAM para los nodos

5. Clúster de EKS

El archivo 3.01-eks_cluster.tf crea el clúster de EKS con la versión 1.31 de Kubernetes.

Clúster de EKS

6. Nodos de EKS

El archivo 3.02-launch_template.tf crea un launch template para los nodos de EKS que utiliza una imagen de Amazon Linux 2023 y un script de usuario eks_user_data.sh que instala los componentes necesarios para que los nodos se unan al clúster de EKS.

Launch template para los nodos

El archivo 3.03-node_group.tf crea un node group para los nodos de EKS que utiliza el launch template creado anteriormente.

Node group para los nodos

7. Acceso a EKS

El archivo 3.04-eks_access.tf configura un IAM access entry en el clúster de EKS para permitir el acceso a un usuario de IAM (cloud_user) con permisos de administrador.

Acceso a EKS

 

🔧 Configuración

El proyecto utiliza un archivo de variables variables.auto.tfvars para definir los valores de las variables de Terraform. A continuación, se muestra un ejemplo de cómo se definen las variables en el archivo variables.auto.tfvars:

aws_user = "cloud_user" # Nombre del usuario de AWS que se utilizará para acceder al clúster de EKS como administrador

eks = {
  cluster_name    = "eks-cluster" # Nombre del clúster de EKS
  cluster_version = "1.31"        # Versión de Kubernetes
  worker_nodes = {
    node_group_name = "eks-managed-node-group" # Nombre del node group
    ebs_volume = {
      size = 20    # Tamaño del volumen EBS en GB
      type = "gp3" # Tipo del volumen EBS
    }
    instance_type              = "t3a.medium" # Tipo de instancia de los nodos
    desired_capacity           = 2            # Número de nodos deseados
    min_size                   = 1            # Número mínimo de nodos
    max_size                   = 3            # Número máximo de nodos
    max_unavailable_percentage = 50           # Porcentaje máximo de nodos no disponibles durante una actualización
  }
}

tags = { # Etiquetas para todos los recursos creados
  environment = "Prod"
  service     = "demo"
}

vpc = { # Configuración de la VPC
  cidr_block = "10.0.0.0/16"
  private_subnet_1 = {
    cidr_block        = "10.0.1.0/24"
    availability_zone = "us-east-1a"
  }
  private_subnet_2 = {
    cidr_block        = "10.0.2.0/24"
    availability_zone = "us-east-1b"
  }
  private_subnet_3 = {
    cidr_block        = "10.0.3.0/24"
    availability_zone = "us-east-1c"
  }
  public_subnet_1 = {
    cidr_block        = "10.0.4.0/24"
    availability_zone = "us-east-1a"
  }
  public_subnet_2 = {
    cidr_block        = "10.0.5.0/24"
    availability_zone = "us-east-1b"
  }
  public_subnet_3 = {
    cidr_block        = "10.0.6.0/24"
    availability_zone = "us-east-1c"
  }
}
Enter fullscreen mode Exit fullscreen mode

En esta configuración, se usan 3 subredes privadas y 3 subredes públicas en 3 zonas de disponibilidad de la región us-east-1. Se crean 2 nodos de EKS con un volumen EBS de 20 GB, tipo gp3, instancia t3a.medium, y se configura el node group para tener entre 1 y 3 nodos con un máximo del 50% de nodos no disponibles durante una actualización.

🛠️ Despliegue

Para desplegar el proyecto, sigue estos pasos:

  1. Clona el repositorio:

    git clone https://github.com/israoo/eks-cluster-setup.git
    cd eks-cluster-setup
    
  2. Inicializa Terraform:

    terraform init
    
  3. Planifica los recursos a crear:

    terraform plan -out=eks-cluster-setup.tfplan
    
  4. Aplica los cambios:

    terraform apply eks-cluster-setup.tfplan
    
  5. Accede al clúster de EKS:

    aws eks update-kubeconfig --name $(terraform output -raw eks_cluster_name)
    
  6. Verifica que los nodos de EKS se han unido al clúster:

    kubectl get nodes
    

¡Listo! Ahora tienes un clúster de EKS desplegado con Terraform.

📂 Repositorio del proyecto

Para obtener el código completo del proyecto, visita el repositorio en GitHub:

Repositorio: https://github.com/israoo/eks-cluster-setup

Este repositorio contiene:

  • Archivos de Terraform para desplegar un clúster de EKS.
  • Documentación sobre los recursos creados y su configuración.
  • Configuraciones personalizables para adaptar el clúster a tus necesidades.
  • Instrucciones detalladas en el archivo README.md sobre cómo usar el proyecto.

 

🎯 Recomendaciones adicionales

  • Seguridad:

    • Restringe el acceso al clúster mediante una VPN o rangos de IP específicos.
    • Configura un ACL en las subredes para controlar el tráfico de red.
    • Habilita el cifrado de datos en el control plane y en los nodos de EKS con una clave KMS.
    • Deshabilita el access entry configurado con el archivo 3.04-eks_access.tf y crea roles de IAM específicos para los usuarios que necesiten acceso al clúster.
  • Tráfico de red:

    • Configura un api gateway para gestionar las peticiones HTTP.
    • Configura un WAF para proteger tu aplicación de ataques.

Dentro del cluster de EKS puedes configurar diferentes servicios para mejorar la escalabilidad, resiliencia, observabilidad y seguridad de las aplicaciones desplegadas en el clúster.

 

🔗 Referencias/Extras

 

🚀 ¿Qué sigue?

Con un clúster de EKS completamente funcional, puedes comenzar a desplegar tus aplicaciones en Kubernetes. Puedes utilizar Helm o Kustomize para gestionar los manifiestos de tus aplicaciones. Si quieres aprender más sobre Helm y Kustomize, te invito a leer mi artículo sobre Helm vs Kustomize.

¡Espero que este proyecto te sea útil y si tienes dudas o sugerencias, no dudes en compartirlas en los comentarios!

 

Top comments (2)

Collapse
 
th3last46 profile image
Th3last46

Me acabas de explotar el cerebro jajajajja muchas gracias por tu aporte

Collapse
 
israoo profile image
Israel Oña Ordoñez 🚀

jaja me alegra saberlo! espero que te haya sido útil