Probando EKS Auto Mode

Hello World 🙂

En el último re:Invent de AWS se presentó una de las funcionalidades más innovadoras de EKS: EKS Auto Mode. En mi opinión, esta característica es muy disruptiva y llego para cambiar el ‘juego’, ya que permite a las empresas utilizar Kubernetes en AWS sin la necesidad de contar con un equipo con sólidos conocimientos en EKS. Esta funcionalidad no solo empodera a los equipos de desarrollo, sino que también beneficia a startups que, en sus primeras etapas, suelen no tener los recursos para dedicar un equipo exclusivamente a la infraestructura.

No es un secreto para nadie que la curva de aprendizaje en Kubernetes puede ser bastante desafiante. Aunque las distribuciones administradas en las nubes públicas, como EKS, han simplificado considerablemente el acceso al mundo de Kubernetes, todavía es común enfrentarse a una serie de detalles complejos al comenzar a trabajar con alguna de ellas.

Desde la configuración de complementos (add-ons), la elección entre Managed Node Groups o Self-Managed Nodes, hasta la gestión de AMIs personalizadas (que requieren actualizaciones periódicas para mantenerse al día con las mejores prácticas de seguridad y rendimiento), EKS puede demandar una atención constante.

Con la llegada de EKS Auto Mode, muchos de estos desafíos operativos quedan en el pasado. Esta funcionalidad está diseñada para eliminar esas complicaciones y simplificar la experiencia de los usuarios, facilitando enormemente la adopción de Kubernetes, especialmente para aquellos equipos que buscan centrarse en sus aplicaciones sin preocuparse por los detalles operativos.

Con EKS Auto Mode tanto el plano de control (control plane) como el plano de datos (data plane) son completamente administrados por AWS, lo que reduce la complejidad de configuración y operación.

Por supuesto, como toda solución administrada, EKS Auto Mode tiene sus desventajas, y en esta entrada también exploraremos esos puntos.

El objetivo principal de este artículo es mostrar cómo crear un clúster con EKS Auto Mode utilizando Terraform, desplegar una aplicación en él y finalizar con un pequeño resumen de esta nueva opción que nos brinda AWS para trabajar con EKS.

Requisitos

  • Tener una cuenta de AWS.
  • Tener instalado Terraform.

El proyecto estará organizado en una única carpeta, dentro de la cual definiremos todos los archivos de Terraform necesarios.

1- Primero necesitamos exportar nuestras credenciales de AWS en nuestra consola local;

  • export AWS_ACCESS_KEY_ID="XXXXXXXXXX"
    export AWS_SECRET_ACCESS_KEY="XXXXXXXXXX"
  • Comprobamos que estemos conectados de forma correcta
    • aws sts get-caller-identity

2- En el archivo 01-provider.tf, definiremos los proveedores que utilizaremos en este proyecto. Estos proveedores son esenciales, ya que permiten a Terraform interactuar con los distintos servicios de infraestructura en la nube necesarios para desplegar los recursos correctamente.

  • provider "aws" {
      region = local.region
    }

3- En el archivo 02-locals.tf, definiremos las variables locales del proyecto. Estas variables ayudan a centralizar valores que se utilizarán en múltiples recursos, simplificando la configuración y facilitando el mantenimiento del código.

  • locals {
      region             = var.region
      cluster_name       = var.cluster_name
      cluster_version    = var.cluster_version
      tags               = var.tags
      common_tags        = {
        Environment = var.environment
        Terraform   = "true"  
      }
    }

4- En el archivo 03-eks.tf, en este fichero, definiremos todo lo necesario para crear nuestro clúster con la versión Auto Mode habilitada.

  • module "eks" {
      source  = "terraform-aws-modules/eks/aws"
      version = "~> 20.31"
      cluster_name    = var.cluster_name
      cluster_version = var.cluster_version
      vpc_id          = module.vpc.vpc_id
      subnet_ids      = module.vpc.private_subnets
      cluster_endpoint_public_access = true
      enable_cluster_creator_admin_permissions = true
      cluster_compute_config = {
        enabled    = true
        node_pools = ["general-purpose"]
      }
      tags = {
        Environment = "Dev"
        Terraform   = "true"
      }
    }

