Quantcast
Channel: Think Big
Viewing all articles
Browse latest Browse all 3628

¿Qué significa que mi aplicación sea Cloud Native?

$
0
0

El término Cloud Native es algo que va más allá de mover las aplicaciones alojadas en un data center a una infraestructura proporcionada por un proveedor Cloud, sea Cloud pública o privada.

Esto, que se conoce como “lift & shift” de aplicaciones a la nube, no es más que un proceso en el que nuestras aplicaciones dejan de correr en la infraestructura on-premises de nuestro data center para pasar a ejecutarse en una infraestructura Cloud, aunque en muchas ocasiones esto sucede sin ningún tipo de rediseño en la arquitectura de dichas aplicaciones, ni en las prácticas de construcción, despliegue y operación de las mismas.

Obviamente, incluso en ese caso, podremos aprovechar unos beneficios básicos “out of the box” al usar una infraestructura que tiene una mayor redundancia, facilidades para realizar backups, o que se mantiene actualizada con los últimos parches de seguridad, entre otras ventajas.

Pero tenemos que tener en cuenta que nuestra aplicación no se va a convertir en una aplicación Cloud Native por el hecho de desplegarla en la nube: si tienes un sistema que es una castaña y lo despliegas en un cluster EKS de kubernetes de AWS… tendrás una castaña ‘kubernetizada’.

Nuestra aplicación no se va a convertir en una aplicación Cloud Native solo por el hecho de desplegarla en una infraestructura Cloud.

Cloud ha cambiado las reglas del juego

No hace tanto era necesario hacer un buen estudio de las capacidades (potencia de computación, conectividad, almacenamiento…) que necesitaríamos para que nuestro desarrollo ofreciera un servicio con garantías. Al menos de entrada, porque después, periódicamente, había que evaluar el crecimiento del sistema y comprar más hardware si no queríamos que nuestros clientes nos abandonaran cuando aquello dejara de funcionar.

Hoy en día es posible hacer todo esto con un par de clics en una consola de administración. O mejor aún, con una llamada a una API (Application Program Interface) que nos permite además automatizar este proceso. La tecnología Cloud pone a nuestra disposición las capacidades de cómputo, red, almacenamiento así como otros servicios más avanzados (bases de datos, sistemas de colas de mensajes, analítica de datos, etc.) como abstracciones definidas por software dando lugar a lo que se conoce como Cloud Computing.

Cloud Computing viene a ser, en definitiva, esos recursos de computación que necesitamos para construir nuestros sistemas (CPU, almacenamiento, red, etc.) pero disponibles en la red. Además, los podemos ir consumiendo bajo demanda, ofreciendo una eficiencia en costes y una escalabilidad nunca vistas antes.

Cloud Native es consecuencia de la necesidad de escalar

Está claro entonces que Cloud ha cambiado la tecnología sobre la cual construimos y desplegamos nuestros sistemas. Pero, ¿por qué motivo? Dar un único motivo quizás sería un poco arriesgado, aunque lo que sí podemos afirmar es que Cloud Computing resuelve un problema de escalabilidad.

En los últimos años, las soluciones digitales —plataformas de gaming, streaming de video, música, redes sociales, etc.— se consumen cada vez más desde distintos dispositivos. No solo desde ordenadores, también desde teléfonos móviles, tablets, smart TV e, incluso, dispositivos IoT (Internet of Things) que han ido creado diferentes escenarios de acceso a nuestros sistemas.

El objetivo de las aplicaciones Cloud Native es aprovechar las ventajas de la nube para mejorar la escalabilidad, el rendimiento y la eficiencia

Escenarios donde el número de peticiones y el volumen de datos va cambiando. Es decir, escenarios que requieren que nuestro sistema siga funcionando correctamente ante cambios de demanda de recursos, en definitiva, escenarios que requieren que nuestro sistema sea “escalable”.

Sin embargo, esto no es gratis: la gestión de esta escalabilidad en nuestros servicios se vuelve más compleja, los métodos tradicionales ya no sirven, necesitamos otra forma de hacer las cosas. Al igual que en su día surgieron los PC —y con ellos las arquitecturas cliente/servidor necesarias para aprovechar su capacidad de cómputo— descargando así a los viejos “mainframes” de hacer todo el trabajo de nuestros sistemas.

Aparejado a este cambio tecnológico que llamamos Cloud Computing, y para dar respuesta a la gestión de esa escalabilidad, surgen nuevos patrones de arquitectura y también nuevas prácticas para operar nuestros sistemas dando lugar al término Cloud Native.

«Los sistemas Cloud Native están diseñados con la capacidad de crecer o decrecer de forma dinámica.»

Por eso, cuando decimos que un sistema o una aplicación es Cloud Native, realmente no nos estamos refiriendo a si se ejecuta en Cloud. Sino a cómo ha sido diseñado para ejecutarse y operarse de forma correcta sobre tecnología Cloud Computing, beneficiándose además de las ventajas de dicha tecnología.

