Enmilocalfunciona

Thoughts, stories and ideas.

Azure: Cómo ahorrar costes en clústers de AKS (Azure Kubernetes Service)

Publicado por Santi Macias el

AzureAKSKubernetesVMSSAutomationRunbookMicrosoft

AKS, aunque seguramente todos ya lo conocéis, es el servicio de Kubernetes gestionado en el cloud de Azure que nos permite disponer de un clúster de K8s en modalidad PaaS, totalmente administrado y gestionado por Microsoft que nos ayuda en los procesos de mantenimiento de la infraestructura, automatización de los procesos de actualización, reparación, supervisión y escalado para facilitarnos el desplegar nuestras aplicaciones en contenedores de forma ágil.

Con la aparición de los diferentes servicios de Kubernetes administrados en plataformas cloud como Azure, AWS, Google y otras surge la necesidad de buscar fórmulas para ajustar y optimizar costes porque normalmente las empresas disponen de varios clústers y cada uno de ellos tienen asociadas un conjunto de varias maquinas virtuales de tamaño medio o alto que tienen un coste considerable.

El objetivo de este articulo es precisamente dar una visión de las diferentes estrategias que podemos aplicar para ahorrar costes en nuestros clúster de AKS en función de las capacidades, disponibilidad y rendimiento para cubrir las necesidades de demanda para las aplicaciones y servicios de nuestra organización.

Comparación de precios con otros proveedores de nube

A nivel de precios, en comparación con otros servicios de Kubernetes gestionados como EKS o GKE, AKS hay una diferencia fundamental y a tener en cuenta, ya que, Microsoft no cobra nada por los nodos máster y solo factura por los nodos worker que funcionan sobre máquinas virtuales, los recursos de almacenamiento y recursos de red consumidos.

En la página de cada proveedor Cloud encontramos todos los detalles:

Recomendaciones de Azure Advisor

Si trabajáis diariamente con Azure, sin duda, ya conocéis las opciones del servicio de Azure Advisor, pero en el caso de AKS no aportan mucha información en el aspecto de optimizar costes como seguramente habréis comprado.

Al pulsar en "Recomendaciones del Asesor", en lugar de proporcionarnos consejos o mejoras como ocurre con otros servicios de Azure, nos envía directamente a la pagina de documentación siguiente: https://docs.microsoft.com/es-es/azure/advisor/advisor-cost-recommendations

Ahorro de costes mediante reserva de instancias

Dentro de Azure tenemos la opción de reservar maquinas virtuales que nos permiten obtener una serie de descuentos con respecto a los precios de pago por uso, contratando por adelantado períodos de uno o tres años para la reserva de máquinas virtuales que indiquemos tanto Windows como Linux.

Como explica Microsoft, esto si combina el ahorro de costes que se obtiene con Azure Reserved VM Instances y el valor agregado de Azure Hybrid Benefit, con lo que se puede llegar a ahorrar entre un 70% al 80%. Aunque la realidad es que normalmente el ahorro suele estar entre un 20% a 30%.

Hay que tener en cuenta que estos descuentos no aplican sobre posibles licencias de aplicaciones de software, ni tampoco sobre almacenamiento y recursos de red asociados a máquinas virtuales.

Tanto si vuestra empresa tiene contratado un EA (Enterprise Agreement) directamente con Microsoft, mediante suscripciones CSP (Cloud Solutions Providers) o pago por uso, podéis obtener estos descuentos teniendo en cuenta que se paga por las máquinas reservadas en modalidad 24x7 y es posible cancelar la reserva pagando una penalización.

Más info: https://azure.microsoft.com/es-es/pricing/reserved-vm-instances

Ahorro de costes con auto-escalado de máquinas virtuales

Otro escenario típico en Azure para reducir costes se basa en utilizar las opciones de auto-escalado y dimensionar las máquinas virtuales correctamente en el clúster de AKS fijando un mínimo y un tope máximo de máquinas virtuales.

Para ello, AKS permite configurar el sistema de auto-escalado basado en métricas utilizando el conjunto de escalado de las Virtual Machine Scale Sets (VMSS). Este proceso lo podemos realizar en el momento de crear el clúster la primera vez o mas adelante, cambiándolo desde el portal de Azure o la línea de comandos:

Por otro lado, para optimar correctamente las cargas de trabajo tenemos que analizar y definir todos nuestros Pods con peticiones de recursos y limites de CPU y RAM y configurar el sistema mediante Horizontal Pod Autoscaling (HPA).

Más info: https://docs.microsoft.com/es-es/azure/aks/cluster-autoscaler

Ahorro de costes apagando manualmente el clúster

Pero, incluso sin pagar nada por los nodos máster, reservando instancias de VMs y configurando el auto-escalado, dependiendo del numero nodos workers contratados se pueden establecer ciertos procesos para ahorrar costes durante los periodos de inactividad donde no estemos utilizando el servicio. En particular, en los entornos de desarrollo y pruebas, donde los desarrolladores trabajan en su jornada laboral habitual, se puede establecer una buena práctica de apagar las máquinas virtuales por la noche y encenderlas por la mañana desde el portal de Azure.