5- En el archivo 04-vpc.tf, definiremos todo lo necesario para crear nuestra VPC, que servirá como la base de la infraestructura del proyecto.

  • module "vpc" {
      source  = "terraform-aws-modules/vpc/aws"
      name = "DemoAutoMode"
      cidr = "10.0.0.0/16"
      azs             = ["us-west-1a", "us-west-1b"]
      private_subnets = ["10.0.0.0/19", "10.0.32.0/19"]
      public_subnets  = ["10.0.64.0/19", "10.0.96.0/19"]
      enable_dns_hostnames = true
      enable_dns_support   = true
      enable_nat_gateway     = true
      single_nat_gateway     = true
      one_nat_gateway_per_az = false
      public_subnet_tags = {
        "kubernetes.io/cluster/DemoAutoMode" = "shared"
        "kubernetes.io/role/elb"            = "1"
        "kubernetes.io/cluster/DemoAutoMode" = "owned"
      }
      private_subnet_tags = {
        "kubernetes.io/cluster/DemoAutoMode" = "shared"
        "kubernetes.io/role/internal-elb"   = "1"
        "kubernetes.io/cluster/DemoAutoMode" = "owned"
      }
    }

6- En el archivo 05-variables.tf, definiremos todas las variables que necesitaremos para parametrizar el proyecto. Estas variables permitirán una mayor flexibilidad y reutilización del código.

  • variable "region" {
      description = "Region"
      type = string
    }
    variable "environment" {
      description = "Environment Name"
      type        = string
      default     = "POC"
    }
    variable cluster_name {
      description = "Name EKS cluster is created with"
      type        = string
    }
    variable "cluster_version" {
      description = "EKS cluster version to use"
      type        = string
    }
    variable "tags" {
      description = "A map of tags that get added to all resources"
      type        = map(string)
      default     = {}
    }

7- En el archivo 06-demo_automode.auto.tfvars, estableceremos los valores de las variables para el entorno que estamos generando.

  • region          = "us-west-1"
    cluster_name     = "DemoAutoMode"
    cluster_version  = "1.31"
    tags = {
      App_Name = "DemoAutoMode"
      Country  = "UY"
      Region   = "AMERICA"
    }

8- En el archivo 07-outputs.tf, definiremos las salidas que Terraform nos mostrará tras ejecutar terraform apply.

  • output "configure_kubectl" {
      description = "Configure kubectl using AWS cli"
      value       = "aws eks --region ${local.region} update-kubeconfig --name ${module.eks.cluster_name} --alias ${module.eks.cluster_name}"
    }

Después de crear esos ficheros ya estamos en condiciones de ejecutar Terraform

  • terraform init
  • terraform plan
  • terraform apply

Resultado esperado

A continuación, verificaremos que todos los recursos se hayan creado correctamente.

Como parte de esta validación, desplegaremos una aplicación en el nuevo clúster para asegurarnos de que todo funciona como se espera

Primero vamos a actualizar nuestro fichero de kube config para poder interactuar con el clúster.

  • aws eks –region us-west-1 update-kubeconfig –name DemoAutoMode –alias DemoAutoMode

Luego pasaremos a ejecutar algunos comandos para obtener información del clúster:

Como podemos observar, el clúster se creo correctamente, pero no tiene ningún nodo adjunto. Esto es completamente normal cuando se activa el Auto Mode, ya que su objetivo es generar nodos dinámicamente en función de la demanda. Dado que inicialmente no hemos desplegado ninguna aplicación, el clúster permanece sin nodos activos.

Sin embargo, tan pronto como despleguemos una aplicación, veremos cómo los nodos se inician y se adjuntan automáticamente al clúster, demostrando la eficiencia de esta nueva funcionalidad.

Como podemos observar, el clúster es capaz de inicializar y adjuntar un nodo con gran rapidez una vez que se despliega la aplicación. Esto evidencia el compromiso de esta nueva funcionalidad con la optimización de costos. Según la documentación oficial de Auto Mode, esta eficiencia se logra gracias a que utiliza Karpenter en el backend para gestionar todo lo relacionado con el escalado y desescalado automático de los nodos en el clúster.

