1 La necesidad de escenarios intermedios de migración a Cloud Native

Hace unos días empezamos una serie de post, sobre virtualización y contenedores en Kubernetes: despliegue y networking, donde profundizamos en esta problemática.

En la transformación digital, los roadmaps incluyen estrategias de transición como "lift and shift" o "improve and move" para minimizar riesgos en la migración hacia la nube. Sin embargo, desafíos como soluciones propietarias, aplicaciones complejas o regulaciones pueden exigir una transición más suave.

Migrar completamente a plataformas basadas en contenedores puede no ser siempre posible o recomendable, siendo pragmáticos con la adopción de Kubernetes. La estrategia usual, que fuerza la migración a contenedores, podría resultar en máquinas virtuales disfrazadas de contenedores y no aprovechar los beneficios de la plataforma cloud native.

Una estrategia más razonable implica una mezcla de servicios virtualizados y contenedores, permitiendo diferentes velocidades de transición y una adopción segura de la nube. Este enfoque híbrido plantea el desafío de gestionar ambas tecnologías.

Aunque puede ser tentador desplegar una plataforma de virtualización junto a Kubernetes, esta arquitectura mixta puede resultar en una gestión duplicada. Esto impacta la velocidad de entrega y aumenta la complejidad. Para aplicaciones híbridas, el despliegue queda dividido en dos plataformas separadas.

Para aplicaciones híbridas, el despliegue queda dividido en dos plataformas separadas.

Kubernetes como plataforma única de virtualización y contenedores: KubeVirt

KubeVirt es un operador de Kubernetes que permite desplegar y administrar máquinas virtuales en Kubernetes, extendiendo sus capacidades para gestionar cargas virtualizadas, permitiendo así combinar máquinas virtuales y contenedores en un clúster de Kubernetes.

KubeVirt es un operador de Kubernetes que permite desplegar y administrar máquinas virtuales en Kubernetes.

Gracias a esta tecnología, es posible simplificar la gestión y eliminar la necesidad de plataformas separadas para los servicios virtualizados y los contenedores. El dominio de una aplicación cloud native híbrida se circunscribe a la Kubernetes, permitiendo una gestión unificada de la aplicación.

Aplicación que se circunscribe a la Kubernetes

Las ventajas de KubeVirt son numerosas, pero destacan las siguientes:

Retomando el ejemplo aplicación cloud native híbrida

En el post anterior se definió una aplicación cloud native híbrida con el objetivo de resolver el despliegue completo de la misma, donde convivirán contenedores con máquinas virtuales.

Una aplicación cloud native híbrida es aquella cuyo dominio está compuesto de servicios virtualizados y contenedores.

La aplicación tiene dos componentes fundamentales:

En este escenario, la aplicación python ya está migrada a contenedores, pero la base de datos aún está virtualizada.

Aplicación MongoDB y Python

Implementación con Kubevirt

Nota: Esta es una aplicación de ejemplo desarrollada para la demostración de este caso de uso. No se han aplicado prácticas de seguridad o gestión de la configuración, entre otros asuntos.

En la primera parte de esta serie de post resolvimos tanto el despliegue conjunto como la comunicación entre los componentes de la aplicación cloud native híbrida.

El escenario final simplificado era el siguiente:

Escenario simplificado

Protegiendo el acceso a la base de datos

En este escenario, todos los pods dentro del namespace podrían comunicarse con la base de datos virtualizada, pero podríamos necesitar proteger aún más este acceso añadiendo restricciones más específicas para controlar qué elementos del clúster pueden comunicarse con la base de datos virtualizada. Por ejemplo:

Para lograrlo podemos emplear recursos nativos de Kubernetes, como las NetworkPolicy.

Al definir una NetworkPolicy, se puede especificar explícitamente qué tráfico se permite entre los pods y, en este caso concreto, garantizar que solo la aplicación Python pueda comunicarse con la base de datos virtualizada.

Utilizar NetworkPolicies es una buena práctica de seguridad, ya que proporciona un mayor control sobre las comunicaciones entre los pods en el clúster y ayuda a proteger los recursos y aplicaciones frente a accesos no autorizados o no deseados.

Network Policy

Definamos una política para impedir que los pods del mismo namespace que no cumplan con el criterio de la regla Ingress accedan a la base de datos.

La regla de Ingress definida solo permite la comunicación desde pods que cumplen el criterio definido incluso dentro del mismo namespace.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: mongodb-network-policy
  namespace: kubevirt-networking-poc
spec:
  podSelector:
    matchLabels:
      kubevirt.io/domain: mongodb-vm
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: kubevirt-networking-poc
    ports:
    - protocol: TCP
      port: 27017

La especificación del recurso NetworkPolicy incluye la siguiente información:

Explicación del flujo de red desde una petición externa

Cuando un usuario realiza una solicitud a la URL de la aplicación web, el flujo de red en términos de comunicación entre los componentes del despliegue es el siguiente:

Donde se puede apreciar cómo la Network Policy regula la comunicación y permite la conexión entre el Pod de la aplicación Python y el servicio virtualizado Mongodb.

Resultado final

El resultado final para un usuario no varía respecto a lo que vimos en la primera parte.

Cuando un usuario invoque el endpoint que expone el servicio asociado a la aplicación Python, recibirá esta respuesta:

Cuando se invoque el endpoint, se recibe esta respuesta.

Show me the code!

Todo el código está disponible en este repositorio.

2 Ventajas de la convivencia de virtualización y contenedores en Kubernetes

Combinación de recursos de Kubernetes con virtualización

Esta serie de posts pretende demostrar cómo unificar la operación de una aplicación cloud native híbrida en Kubernetes.

En este caso, hemos añadido una NetworkPolicy para aplicar políticas más específicas de acceso a la base de datos virtualizada.

Esta NetworkPolicy nos permite regular el acceso de diferentes formas, bien por namespaces, bien por selección de pods vía etiquetas

KubeVirt dispone también de documentación y recomendaciones sobre el uso de Network Policies en el contexto de la virtualización.

Conclusiones

Evolución de aplicaciones cloud native híbridas

¿Queréis profundizar aún más en el uso de virtualización en Kubernetes? Entonces, no os perdáis el próximo post en que añadiremos más complejidad a esta aplicación de ejemplo para abordar temas como el uso de certificados, observabilidad o políticas.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete

Estamos comprometidos.

Tecnología, personas e impacto positivo.