La llegada de la informática en la nube ha supuesto grandes cambios en el modo en que se aloja y se entrega el software. Existe un servicio online para casi todo lo que hacemos en nuestra vida cotidiana, y esto sucede tanto para el comercio minorista como para la infraestructura informática. En este artículo, echaremos un vistazo a cómo la integración, la entrega y la implementación continuas pueden sacar partido de las tecnologías en la nube, especialmente de la infraestructura como código y de los contenedores.
Tanto si es usted nuevo en la configuración de un proceso de CI/CD como si ya cuenta con una configuración alojada localmente, vale la pena que comprenda cómo pueden utilizarse estas técnicas y herramientas para que pueda adaptarlas a sus necesidades.
La integración continua y la implementación continua están diseñadas para que el proceso de lanzar software para los usuarios sea más rápido y estable.
Combinar un enfoque de "poco y a menudo" con la automatización (de compilaciones, creación de entornos y pruebas) reduce el tiempo que pasa desde el desarrollo hasta el lanzamiento, mientras que ofrece confianza en la calidad del producto.
Las últimas etapas del flujo de trabajo de CI/CD suelen incluir pruebas de extremo a extremo y de rendimiento, así como pruebas manuales, y todas ellas requieren entornos de pruebas que reflejen fielmente la producción. Para una eficiencia y coherencia máximas de las pruebas, estos entornos debería actualizarse automáticamente en lugar de mantenerse manualmente. Poner en práctica todo esto no solo requiere habilidades y herramientas de DevOps, sino también una gran cantidad de infraestructura que ofrezca capacidad de computación al servidor de integración continua, agentes de compilación, entornos de pruebas y almacenes de datos.
El número de máquinas necesarias para respaldar su proceso de compilación depende del tamaño y de la complejidad de su proyecto, y del número de desarrolladores que estén trabajando en él. Sin embargo, ese número también puede variar con el tiempo.
Si aloja y gestiona toda su infraestructura para un proceso de CI/CD, tiene que decidir dónde equilibrar la balanza entre disponer de suficiente capacidad para ejecutar múltiples tareas simultáneamente en momentos de gran demanda, frente al coste de comprar y mantener máquinas que permanezcan inactivas durante largos periodos de tiempo. Es aquí donde una infraestructura alojada en la nube puede ofrecer ventajas significativas.
La llegada de infraestructura alojada en la nube ha traído consigo grandes cambios en el modo en que se gestiona la infraestructura.
Con la infraestructura como servicio (IaaS), los recursos para la computación se suministran a través de contenedores o máquinas virtuales (VM). Si necesita más capacidad, solo tiene que pedirla (y pagarla, por supuesto): adquisición, instalación y gestión y hardware físico ya no son un problema.
De este modo, una organización no ve las máquinas físicas que alojan estos contenedores o VM (aunque conoce su región geográfica para fines normativos y de recuperación en caso de siniestros) y esto ha permitido un importante cambio de mentalidad.
En un contexto alojado en la nube, los innumerables recursos físicos que respaldan el servicio hacen que sea posible tratar los servidores como una mercancía intercambiable y desechable; lo que en inglés se denomina cattle, ganado. Esto contrasta con el alojamiento tradicional en hardware propio, en que a los servidores se les solía tratar como a mascotas: se les asignaba un nombre propio, se cuidaba de ellos cuando estaban enfermos y se esperaba que vivieran durante bastante tiempo.
Con el concepto de ganado, si llega el momento de actualizar o reparar un servidor, este simplemente se retira y se sustituye por uno nuevo que cumpla los requisitos. No se dedica tiempo ni esfuerzo a modificar ni reparar una instancia existente. En su lugar, la imagen se reconfigura según sea necesario cuando se implementa una nueva instancia.
Con IaaS solo paga por los recursos de computación que utilice, así que tiene sentido adoptar la mentalidad de "ganado". Aquí es donde entra en acción la infraestructura como código (IaC). La IaC es una práctica de DevOps que consiste en que el suministro de infraestructura se hace repetible utilizando scripts.
Convertir en código todos los detalles de configuración y mantenerlo en el control de fuentes al igual que el código de la aplicación significa que puede evitar los retoques manuales en entornos individuales, lo cual causaría la aparición de incoherencias.
Al igual que el software en desarrollo, la propia infraestructura puede someterse a un proceso de CI/CD para asegurarse de que funciona como se esperaba, con la ventaja de que esos cambios pueden revertirse con facilidad.
Codificar la infraestructura abre la puerta a más automatización; los entornos pueden crearse automáticamente cuando se necesitan y actualizarse desplegando una nueva configuración.
El suministro de recursos de computación prácticamente ilimitado por parte del proveedor de IaaS le permite aumentar y disminuir su capacidad según la demanda, mientras se asegura de que si una instancia falla se puede sustituir de inmediato. Esto significa que su configuración de CI/CD puede responder a los aumentos de demanda y garantizar un servicio fiable.
Tanto con IaaS como con CaaS, el mantenimiento del hardware físico, incluyendo la gestión de la capacidad de almacenamiento y de redes, así como la logística de centro de datos, los gestiona el proveedor de nube como parte de su oferta de servicios.
Esto libera a su equipo para que se pueda concentrar en optimizar sus procesos y mantenerlos seguros. Como el coste está vinculado tanto a la potencia de procesamiento como al tiempo, vale la pena pararse a hacer las tareas lo más paralelas posible, para obtener así resultados para sus desarrolladores más rápido que si se usan menos máquinas durante mucho tiempo.
Los contenedores aplican principios de IaC y le permiten hacer un uso todavía más eficaz de la infraestructura alojada en la nube. Un contenedor empaqueta el software con todas las dependencias que necesita para ejecutarse, de modo que se acabó aquello de "bueno, en mi máquina funcionaba", y el "busque las diferencias" en los detalles de configuración. Docker es una de las tecnologías de contenedores más conocidas, pero también existen otras opciones.
Al igual que las máquinas virtuales, los contenedores permiten ejecutar múltiples aplicaciones en el mismo servidor físico a la vez que las mantienen aisladas entre sí. No obstante, a diferencia de las máquinas virtuales, los contenedores no incluyen un sistema operativo, lo que reduce su huella, y no requieren una parte fija de los recursos del host. El resultado es que se pueden situar muchos más contenedores que VM en una sola máquina, lo que los hace ideales para implementar software de forma eficiente en una infraestructura alojada en la nube.
Adoptar contenedores significa empaquetar las dependencias de entorno y los detalles de configuración junto con el software en un solo artefacto que puede implementarse en cualquier máquina que proporcione el tiempo de ejecución del contenedor.
Una aplicación puede dividirse entre múltiples contenedores (como en el caso de una arquitectura de microservicios), en cuyo caso, los contenedores tienen que implementarse en la misma máquina o en clúster de máquinas en red. Se han desarrollado herramientas de orquestación de contenedores, como Kubernetes, para facilitar el trabajo con grandes números de contenedores automatizando tareas como las implementaciones, la gestión y el escalado.
El uso de contenedores en un flujo de trabajo de CI/CD simplifica en gran medida la implementación de la última compilación en diferentes etapas del proceso. El artefacto de compilación es una imagen del contenedor, que puede implementarse de forma coherente en cada entorno de pruebas antes de lanzarse a la producción.
En un proceso de CI/CD en la nube, los contenedores usan eficientemente los recursos de computación, y le permiten sacar partido de las herramientas de automatización. Puede aumentar la capacidad en momentos de gran demanda, pero ahorrar costes anulando contenedores y liberando la infraestructura subyacente cuando la demanda es menor.
Además de IaaS, algunos proveedores de la nube ahora ofrecen contenedores como servicio (CaaS), lo que permite a las organizaciones implementar contenedores directamente sin tener que gestionar la plataforma de orquestación y configurar el clúster.
Aunque un proceso de CI/CD en la nube puede ofrecer ventajas significativas en cuanto a coste de la infraestructura, escalabilidad y fiabilidad, hay que tener en cuenta algunos inconvenientes.
En primer lugar, utilizar servicios en la nube como IaaS y CaaS implica inevitablemente una curva de aprendizaje. Si todavía no es experto en estas áreas, los miembros de su equipo necesitarán tiempo para aprender o tendrá que asegurarse de poner a su disposición el conocimiento. Dicho esto, la experiencia trabajando con tecnologías en la nube es una competencia muy buscada, y dar a sus equipos la oportunidad de desarrollar estas competencias y utilizar lo último en tecnología puede ser una ventaja en cuanto a retención y contratación de personal.
Si el software en desarrollo se ha diseñado para la nube, resulta relativamente fácil utilizar microservicios, contenedores y otras prácticas nativas de la nube, para después automatizar el progreso a través del proceso de CI/CD en la nube empleando contenedores. Por otro lado, si trabaja con una arquitectura monolítica, empaquetar después su software en contenedores puede ser un desafío.
Desde luego, los contenedores no son esenciales para un proceso alojado en la nube, y puede utilizar máquinas virtuales en una infraestructura de proveedores de nube para ejecutar compilaciones y ofrecer entornos coherentes de preproducción para las pruebas. No obstante, las VM consumen más recursos que los contenedores, y los entornos tendrían que configurarse por separado.
En el contexto de la nube, el tiempo es dinero, y seguro que usted no desea pagar para que un recurso de computación se quede sin utilizar. Para que el alojamiento en la nube resulte rentable, es esencial utilizarlo de forma eficiente. Eso significa aprovechar herramientas que monitorizarán el uso y liberarán instancias inactivas tras un periodo de inactividad, o implementar esa lógica por sí mismo. Esta última opción puede requerir habilidades que su organización no tenga todavía, de modo que vale la pena investigar y sopesar las opciones.
La seguridad siempre ha sido una preocupación cuando se trata de alojar datos y servicios en la nube. Para algunas empresas, simplemente el concepto de que haya software crítico ubicado en el kit de un tercero es un obstáculo. Dicho esto, muchas organizaciones se están decidiendo por utilizar nubes públicas para alojar tanto sus servicios activos como sus procesos de implementación, desde el repositorio de control de fuentes a los entornos de servidor de integración continua y de pruebas.
Para mitigar los riesgos, es esencial comprender los vectores de ataque potenciales, crear protecciones en su proceso para evitar que lo utilicen actores maliciosos para acceder a su sistema activo, e implementar buenas prácticas en torno a la gestión de credenciales, datos de pruebas y control de acceso.
Mientras que la infraestructura como código, los contenedores y la orquestación de contenedores tienen sus raíces en la tecnología en la nube, pueden utilizarse también en infraestructura híbrida.
Se pueden utilizar las mismas herramientas en nubes privadas y en infraestructura in-situ, con la reserva de que existe un límite en hasta dónde puede escalar un proceso. Si su organización está planeando la futura transición a una infraestructura alojada en la nube, adoptar herramientas nativas de la nube desde el principio le permitirá desarrollar experiencia con antelación y facilitar la transición.
La práctica de infraestructura como código nativa en la nube aporta múltiples ventajas a la integración y a la implementación continuas en infraestructura local. Para empezar, configurar un entorno nuevo es mucho más rápido, puesto que solo tiene que ejecutar un script.
Codificar la creación de entornos también ofrece coherencia, para que pueda asegurar la paridad entre su configuración de producción y entornos de preproducción, tanto si es para la seguridad, rendimiento o testeo de IU, como si se trata de sandboxes para los equipos de asistencia y ventas. Manteniendo los archivos de configuración de infraestructura en el control de fuentes, el equipo cuenta con una ruta de seguimiento para auditar qué cambios que se han introducido y cuándo, lo cual puede hacer que depurar problemas de entorno resulte mucho más sencillo.
En algunos casos, las organizaciones deciden utilizar recursos en la nube para etapas en particular de su proceso de implementación. Por ejemplo, las pruebas de carga y rendimiento pueden requerir muchos recursos, y puede resultar más rentable crear un entorno temporal en la nube para poder llevarlas a cabo. Al plantearse este enfoque, es importante tener en cuenta la potencial complejidad y el tiempo que implica trasladar su compilación a una infraestructura distinta.
Mientras que el proceso de CI/CD ofrece ventajas significativas en cuanto a velocidad de entrega y aseguramiento de la calidad, la infraestructura disponible es un factor limitante en lo que a velocidad y resultados se refiere. Trasladar su proceso a la nube, ya no tiene que escoger entre suministrar suficientes servidores para enfrentarse a picos de demanda y el coste de comprar y gestionar máquinas que no se utilicen constantemente.
Las tecnologías y prácticas nativas de la nube no solo permiten un uso eficiente de infraestructura alojada en la nube, sino que también cuentan con técnicas mejoradas de integración e implementación continuas. Estos mismos enfoques también pueden aplicarse a la infraestructura local, para que la entrega de software sea más rápida y fiable.