¿Qué es DevOps?

En un modelo tradicional de desarrollo de software, los desarrolladores escriben grandes cantidades de código para nuevas funciones, productos, correcciones de errores y similares, y luego pasan su trabajo al equipo de operaciones para su implementación, normalmente a través de un sistema automatizado de tickets. El equipo de operaciones recibe esta solicitud en su cola, prueba el código y lo prepara para la producción, un proceso que puede llevar días, semanas o meses. Con este modelo tradicional, si las operaciones se topan con algún problema durante la implementación, el equipo envía un ticket a los desarrolladores para decirles qué deben solucionar. Finalmente, una vez resueltas estas idas y venidas, la carga de trabajo pasa a producción.

Este modelo convierte la entrega de software en un proceso largo y fragmentado. Los desarrolladores suelen ver las operaciones como un obstáculo que ralentiza los plazos de sus proyectos, mientras que los equipos de operaciones se sienten como el vertedero de los problemas de desarrollo.

DevOps resuelve estos problemas uniendo a los equipos de desarrollo y operaciones a lo largo de todo el proceso de entrega del software, lo que les permite descubrir y solucionar antes los problemas, automatizar las pruebas y la implementación y reducir el tiempo de comercialización.

Para entender mejor qué es DevOps, entendamos primero qué no es DevOps.

 

DevOps no es

  • Una combinación de los equipos de desarrollo y operaciones: Sigue habiendo dos equipos; sólo que funcionan de forma comunicativa y colaborativa.
  • Su propio equipo independiente: No existe tal cosa como un "ingeniero DevOps". Aunque algunas empresas pueden nombrar un equipo DevOps como piloto cuando intentan hacer la transición a una cultura DevOps, DevOps se refiere a una cultura en la que los desarrolladores, los probadores y el personal de operaciones cooperan a lo largo de todo el ciclo de vida de entrega del software.
  • Una herramienta o un conjunto de herramientas: Aunque hay herramientas que funcionan bien con un modelo DevOps o que ayudan a promover la cultura DevOps, DevOps es en última instancia una estrategia, no una herramienta.
  • Automatización: Aunque es muy importante para una cultura DevOps, la automatización por sí sola no define DevOps.

 

Definición de DevOps

En lugar de que los desarrolladores codifiquen enormes conjuntos de funciones antes de entregarlos ciegamente a Operaciones para su implementación, en un modelo DevOps, los desarrolladores entregan con frecuencia pequeñas cantidades de código para su comprobación continua. En lugar de comunicar los problemas y las solicitudes a través de un sistema de tickets, los equipos de desarrollo y operaciones se reúnen con regularidad, comparten análisis y son copropietarios de los proyectos de principio a fin.

 

Canalización CI/CD

DevOps es un ciclo de integración continua y entrega continua (o implementación continua), también conocido como conducto CI/CD. El canal de CI/CD integra a los equipos de desarrollo y operaciones para mejorar la productividad mediante la automatización de la infraestructura y los flujos de trabajo, así como la medición continua del rendimiento de las aplicaciones. Tiene este aspecto:

Etapas y flujo de trabajo DevOps del oleoducto CI/CD
Figura 1: Etapas y flujo de trabajo DevOps del oleoducto CI/CD
  • La integración continua requiere que los desarrolladores integren el código en un repositorio varias veces al día para realizar pruebas automatizadas. Cada comprobación se verifica mediante una compilación automatizada, lo que permite a los equipos detectar los problemas con antelación.
  • La entrega continua, que no debe confundirse con la implementación continua, significa que la canalización CI está automatizada, pero el código debe pasar por comprobaciones técnicas manuales antes de implementarse en producción.
  • La implementación continua lleva la entrega continua un paso más allá. En lugar de comprobaciones manuales, el código pasa las pruebas automatizadas y se implementa automáticamente, lo que proporciona a los clientes acceso instantáneo a las nuevas funciones.

 

DevOps y seguridad

Uno de los problemas de DevOps es que la seguridad a menudo queda relegada a un segundo plano. Los desarrolladores se mueven con rapidez y sus flujos de trabajo están automatizados. La seguridad es un equipo aparte, y los desarrolladores no quieren ralentizarse por las comprobaciones y peticiones de seguridad. Como resultado, muchos desarrolladores implementan sin pasar por los canales de seguridad adecuados e inevitablemente cometen errores de seguridad perjudiciales.

 

Para solucionar esto, las organizaciones están adoptando DevSecOps. DevSecOps toma el concepto que subyace a DevOps -la idea de que los desarrolladores y los equipos de TI deben colaborar estrechamente, en lugar de hacerlo por separado, a lo largo de la entrega del software- y lo amplía para incluir la seguridad e integrar comprobaciones automatizadas en todo el canal de CI/CD. Esto soluciona el problema de que la seguridad parezca una fuerza externa y permite a los desarrolladores mantener su velocidad sin comprometer la seguridad de los datos.

 