Los sistemas Cloud Native se diseñan de tal forma que tengan la capacidad de crecer/decrecer de forma dinámica y de que se puedan actualizar. Y todo ello sin pérdida de servicio, lo que se conoce como «zero downtime». Zero downtime no significa un uptime perfecto, sino cumplir un objetivo por el cual no se percibe interrupción del servicio a lo largo del funcionamiento de una aplicación[1].

Cloud Native según la CNCF (Cloud Native Computing Foundation)

Hoy en día los usuarios no tenemos la misma paciencia que hace años, cuando veíamos totalmente normal que una página web tardase unos segundos en cargar o que un vídeo en streaming tuviera cierta latencia e incluso que se detuviera de vez en cuando. 

Cada día los servicios son más sofisticados y los usuarios demandan sistemas que funcionen con una percepción excelente. Ya no son tan pacientes. El nivel de escalabilidad proporcionado por la tecnología Cloud hace posible que aplicaciones de redes sociales, mensajería instantánea, streaming de vídeo o de audio permitan que millones de usuarios puedan conversar, subir fotos, vídeos, ver películas o escuchar música incluso al mismo tiempo.

Los usuarios no quieren fallos y demandan que los servicios estén funcionado bien continuamente. Y esto es complicado en un entorno tan cambiante como es el de Cloud.

La CNCF habla del término Cloud Native como un conjunto de tecnologías que nos permite construir y ejecutar aplicaciones escalables en entornos modernos y dinámicos como plataformas Cloud públicas, privadas e híbridas y multicloud.

También nos dice que los sistemas resultantes son débilmente acoplados, resilientes, administrables, observables y que, además, con una buena automatización van a permitir que podamos introducir cambios de forma frecuente y predecible con poco esfuerzo.

Atributos de Cloud Native para construir sistemas fiables y resilientes

En un entorno tan cambiante como es Cloud, va a ser necesario que diseñemos nuestros sistemas para que sean capaces de reaccionar ante posibles errores. Si conseguimos que nuestros sistemas tengan estos atributos que define la CNCF para las aplicaciones Cloud Native (escalables, débilmente acoplados, resilientes, maleables y observables), seremos capaces de mantener a nuestros clientes satisfechos al proporcionarles sistemas que funcionan de forma continua.

Si consideramos cada uno de estos atributos podremos ver cómo nos ayudan a conseguir que nuestros sistemas sean fiables y funcionen prácticamente sin interrupciones:

  • Escalabilidad: si diseñamos nuestros sistemas para que sean capaces de funcionar sin estado, conseguiremos que nuestros sistemas sean escalables y por tanto serán capaces de adaptarse ante un crecimiento inesperado de demanda de recursos, es una forma de “prevenir fallos”.
  • Acoplamiento débil: que nuestros sistemas estén débilmente acoplados evitando compartir dependencias como podría ocurrirnos cuando diseñamos un sistema basado en microservicios y terminamos generando un monolito distribuido (donde cambios en un microservicio no pueden ser hechos sin cambios en otros), permitirá que puedan evolucionar y escalar aquellos componentes o servicios (o microservicios) que se necesiten de forma independiente y, además, también logrará prevenir fallos derivados de los cambios necesarios en múltiples componentes si estuvieran acoplados.
  • Resiliencia: mediante la redundancia de componentes o la aplicación de ciertos patrones que eviten la propagación en cascada de fallos podemos hacer que nuestros sistemas sean más resilientes y por tanto puedan seguir funcionando aún cuando ocurran ciertos fallos, es decir, conseguiremos que nuestro sistema sea tolerante a fallos.
  • Administrable: si diseñamos nuestros sistemas de modo que puedan ser fácilmente configurables, conseguiremos poder cambiar ciertos comportamientos del mismo sin necesidad de desplegar una nueva versión del mismo, incluso podríamos eliminar posibles errores que hayan surgido.
  • Observable: por último, deberíamos de tomar medidas (métricas) de distintos indicadores de nuestros sistemas que podamos observar continuamente para poder predecir errores o comportamientos no deseados y actuar antes de que ocurran.

Cloud Native permite gestionar toda la complejidad que supone tener esa capacidad casi ilimitada que proporciona Cloud Computing.

Mediante la aplicación de patrones de diseño y prácticas de operación, conseguimos que nuestros sistemas sean incluso más fiables que la infraestructura Cloud sobre la que se ejecutan (por ejemplo un failover entre dos regiones de una Cloud) al mismo tiempo que el usuario tenga una confianza plena en el funcionamiento de nuestro sistema.

* * *

[1] Sobre la capacidad de planificar en base a la percepción de calidad del servicio por parte del usuario, existen una serie de libros escritos por ingenieros de Google —conocidos como SRE o Ingenieros de Resiliencia del Servicio— que extienden el concepto de SLA y al mismo tiempo que añaden nuevos como SLI o SLO.

Fotografía principal: Shahadat Rahman / Unsplash

The post ¿Qué significa que mi aplicación sea Cloud Native? appeared first on Think Big.


Viewing all articles
Browse latest Browse all 3628

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>