Además, Auto Mode incluye por defecto otros componentes esenciales, como un controlador Ingress que facilita el acceso al clúster y un complemento que permite trabajar de manera nativa con volúmenes EBS de AWS. La pre instalación de estos componentes básicos, junto con la gestión integral tanto del control plane como del data plane, convierte a esta nueva funcionalidad en una opción altamente atractiva para quienes están comenzando a trabajar con Kubernetes o buscan simplificar sus operaciones en EKS.

Terraform destroy

  • Como siempre, al finalizar tus pruebas, recuerda eliminar todos los recursos creados ejecutando terraform destroy --auto-approve. Este paso es crucial para evitar sorpresas desagradables en tu factura a final del mes. No subestimes la importancia de esta tarea, ya que la acumulación de recursos no utilizados puede generar costos innecesarios. Tómate el tiempo para limpiar tu entorno, eso te ahorrará dolores de cabeza en el futuro 🙂

Conclusiones

A lo largo de esta entrada, hemos explorado la nueva funcionalidad de Amazon EKS conocida como Auto Mode. Esta característica ha sido diseñada específicamente para facilitar el uso de Kubernetes a personas y equipos que no poseen conocimientos profundos en EKS. Al encargarse de gran parte de la carga operativa, Auto Mode permite a los usuarios centrarse únicamente en el desarrollo y despliegue de sus aplicaciones.

Desde mi perspectiva, esta funcionalidad representa un cambio de juego al democratizar aún más el uso de Kubernetes mediante EKS. Aunque ya existía una opción como Fargate, que también simplificaba la experiencia, Auto Mode ofrece la posibilidad de usar EKS de una manera más tradicional, al tiempo que elimina la complejidad asociada con la gestión del clúster y los nodos.

Ventajas destacadas:

  • Implementación rápida y eficiente: Auto Mode tiene la capacidad de crear nodos de manera increíblemente rápida y asegurarse de que estén listos para operar en el clúster en cuestión de minutos. Esto es ideal para responder a picos de demanda de manera eficiente.
  • Gestión operativa automatizada: AWS se encarga tanto del control plane como del data plane, incluyendo aspectos como actualizaciones, escalamiento automático y parches de seguridad.
  • Componentes preconfigurados: Incluye por defecto complementos esenciales como el soporte para exponer aplicaciones mediante Ingress Controllers y la integración con volúmenes EBS, lo que reduce significativamente el tiempo y esfuerzo de configuración inicial.

Desventajas a considerar:

  • Falta de personalización en la AMI: Para aquellos clientes con requisitos específicos que necesitan una AMI personalizada, esta funcionalidad no es ideal, ya que AWS gestiona completamente las AMIs y las actualiza cada 21 días. Esto podría ser un inconveniente para empresas con necesidades muy específicas.
  • Limitaciones en nodos Spot y tipos de instancia: Aún no está claro si Auto Mode permite trabajar con nodos Spot o especificar tipos de instancia personalizados. Este es un punto que requiere más investigación para entender las posibles restricciones.
  • Dependencia total de AWS: Al ceder el control operativo a AWS, los usuarios pierden cierta flexibilidad en la configuración y el manejo de los recursos del clúster.

En resumen, EKS Auto Mode es una solución poderosa que simplifica el acceso a Kubernetes para muchos equipos y organizaciones. Si bien tiene algunas limitaciones que pueden no adaptarse a casos de uso más avanzados, es una opción altamente atractiva para startups y equipos pequeños que buscan enfocarse exclusivamente en sus aplicaciones sin preocuparse por la infraestructura subyacente.

Próximos pasos: Continuaré investigando las capacidades y limitaciones de Auto Mode, especialmente en lo relacionado con nodos Spot y la selección de tipos de instancia, para ofrecer una visión más completa en futuras entradas del blog. ¡Estén atentos!

¡Nos vemos en la próxima entrada!

Nota: Todo el código lo pueden encontrar en el siguiente repositorio.

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.