Google Cloud vs Azure
En este artículo hacemos una interesante comparativa entre estos dos servicios en la nube, destacando sus principales ventajas e inconvenientes para que...
¿Quieres saber qué es la Infraestructura como Código? En este artículo explicamos este concepto, además de sus beneficios y las herramientas más usadas.
Las aplicaciones han evolucionado, ¡y de qué manera! En la actualidad, a menudo se trabaja con sistemas distribuidos y microservicios. Por supuesto, las aplicaciones están directamente relacionadas con las infraestructuras, por lo tanto, las tecnologías de gestión de infraestructura también han evolucionado. La virtualización y Cloud Computing son parte de estos cambios, reducen el trabajo de los departamentos de TI, les lleva menos tiempo y esfuerzo proporcionar y administrar los servicios. Pero… ¿Esto es suficiente? La palabra mágica es “automatización”, todo lo que se pueda automatizar más, hay que hacerlo, y eso se consigue tratando la infraestructura como código.
Lo primordial es comprender que infraestrcutura como código. La IaC (Infrastructure as code) es un enfoque para automatizar la gestión de la infraestructura de TI (centros de datos), adoptando metodologías y buenas prácticas de desarrollo de software, lo que permite a los profesionales de TI utilizar herramientas como el control de versiones, lenguajes de programación, y explotar otras prácticas para completar el ciclo de desarrollo, como la integración continua, entrega y despliegue continuo.
Básicamente, consiste en definir la infraestructura en ficheros como si se tratase del código de una aplicación, para el aprovisionamiento y configuración de los servidores de forma rápida y con capacidad de replicarse. Sin duda, es un salto de calidad para la empresa, ya que permite desplegar y escalar aplicaciones de forma ágil, con menor costo, reduciendo los posibles errores humanos que provocan los procesos manuales. Con IaC es posible tener infraestructuras dinámicas, es decir, capacidad de crear y destruir servidores rápidamente mediante programación.
La infraestructura como código se ha convertido en algo imprescindible al trabajar con soluciones en la nube, y parece que fuese algo propio de la nube, sin embargo, el enfoque de IaC se puede aplicar tanto a la infraestructura en la nube, como en virtualización tradicional, incluso en servidores físicos.
Velocidad: La agilidad es una de las características principales de Cloud Computing, y definiendo la infraestructura como código podemos obtener aún más velocidad en los despliegues, dado que podemos tener entornos completos listos solo de ejecutar un comando y replicarlo la veces que lo necesitemos.
Sistemas replicables y desechables: Los recursos pueden ser creados, sustituidos, redimensionados y destruidos de forma rápida. Por lo tanto, es posible reconstruir de manera confiable cualquier recurso o elemento de la infraestructura con un pequeño esfuerzo. Además, la todas las acciones son replicables, si tienes una plantilla con la definición de la infraestructura, puedes hacer el despliegue en desarrollo y producción, sin temor a equivocarte. Desde luego, los cambios se pueden realizar en la infraestructura en ejecución sin interrumpir el servicio. Esto hace que los servicios sean más tolerantes a fallos.
Simplificación de errores: Con IaC es claro que se reduce la posibilidad de los errores humanos y ayuda a mantener los servicios sin interrupción. También, al mantener un control de cambios con un control de versiones de la infraestructura, puedes hacer un rollback, en caso de necesitar volver atrás.
Reducción de costos: Es un beneficio importante para las empresas. Es sencillo de comprender, si se automatizan los procesos necesitas menos manos para cubrir dichas tareas, por ende, el personal se puede enfocar en mejoras y en otras actividades relevantes para el negocio. Otro detalle, teniendo en cuenta que la IaC simplifica los errores, es un punto importante para reducir costos, ¿Por qué? Las empresas pierden cuando un sistema se cae por un tiempo, por poco que sea. Un ejemplo, en una microfinanciera el servicio se interrumpe, en ese tiempo deja de desembolsar créditos, y eso repercute directamente en el negocio.
Hay muchas herramientas para definir infraestructura como código, en este apartado mencionaré algunas que considero importantes y más utilizadas. No se trata de una comparativa, ni entraré en detalles para aprender a usar la herramienta. La idea es que tengas una noción de lo hay y puedas indagar más al respecto y elegir la que mejor se ajuste a tus necesidades. Te invito a realizar el curso de introducción a Cloud Computing, esta formación es de lo mejor que puedes encontrar en la red, hay una sección dedicada a IaC y podrás ver ejemplos precisos con algunas herramientas en mención.
Las herramientas de aprovisionamiento son utilizadas para instalar la infraestructura de TI, redes, servidores, almacenamiento y otros recursos.
Terraform
Es una herramienta de código abierto desarrollada por HashiCorp para aumentar la automatización aprovisionando la infraestructura como código definido en archivos declarativos y gestionando todo el ciclo de vida, creación de recursos, modificación de recursos existentes y destrucción cuando ya no son necesarios. Permite crear infraestructura reproducible, es decir, puedes aprovisionar entornos de prueba y de producción consistentes con la misma configuración. Terraform utiliza un formato llamado HashiCorp Configuration Language (HCL), propio de HashiCorp.
Terraform tiene unas particularidades interesantes, puedes comprobar la configuración antes de aplicar, con solo ejecutar un comando, terraform plan
. De tal manera que siempre puedes corregir algo antes de ejecutar los cambios, validando que lo que tienes definido en el código es lo que tenías en mente hacer. Una de las principales ventajas es que se puede usar con cientos de proveedores de nube. Así que, no es necesario aprender una herramienta para trabajar con cada proveedor de nube, ya sea que utilices AWS, Azure, Google Cloud Platform, etc., siempre tendrás la posibilidad de definir la infraestructura con Terraform. Es una de las razones por las que se ha convertido en la herramienta más utilizada para aprovisionar infraestructuras en la nube.
AWS CloudFormation
Es la solución nativa de AWS para aprovisionar recursos en la nube implementando IaC. En este caso se pueden definir plantillas en formato JSON o YAML. Puedes usar plantillas para crear, actualizar y eliminar recursos, las veces que sea necesario. Una ventaja de CloudFormation es que, al ser un servicio propio de Amazon, tiene una integración formidable con los demás servicios de AWS.
ARM Templates
Como herramienta nativa en Azure para implementar infraestructura como código, puedes usar plantillas de Azure Resource Manager (ARM Templates). Estas plantillas llevan una sintaxis declarativa en formato JSON, donde se definen los recursos y las propiedades que conforman la infraestructura. Recientemente han incorporado un nuevo lenguaje llamado Bicep (actualmente en versión preliminar) para escribir plantillas ARM, esto me parece un acierto y está muy interesante, es una sintaxis más simple y concisa.
Cloud Deployment Manager
Google también tiene su herramienta para aprovisionar infraestructura en Google Cloud Platform. Con Cloud Deployment Manager puedes especificar todos los recursos que necesites de forma declarativa en formato YAML y hacer los despliegues de forma paralela, es decir, al mismo tiempo. Tiene una característica de vista previa que permite consultar los cambios antes de confirmar el despliegue. Si trabajas con Google Cloud Platform, es una herramienta a tener en cuenta.
Vagrant
Vagrant es una herramienta desarrollada por Mitchell Hashimoto (fundador de HashiCorp) para crear escenarios virtuales de forma sencilla y replicable. Está orientada principalmente para el uso en desarrollo y se puede utilizar con diferentes proveedores, como VirtualBox, WMware, Docker y Hyper-V. También se puede integrar con herramientas de gestión de configuración que mencionaré luego. Aunque Vagrant también tiene integración con algunos proveedores en la nube con la ayuda de plugins, es muy limitado y no es su esencia, para entornos complejos está “su hermano” más desarrollado, Terraform.
Lenguajes de programación
Los lenguajes de programación también son otra alternativa para aprovisionar recursos en la nube. Dado que los proveedores disponen de SDK para diferentes lenguajes de programación y exponen una API, puedes usar el lenguaje de tu preferencia. Por lo que he visto y he averiguado, Go y Python son los más usados para este tipo de desarrollo.
El siguiente paso en la implementación de infraestructuras de TI es la configuración. Después de aprovisionar un servidor, se deben instalar los paquetes necesarios y realizar las configuraciones correspondientes. Para automatizar este proceso existen las herramientas de gestión de configuración.
Ansible
Antes de conocer estas herramientas, normalmente cuando necesitábamos configurar un servidor, lo que hacíamos era conectarnos por SSH para instalar los paquetes y realizar las configuraciones manualmente. Sacando provecho de las herramientas conocidas, nos podíamos crear un Script Bash, por ejemplo, y definir las instrucciones con las configuraciones a realizar. Ese método resuelve si es un único servidor, pero ¿qué pasa si tienes múltiples servidores? Muchos servidores con configuraciones idénticas, imagínate un escenario con varios servidores web que sirven la misma aplicación, definitivamente ya no es práctico, ni productivo usar Scripts. Una de las soluciones es Ansible.
Ansible es una herramienta para automatizar el aprovisionamiento de software y las configuraciones. Permite gestionar los servidores de forma sencilla y paralela. No necesita de agentes para gestionar los nodos, ejecuta las tareas a través de SSH y solo necesita Python en el controlador (equipo donde se ejecuta Ansible). Las tareas con las configuraciones que se deben realizar son escritas en formato YAML. Una característica importante es que Ansible es idempotente, significa que, aunque ejecutes un playbook n veces, se obtendrá el mismo resultado. Por ejemplo, para instalar Apache, con Ansible solo le indicas que quieres que esté presente y el solo se encargará de las validaciones.
¿Otras opciones?
Por supuesto, hay otras alternativas. Por mencionar algunas, Chef, Puppet, CFEngine y SaltStack son herramientas para gestión de configuración que puedes valorar.
Los contenedores son los que hacen posible la arquitectura de microservicios. Se trata de una virtualización basada en sistema operativo, lo que tenemos son procesos independientes que comparten el mismo kernel y recursos del servidor.
Docker
Docker es una tecnología que permite la creación y el uso de contenedores de Linux. Docker elimina las tareas de configuración repetitivas y está pensado para la portabilidad de aplicaciones. En otras palabras, esta tecnología permite empaquetar y aislar las aplicaciones con todo el entorno que necesita para ejecutarse, es decir, todo el software y configuraciones requeridas, más el código de la aplicación están dentro del contenedor, el cual puede ser llevado a diferentes entornos, ya sea en desarrollo o en producción, con la seguridad de que funcionará sin ningún problema. Todo se define en un fichero, el Dockerfile.
Con Docker podemos usar imágenes preconfiguradas que se pueden descargar desde un repositorio, por ejemplo, si necesitas ejecutar una aplicación web, puedes bajar la imagen que ya tenga el software instalado y simplificar la configuración, esto nos facilita aún más el desarrollo. También puedes crear tus propias imágenes, reutilizarlas y compartirlas.
Podman
Es una alternativa a Docker, se pueden usar las mismas imágenes de Docker. En cuanto a la línea de comandos es un alias de Docker, el equivalente a un docker ps
es un podman ps
. Un punto interesante de Podman es que no requiere de un demonio ejecutándose en segundo plano para funcionar.
¿Otras alternativas?
LXC sigue siendo una solución válida, pero más complejo. El propio Docker usa LXC por debajo. Otra alternativa es CoreOS rkt.
Con los contenedores todo va de maravillas, no obstante, cuando tienes que manejar múltiples microservicios se vuelve complejo gestionar los contenedores. Y si nos referimos a cientos o miles de contenedores, es imposible gestionarlo con lo que nos ofrece Docker. Es por ello que surge la figura del orquestador de contenedores.
Kubernetes
Es una plataforma de código abierto para automatizar la implementación, el escaldo y la administración de aplicaciones en contenedores. En principio Kubernetes fue desarrollado por Google y adaptado para usar Docker, pero desde hace un tiempo se crearon estándares en relación a los contenedores, por lo que ya no depende de Docker.
Con Kubernetes puedes gestionar los contenedores en un clúster, permitiendo ejecutar múltiples contenedores en cada nodo. Sin lugar a dudas Kubernetes ha ganado la batalla a sus competidores, uno de ellos Docker Swarm. Kubernetes ha sido adoptado y tiene una comunidad extensa, básicamente se ha convertido en el estándar de facto para orquestación de contenedores.
DevOps es la unión de una cultura, procesos y herramientas para conseguir una entrega continua de un producto a los usuarios. Se trata de cambios culturales, donde los desarrolladores (Dev) y administradores de sistemas (Ops) trabajan como un único equipo, eliminando la fricción que existía, cuando el equipo de desarrollo se preocupaba solo de su código y quería pasar a producción los cambios, mientras que a los administradores les interesa mantener los sistemas estables, sin errores, y muchas veces pasaba que al liberar una actualización el sistema dejaba de funcionar. Con DevOps ese problema se ha terminado, todos trabajan en la misma dirección y con el mismo objetivo, desarrollar y entregar software de forma rápida al usuario final.
El enfoque de IaC incluye principios, herramientas y buenas prácticas para automatizar procesos, por lo tanto, es una pieza fundamental en DevOps. No es posible hablar de DevOps sin tener en cuenta la infraestructura como código. Antes mencioné que, para completar el ciclo de desarrollo, integración continua, entrega y despliegue continuo, es imprescindible definir la infraestructura como código, de lo contrario es imposible lograrlo. De hecho, las herramientas de automatización para tratar la infraestructura como código, a menudo se les denomina herramientas de DevOps.
¿Quieres saber más sobre DevOps? Puedes comenzar por Qué es DevOps: Fundamentos, beneficios y herramientas, en este artículo conocerás más sobre el término DevOps y los beneficios que conseguirás al adoptar dicha cultura.
También te puede interesar
En este artículo hacemos una interesante comparativa entre estos dos servicios en la nube, destacando sus principales ventajas e inconvenientes para que...
Tras el anterior artículo "Cloud Computing: Que és, características y ventajas", en este seguimos hablando sobre Cloud Computing, centrados en explicar los...
Conoce qué es Cloud Computing, para qué sirve, sus características y ventajas en este primer articulo de dos sobre fundamentos de la...