Para apagar las VMSS, tenemos que utilizar la opción Desasignar que encontramos en la información general:

o bien directamente desde la opción de Instancias que nos permite elegir la lista de maquinas del conjunto de VMSS que vamos a detener:

La otra solución, es disponer de unos scripts manuales de AZ CLI o PowerShell que realicen el trabajo de parar las maquinas virtuales por la noche o periodos de inactividad y arrancar de nuevo las maquinas virtuales cuando sean necesarias para utilizar de nuevo el clúster de AKS:

PS> $nameVMSS="aks-agentpool-28767870-vmss"  
PS> $resourceGroup="MC_rg-aks-workshop-lab_aks-workshop-lab_westeurope"

PS> Stop-AzureRmVmss -ResourceGroupName $resourceGroup-VMScaleSetName $nameVMSS -Force -Verbose

PS> Start-AzureRmVmss -ResourceGroupName $resourceGroup-VMScaleSetName $nameVMSS -Verbose  

Más info: https://docs.microsoft.com/es-es/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-manage-powershell

Ahorro de costes con start/stop de VMSS automatizado

Esta solución es una de las recomendadas y podemos activarla de varias maneras, en este articulo lo explicaremos con el servicio de Azure Automation y Runbooks para VMSS.

El servicio de Azure Automation, permite hacer muchas tareas de automatización y configuración mediante un Runbook, si queréis saber más en la pagina oficial esta toda la info: https://azure.microsoft.com/es-es/services/automation

Comentar que Azure Automation, no es un servicio gratuito pero incluye una capa free de 500 minutos al mes más que suficiente para estas tareas.

Los pasos para realizar el proceso de apagado y encendido consisten en:

  • Crear una cuenta de Automation
  • Añadir el Runbook Stop-Start-VMSS desde la galería
  • Configurar y publicar el Runbook creado
  • Programar una agenda de ejecución para Stop y Start

Definir estos pasos no es nada complicado ya que desde el Portal de Azure tenemos todas las opciones disponibles a golpe de click desde el menú de la propia interfaz de usuario de Azure.

La cuenta de Azure Automation la deberemos crear la primera vez para registrar el servicio, simplemente escribimos en la barra de búsqueda de Azure "Cuenta de Automation", creamos la cuenta y luego ya podemos añadir un Runbook como se muestra en la imagen:

Para añadir el Runbook desde la galería, examinamos la lista que ofrece Azure para seleccionar "Stop-Start-VMSS" que ya contiene el código PowerShell con el workflow de ejecución:

Una vez cargado el Runbook, tenemos que configurarlo indicando el grupo de recursos sobre el que vamos a ejecutar el proceso y publicarlo para que funcione correctamente:

En el panel principal, veremos un dashboard con el estado de todas las ejecuciones del Runbook y sus resultados:

Por último, solo queda programar la agenda con el horario y periodicidad y además configurar los parámetros de ejecución para realizar el trabajo, este proceso tendremos realizarlo 2 veces, una programación para el proceso de apagado y otra programación para el proceso de encendido:

Una vez configurado, ya tenemos finalizado todo el proceso automatizado para nuestras VMSS.

Ahorro de costes creando y destruyendo el clúster

Otra posible solución que permite ahorrar grandes costes, consiste en destruir todo el clúster completo cuando no lo necesitemos y crearlo de nuevo desde cero, suponiendo que tenemos todo bien definido con plantillado de ARM, Terraform o las herramientas que uséis para vuestra IaC.

Aunque este sistema no es válido para entornos de producción que tienen que estar funcionando 24x7, en ciertos escenarios como entornos de pruebas, formación y laboratorios es ideal, teniendo en cuenta que crear un clúster desde cero de AKS conlleva unos 15 minutos y después hay que sumar el tiempo de  volver a desplegar de nuevo todos nuestras aplicaciones y servicios lo cual deberíamos también tener automatizado y no debería llevarnos mucho tiempo.

Además tenemos una ventaja de valor añadido, se trata de que al destruir el clúster de AKS completo no pagaremos nada por ningún recurso sean máquinas virtuales, almacenamiento o recursos de red como balanceadores, IPs, etc.

Aprovechando la potencia de Azure DevOps podríamos crear y disponer de un ciclo de vida completo que aprovisionará y configurará todo nuestro clúster y ecosistema de AKS para ejecutarlo en cualquier momento que fuera necesario.

Conclusiones

Hemos visto las diferentes alternativas que podemos utilizar para ahorrar costes en AKS y como responsables de la infraestructura debemos valorar en cada caso particular cómo pueden afectar estos enfoques a los diferentes entornos de desarrollo, pruebas, formación, preproducción y producción en cada empresa.

Si te ha gustado el artículo, ¡síguenos en Twitter y no te pierdas los próximos posts de nuestro Blog!

Autor

Santi Macias

Microsoft Tech Lead en knowmad mood, +20 años trabajando con tecnologías Microsoft actualmente centrado sobretodo en Azure, Cloud Native, DevOps, Docker, Kubernetes, Microservicios y Serverless.