Preguntas frecuentes sobre DevOps

La infraestructura como código (IaC) implica la administración y el aprovisionamiento de la infraestructura de TI mediante archivos de definición legibles por máquina. Las plataformas de IaC como Terraform y AWS CloudFormation permiten automatizar la configuración de la infraestructura, lo que posibilita implementaciones coherentes y repetibles. Al tratar la infraestructura como software, las organizaciones pueden aplicar el control de versiones, las pruebas y las prácticas de integración continua a los cambios en la infraestructura, mejorando la agilidad y la fiabilidad.
La integración continua (IC) es una práctica de desarrollo en la que los desarrolladores fusionan con frecuencia los cambios de código en un repositorio central, desencadenando construcciones y pruebas automatizadas. CI detecta los errores de integración lo antes posible, mejorando la calidad del software y reduciendo el tiempo de entrega de nuevas actualizaciones. Constituye la base para la entrega continua de aplicaciones a los entornos de producción.
La entrega continua (CD) amplía la integración continua al implementar automáticamente todos los cambios de código en un entorno de pruebas o de producción tras la fase de compilación. El CD permite a los desarrolladores asegurarse de que su código se encuentra siempre en estado de implementación, lo que facilita una entrega más fluida y rápida a los usuarios finales. Tiende un puente entre el desarrollo y las operaciones, fomentando un ciclo de vida del software más ágil y con mayor capacidad de respuesta.
La implementación continua es la puesta en producción automática de los cambios validados, sin necesidad de intervención manual. Es un paso más allá de la entrega continua, en la que cada cambio que supera todas las etapas de la cadena de producción se pone a disposición de los clientes. Esta práctica acelera el bucle de retroalimentación y mejora la eficacia y fiabilidad del proceso de liberación.
La automatización funciona ejecutando instrucciones predefinidas para administrar tareas sin intervención humana. En la seguridad en la nube, las herramientas de automatización implementan políticas, buscan vulnerabilidades y responden a las amenazas, agilizando las operaciones de seguridad. Interactúan con las API de la nube, empleando secuencias de comandos y flujos de trabajo para el aprovisionamiento de recursos, el cumplimiento de la normativa y la orquestación eficaz de procesos complejos.
La administración de la configuración se refiere al mantenimiento de los sistemas en un estado deseado y coherente. Realiza un seguimiento de los cambios y las configuraciones del software y el hardware para evitar desviaciones y alteraciones no autorizadas. Herramientas como Ansible, Puppet y Chef automatizan los cambios de configuración en todo el entorno informático, garantizando que los sistemas estén configurados de forma correcta y uniforme.
La orquestación automatiza la administración de tareas y flujos de trabajo complejos en múltiples sistemas y servicios. Coordina las tareas automatizadas en un proceso cohesionado, gestionando las interdependencias y secuenciando las acciones. En entornos de nube, las herramientas de orquestación como Kubernetes gestionan las aplicaciones en contenedores, encargándose de la implementación, el escalado y la red para optimizar la utilización de los recursos y mantener el rendimiento de las aplicaciones.
Los microservicios son un enfoque de diseño en el que las aplicaciones se componen de pequeños servicios independientes que se comunican a través de API bien definidas. Cada servicio se centra en una única capacidad empresarial, ejecuta su propio proceso y se puede implementar de forma independiente. Esta arquitectura aumenta la escalabilidad, acelera los ciclos de desarrollo y mejora el aislamiento de fallos.
La supervisión y el registro son fundamentales para mantener el rendimiento operativo y la seguridad en los entornos de nube. La supervisión proporciona visibilidad en tiempo real de la infraestructura, las aplicaciones y los servicios, lo que permite una administración proactiva de la salud y el rendimiento del sistema. El registro registra eventos y puntos de datos, que son vitales para la resolución de problemas, el análisis forense y la auditoría de cumplimiento. Juntos, permiten una rápida detección y respuesta a los incidentes, garantizando una disponibilidad y seguridad continuas.
Los sistemas de control de versiones rastrean y administran los cambios en el código, los documentos u otras colecciones de información. Facilitan la colaboración entre los equipos de desarrollo, mantienen un historial de cambios y permiten volver a versiones anteriores en caso necesario. El control de versiones es fundamental para administrar las bases de código, reducir los conflictos y garantizar que las implementaciones sean coherentes y rastreables.
Entre las estrategias de implementación habituales se incluyen las implementaciones azul-verde, en las que dos entornos idénticos se ejecutan en paralelo, y uno sirve como entorno activo mientras que el otro aloja la nueva versión. Las versiones Canary implementan los cambios de forma incremental en un pequeño subconjunto de usuarios antes de proceder a una implementación más amplia. Las actualizaciones continuas sustituyen gradualmente las instancias de la versión antigua por la nueva, reduciendo el tiempo de inactividad y el riesgo.
La contenedorización encapsula una aplicación y sus dependencias en un contenedor que puede ejecutarse en cualquier entorno informático. Este enfoque proporciona una alternativa ligera a las máquinas virtuales, ofreciendo eficacia y coherencia en los entornos de desarrollo, pruebas y producción. La contenedorización simplifica la implementación, el escalado y la administración de las aplicaciones, aislándolas de la infraestructura subyacente.
Docker se utiliza para crear, implementar y ejecutar aplicaciones mediante el uso de contenedores. Permite a los desarrolladores empaquetar una aplicación con todas sus dependencias en una unidad estandarizada. Docker proporciona las herramientas y la plataforma para gestionar el ciclo de vida de los contenedores, incluida la creación de imágenes, la orquestación de contenedores, el escalado y la red.
Kubernetes orquesta las aplicaciones en contenedores, gestionando su implementación, escalado y operaciones. Garantiza que el estado deseado de las aplicaciones coincida con el estado real en el entorno de nube. Kubernetes automatiza el equilibrio de carga, supervisa el estado de las aplicaciones y proporciona capacidades de autorreparación reiniciando o sustituyendo los contenedores que fallan o no responden. También se encarga de la detección de servicios y puede administrar la configuración y la información sensible como secretos.
Una cadena de construcción consiste en una serie de procesos automatizados para compilar código, ejecutar pruebas e implementar software. Comienza con la recuperación de código desde el control de versiones, seguida de la creación de ejecutables, la ejecución de pruebas automatizadas y la implementación en diversos entornos. El pipeline está diseñado para proporcionar retroalimentación en cada etapa, garantizando la calidad del código y agilizando el camino desde el desarrollo hasta la producción.
La automatización de las pruebas acelera la validación de la funcionalidad, la seguridad y el rendimiento del software. Permite realizar pruebas repetitivas y exhaustivas sin esfuerzo manual, mejorando la coherencia y la cobertura. Las pruebas automatizadas pueden ejecutarse en varios entornos y dispositivos simultáneamente, lo que proporciona información rápida a los desarrolladores y reduce el tiempo de comercialización de las nuevas versiones.
Un repositorio de código es un lugar de almacenamiento de código y sus archivos asociados, que facilita el control de versiones y la colaboración. Actúa como eje central para el almacenamiento, seguimiento y administración de los cambios en el código base. Los repositorios admiten la ramificación y la fusión, lo que permite a los desarrolladores trabajar en características, correcciones o experimentos en entornos aislados antes de integrar los cambios en el código principal.
La administración de versiones abarca la planificación, programación y control de las construcciones de software a través de diferentes etapas y entornos. Incluye la administración del proceso de lanzamiento, la coordinación con las partes interesadas, la garantía del cumplimiento de los criterios de lanzamiento y la implementación del software en producción. El objetivo del proceso es ofrecer nuevas funciones y correcciones de forma fiable y eficaz, con una interrupción mínima de los servicios.
La metodología ágil hace hincapié en el desarrollo iterativo, la colaboración con el cliente y la capacidad de respuesta al cambio. Aboga por las versiones pequeñas e incrementales, la retroalimentación continua y la planificación adaptativa. Los principios ágiles promueven la colaboración entre equipos multifuncionales, un ritmo de desarrollo sostenible y prácticas reflexivas para mejorar continuamente los procesos y los productos.
La arquitectura sin servidor permite a los desarrolladores crear y ejecutar aplicaciones sin necesidad de administrar la infraestructura del servidor. Abstrae los servidores, lo que permite a los desarrolladores centrarse únicamente en escribir código. Los proveedores de la nube gestionan el entorno de ejecución, administrando dinámicamente la asignación de recursos. Las arquitecturas sin servidor escalan automáticamente en función de la demanda y los usuarios sólo pagan por el tiempo de computación consumido.
El ajuste del rendimiento implica la optimización de la configuración del sistema y del código para mejorar métricas de rendimiento como el tiempo de respuesta, el rendimiento y el uso de recursos. Requiere la creación de perfiles y la supervisión de las aplicaciones para identificar los cuellos de botella, seguida del ajuste de las configuraciones, la optimización del código y la garantía de una asignación eficaz de los recursos para mejorar la eficiencia general del sistema.
La resistencia y la fiabilidad se garantizan mediante el diseño de sistemas tolerantes a fallos que puedan manejar y recuperarse de los fallos sin interrupción del servicio. La implementación de la redundancia, los mecanismos de conmutación por error, la comprobación periódica de los procedimientos de recuperación en caso de desastre y la supervisión en tiempo real contribuyen a la solidez de la arquitectura del sistema. Estas prácticas ayudan a mantener un rendimiento y una disponibilidad constantes a pesar de las tensiones del sistema o de problemas inesperados.