17-02-2025 / Estrategias de optimización de costos / 9 mins.
Escalar clústeres de Kubernetes puede ser un proceso complejo, que involucra múltiples componentes como redes, almacenamiento, nodos de trabajo y planos de control. Mantener un alto rendimiento, baja latencia y un desempeño óptimo al escalar clústeres de Kubernetes requiere configuraciones de red eficientes, balanceo de carga y una adecuada asignación de recursos.
Más importante aún, un escalado ineficiente puede llevar a una utilización subóptima de los recursos y costos operativos innecesarios.
Aquí entra en juego Amazon Elastic Kubernetes Services (EKS), un servicio administrado por AWS que permite escalar clústeres de Kubernetes sin la necesidad de gestionarlos directamente.
Vamos a profundizar para entender mejor qué es EKS y cómo funciona.
¿Qué es Amazon EKS?
Amazon Elastic Kubernetes Services (EKS) es un servicio administrado que permite a los usuarios ejecutar clústeres de Kubernetes en AWS sin necesidad de instalar o mantener sus propios nodos o planos de control de Kubernetes. Con EKS, AWS gestiona completamente el escalado, la implementación y las operaciones de tus clústeres de Kubernetes, permitiendo que te concentres en tareas más importantes, como ejecutar tus aplicaciones.
En esencia, obtienes todos los beneficios de la infraestructura de AWS, como escalabilidad, confiabilidad y rendimiento, con una menor sobrecarga operativa. Además, es posible integrarlo con servicios de red y seguridad de AWS, como los balanceadores de carga de aplicaciones (ALB) y AWS Identity and Access Management (IAM).
EKS está diseñado para ser altamente seguro, escalable y disponible. Permite ejecutar aplicaciones de Kubernetes tanto en AWS EC2 como en AWS Fargate.
Además, es importante destacar que las aplicaciones que se ejecutan en Amazon EKS son compatibles con otras que corren en entornos estándar de Kubernetes. Incluso es posible migrar aplicaciones estándar de Kubernetes a Amazon EKS sin necesidad de cambiar su código.
¿Cómo funciona EKS?
EKS se considera la solución de AWS para Kubernetes como servicio, simplificando la gestión de clústeres de Kubernetes en AWS.
Existen dos componentes principales en EKS:
- Nodos Maestros/Plano de ControlEl plano de control incluye tres nodos maestros de Kubernetes que se ejecutan en diferentes zonas de disponibilidad. Todo el tráfico entrante pasa a través de un balanceador de carga de red hacia el plano de control. Es importante señalar que AWS gestiona el plano de control y este no puede ser administrado por la organización.
- Nodos de Trabajo/Plano de DatosLos nodos de trabajo son controlados y gestionados por la organización y se ejecutan en instancias de AWS EC2 dentro de la nube privada virtual (VPC).
Mientras que el plano de control se encarga de gestionar y monitorear dónde y cuándo se inician los contenedores, los nodos de trabajo ejecutan los contenedores de la organización y son responsables de correr las aplicaciones.
Con Amazon EKS, es posible:
- Automatizar el escalado de instancias del plano de control de Kubernetes según su carga.
- Detectar y reemplazar automáticamente instancias no saludables del plano de control.
- Ejecutar y escalar de forma fluida el plano de control de Kubernetes a través de diferentes zonas de disponibilidad.
- Usar la arquitectura de AWS para garantizar alta disponibilidad.
- Integrar con servicios de red y seguridad de AWS como ALBs, IAM y Amazon VPC (que restringe el tráfico entre los componentes del plano de control dentro de un clúster único, lo que hace que EKS sea altamente confiable).
- Ejecutar versiones actualizadas de Kubernetes para acceder a las herramientas y complementos más recientes.
¿Cuáles son las características de Amazon EKS?
Estas son las principales características de Amazon EKS:
- Kubernetes completamente administrado: EKS es Kubernetes como servicio. AWS gestiona las operaciones, el despliegue y el escalado de los clústeres de Kubernetes en tu nombre, lo que ahorra tiempo y reduce la carga operativa.
- Alta escalabilidad y disponibilidad: EKS ejecuta instancias del plano de control en múltiples regiones de disponibilidad, mejorando la disponibilidad y reduciendo riesgos de tiempo de inactividad. Además, permite escalar aplicaciones de forma vertical u horizontal.
- Alta seguridad: Ofrece funciones de seguridad como integración con AWS Key Management, aislamiento en la VPC y roles de IAM para cuentas de servicio de Kubernetes.
- Fácil de usar: Incluso si eres nuevo en Kubernetes, EKS proporciona una interfaz sencilla para gestionar y desplegar aplicaciones de Kubernetes.
Comprendiendo los precios de EKS y los factores que influyen
Por cada clúster de EKS creado, pagas $0.1 por hora. Es posible utilizar un solo clúster de EKS para ejecutar múltiples aplicaciones de Kubernetes aprovechando políticas de seguridad de IAM y namespaces.
Con Amazon EKS, tienes la flexibilidad de ejecutar y escalar aplicaciones de Kubernetes tanto en las instalaciones como en la nube.
Los costos dependen de cómo ejecutes Amazon EKS:
- Amazon EC2: Pagas por los recursos de AWS utilizados, como instancias EC2 y volúmenes EBS. No hay compromisos previos ni tarifas mínimas.
- AWS Fargate: Los precios se calculan según los recursos de vCPU y memoria utilizados desde que se descarga la imagen del contenedor hasta que las instancias de EKS se terminan.
- AWS Outposts: Pagas $0.1 por hora por clúster, tanto para implementaciones locales como extendidas. La tarifa de EKS se cobra adicionalmente al precio de Outposts.
Principales causas de un gasto ineficiente en EKS
Recursos infrautilizados o sobreaprovisionados
Uno de los problemas de costos más comunes en EKS es la infrautilización y/o el sobreaprovisionamiento de recursos asignados a los nodos de EKS.
Al crear un clúster no basado en Fargate, definimos el tipo de instancia que se utilizará para alojar los pods que contienen las imágenes de nuestras aplicaciones, conocidas como contenedores.
Para quienes no tienen experiencia, puede parecer una buena idea asegurarse de que los nodos tengan un "margen de seguridad" utilizando un tipo de instancia con más recursos de los necesarios. Sin embargo, esto inevitablemente generará gastos innecesarios sin un beneficio real: si nuestra aplicación solo requiere una cierta cantidad de recursos, cualquier excedente generará costos innecesarios.
Aunque podría parecer que optar por tipos de instancia más pequeños sería la solución, los ahorros obtenidos podrían verse contrarrestados por el impacto en el rendimiento del clúster. La clave para operar cargas de trabajo en contenedores con recursos optimizados en términos de costos es encontrar un equilibrio.
Para evitar este problema, hay varias medidas que se pueden tomar:
- Cluster Autoscaler o Karpenter: son herramientas excelentes para controlar la provisión de recursos. Ambas funcionan escalando los nodos de EKS hacia arriba o hacia abajo en función de los recursos disponibles en un clúster. Si el kube-scheduler no puede iniciar un pod, ambas herramientas detectan esta situación y agregan recursos al clúster para aliviar la carga. Esto hace que sea más viable construir clústeres con tipos de instancia más pequeños, ya que estas herramientas automatizan la creación de recursos adicionales cuando se alcanzan los límites del clúster.
- Límites y solicitudes:Los límites y las solicitudes también son un factor importante para optimizar los costos. Al establecer una solicitud dentro de la especificación de un pod, se le indica al programador de Kubernetes cuántos recursos específicos (CPU o memoria) se garantiza que tendrá el pod. El programador utiliza esta información para determinar en qué nodo debe colocarse el pod. Un límite, por otro lado, es la cantidad total de recursos que un pod puede consumir. Si un pod supera este límite, puede ser expulsado, terminado o no permitido programarse. Los límites y las solicitudes son una excelente forma de garantizar un presupuesto predecible, mejorar el escalado automático del clúster y optimizar el rendimiento de las cargas de trabajo.
- Herramientas de monitoreo: Herramientas como CloudWatch son útiles para obtener información sobre el estado de tu clúster. Puedes utilizar Container Insights para recopilar métricas y presentarlas en la consola de CloudWatch, donde luego puedes configurar alarmas basadas en la utilización para asegurarte de que se te notifique cuando se superen ciertos umbrales.
Costos de transferencia de datos y egreso
Los costos de egreso y transferencia de datos son temas ampliamente malentendidos que impactan significativamente en los costos operativos. Estos costos están asociados con el movimiento de datos dentro y fuera de los clústeres EKS, hacia otros servicios de AWS, internet, o entre regiones y zonas de disponibilidad de AWS.
- Sé consciente de los factores que afectan estos costos: Componentes adicionales como NAT Gateways, AWS PrivateLink y AWS Transit Gateway pueden generar cargos adicionales según el tipo de datos transferidos.
- Comprender las implicancias de servir tráfico externamente también es crucial: Un pod se expone al mundo externo utilizando un servicio del tipo LoadBalancer, ClusterIP o NodePort. Errores de configuración, como usar el tipo de servicio incorrecto o causar que el tráfico tenga que comunicarse entre zonas de disponibilidad, pueden ser un error costoso. Asegúrate de entender cómo está configurada tu aplicación y los patrones que seguirá el tráfico.
- Aloja en el mismo pod siempre que sea posible: Como se mencionó anteriormente, la comunicación entre zonas de disponibilidad genera costos. Por lo tanto, si sabes que dos contenedores necesitan comunicarse, identifica si es factible alojarlos en el mismo pod, ya que esto garantiza que la comunicación se mantendrá dentro de la misma zona de disponibilidad.
Costos de almacenamiento persistente
El almacenamiento persistente suele lograrse utilizando Elastic Block Store (EBS). Dentro de un clúster EKS, estos volúmenes pueden ser aprovisionados y adjuntados a nodos EC2 de EKS para garantizar que los datos persistan más allá de la terminación de los pods.
Aunque EBS ofrece durabilidad, escalabilidad y facilidad de uso, también puede ser un importante generador de costos si no se gestiona eficazmente.
Pasos para controlar estos costos
Comprende cuánto espacio necesitas y las últimas generaciones de tipos de volúmenes
Al igual que el sobreaprovisionamiento de instancias, los volúmenes de EBS también pueden sobreaprovisionarse con demasiado espacio o características innecesarias.
Asegúrate de tener una comprensión sólida de cuánto espacio necesitas, qué generaciones más recientes de tipos de volúmenes están disponibles (por ejemplo, gp2 frente a gp3) y si realmente necesitas definir IOPs.
Kubernetes utiliza objetos llamados Clases de Almacenamiento (Storage Classes) y Volúmenes Persistentes (Persistent Volumes) para definir cómo se crean volúmenes adicionales. Familiarízate con las opciones y anotaciones disponibles para optimizar la creación y gestión de tu almacenamiento.
- Implementa un procedimiento de auditoría: Cuando se terminan recursos que utilizan volúmenes de EBS, a veces estos volúmenes asociados no se eliminan, especialmente si los datos están configurados para persistir. Asegúrate de tener un procedimiento de auditoría para identificar cuándo ocurre esto y un plan para eliminar estos volúmenes huérfanos.
- Utiliza automatización: Si utilizas snapshots para tus volúmenes de EBS, emplea una herramienta como Amazon Data Lifecycle Manager (DLM) para automatizar la creación y eliminación de snapshots de EBS. Define políticas que solo conserven los snapshots más recientes y eliminen todo lo que exceda una cierta fecha.
Cómo Frust puede ayudarte a reducir tus costos de EKS
Frust analiza constantemente el escalado de tus cargas de trabajo en EKS para garantizar el mejor precio y estabilidad. Esto te permite obtener optimizaciones de tus instancias reservadas, spot y planes de ahorro. Analizamos el uso de tu organización y los precios del mercado para asegurarnos de que siempre estés utilizando las mejores opciones disponibles para ahorrar en AWS.