Skupper: Comunica tus Aplicaciones de nube híbrida en k8s

Image by Peggy und Marco Lachmann-Anke from Pixabay

El tópico de interés en la organizaciones que desarrollan software es que todos sus nuevos servicios sean «nativos de nube» para que estos puedan aprovechar al máximo las capacidades que les brindan las nubes como facil despliegue, automatización y junto con ello la capacidad de poder poner componentes de estos nuevos servicios en diferentes lugares.

En el desarrollo de servicios o aplicaciones nativos de nube, buscando tener más resiliencia de nuestros servicios los separamos de acuerdo a como deseamos que nuestros servicios escalen.Buscamos que nuestros servicios de frontend se encuentren separados del backend. Esto permite que el frontend se despliegue cerca de los usuarios; los backends se escalen para manejar la cargas de trabajo bajo demanda; y los datos se mantengan seguros dentro de la red privada.

Una estrategia de multinube también puede crear importantes desafíos en la creación de redes. Por ejemplo, con un enfoque de nube única, suena muy sencillo ya que solo necesita gestionar una conexión entre la red en su datacenter y una plataforma de nube. Pero que sucede con un sistema multinube, ahora debe preocuparnos la coordinación de conexiones entre múltiples plataformas y su red en su datacenter, y potencialmente entre las propias plataformas de la nube donde este desplegando su aplicación.

Con base en lo anterior existen retos importantes a considerar y uno de ellos es como haremos la comunicación de los servicios separados en diferentes zonas de disponibilidad o en datacenters dispersos por el mundo, es ahí donde pensamos que la mejor solución es utilizar una «VPN» para asegurar la conectividad del datacenter a la nube, entonces ahora nos encontramos que también hay que tener dispositivos específicos para que sean compatibles y además reglas muy puntuales de firewall para permitir la conectividad.

Pero esa es solo una posible solución al esquema de comunicación multinube, existen otras opciones que pueden ser más sencillas una de ellas son las Virtual Application Networks.

Virtual Application Network (VAN)

Una Virtual Application Network (VAN) es una red de capa de aplicación que se superpone a la basada en TCP/IP. Una VAN puede ser tan pequeña como un simple portátil o tan grande como una red global que abarca zonas horarias y continentes. Una VAN puede ser configurada rápidamente por un desarrollador no privilegiado y su topología puede ser añadida y cambiada con la misma facilidad. Las aplicaciones escritas para usar protocolos existentes como HTTP, gRPC, AMQP, o cualquier cosa que corra sobre TCP o UDP puede correr en una VAN sin modificación.

Una VAN se establece desplegando un router VAN en cada sitio que será parte de la aplicación distribuida y estableciendo conexiones seguras entre pares de sitios. Un sitio puede ser una LAN en un centro de datos, un único host o un namespace en un clúster de Kubernetes

Skupper: VAN para tus clústeres de Kubernetes

El Proyecto Skupper es una implementación libre y de código abierto de una VAN construida para Kubernetes

¿Qué es Skupper?, el mismo proyecto se define como:

«Skupper is a layer seven service interconnect. It enables secure communication across Kubernetes clusters with no VPNs or special firewall rules.«

En pocas palabras Skupper permite que tus aplicaciones desplegadas en diferentes sitios o nubes sobre Kubernetes se comuniquen como si estuviesen desplegadas en un mismo sitio.

overview-clouds
Image by skupper.io

Ventajas de usar skupper para comunicar tus aplicaciones en un entorno multinube:

  • Permite comunicar tus servicios sin necesidad de exponerlos al público.
  • Permite un nivel de seguridad usando mutualTLS.
  • Permite al desarrollador poder habilitar los canales de comunicación sin privilegios de administración de k8s.
  • No necesitas VPN para comunicar tus diferentes servicios de nube.
  • Debido a que la comunicación simula estar en el mismo clúster no requiere modificar su aplicación.

Ahora probemos skupper

En el siguiente ejemplo estaremos desplegando una base de datos Postgresql dentro de un clúster local en minikube que simulara el centro de datos del cliente y en otro clúster con Red Hat Openshift desplegado en AWS desplegaremos un servicio que consumirá la información dentro de la mencionada Base de Datos

Los archivos necesarios para ejecutar la demo se encuentran en https://github.com/mikeintoch/skupper-example.git

Para poder utilizar skupper lo primero que debemos de hacer es instalar el CLI el cual puedes descargar desde aquí.

Paso 1: Crear los namespace correspondientes

minikube $ kubectl create namespace customer-database
minikube $ kubectl config set-context --current --namespace customer-database
Openshift $ kubectl create namespace customer-service
Openshift $ kubectl config set-context --current --namespace customer-service

Paso 2: Despliegue de Virtual Application Network (VAN)

minikube $ skupper init --site-name private-cloud
Skupper is now installed in namespace 'customer-database'.  Use 'skupper status' to get more information.
Openshift $ skupper init --site-name public-cloud
Skupper is now installed in namespace 'customer-service'.  Use 'skupper status' to get more information.

Verificar la instalación

Verificar el estado del servicio de skupper en cada namespace

minikube $ skupper status
Skupper is enabled for namespace "customer-database" in interior mode. It is not connected to any other sites. It has no exposed services.
Openshift $ skupper status
Skupper is enabled for namespace "customer-service" in interior mode. It is not connected to any other sites. It has no exposed services.

Paso 3. Conectar los namespaces

Los namespaces están listos con los servicios que aprovisiona skupper pero aún no se encuentran conectados es necesario ejecutar un token de conexión para confianza entre los dos namespaces.

Genera un nuevo token

Openshift $ skupper connection-token $HOME/public-token.yaml

Utiliza el token para crear una conexión entre los dos namespaces

minikube $ skupper connect $HOME/public-token.yaml
Skupper configured to connect to "<SKUPPER_ROUTER_HOSTNAME>":443 (name=conn1)

Verificar el estado de la conexión

minikube $ skupper status
Skupper is enabled for namespace "customer-database" in interior mode. It is connected to 1 other site. It has no exposed services.
Openshift $ skupper status
Skupper is enabled for namespace "customer-service" in interior mode. It is connected to 1 other site. It has no exposed services.

Paso 4. Despliegue del servicio de base de datos de Postgresql

minikube $ kubectl apply -f deployment-postgresql-svc.yaml

Paso 5. Exponer el servicio de PostgreSQL en la Virtual Application Network

minikube $ skupper expose deployment customer-database --address customer-database --port 5432 --protocol tcp --target-port 5432

Como resultado veremos un nuevo servicio creado en ambos namespaces llamado customer-database

minikube $ kubectl get svc
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)       AGE
customer-database    ClusterIP      10.96.175.18      <none>          5432/TCP      5m30s
Openshift $ kubectl get svc
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)       AGE
customer-database    ClusterIP      172.30.150.205    <none>          5432/TCP      5m20s

Paso 6. Despliegue del Servicio consumidor de la Base de Datos

Openshift $ kubectl create deployment customer-service --image ghcr.io/mikeintoch/skupper-demo/customer-rest-json:1.0.0

Ahora probemos que la aplicación funcione

Openshift $ kubectl expose deployment customer-service --port 8080 --type LoadBalancer

Mediante «curl» probaremos que nuestro servicio funcione correctamente:

Openshift $ curl $(kubectl get service customer-service -o jsonpath='http://{.status.loadBalancer.ingress[0].hostname}:8080/api/customer') | jq
[
  {
    "id": 1,
    "accountId": "C00001",
    "balance": 336.36,
    "lastName": "Perez",
    "name": "Pedro"
  },
... ...

También podemos probar usando el frontend disponible en la aplicación

Openshift $ firefox $(kubectl get service customer-service -o jsonpath='http://{.status.loadBalancer.ingress[0].hostname}:8080')

Resumen

Nuestra sencilla aplicación tiene dos servicios (base de datos y un servicio java). Desplegamos cada servicio a un cluster de Kubernetes diferente.

Normalmente, un despliegue multicluster de este tipo significa que los servicios no tienen forma de comunicarse a menos que estén expuestos a internet.

Al introducir Skupper en cada namespace, pudimos crear una virtual application network que conecta los servicios a través de los límites del clúster.

Uno de los mejores atributos de una VAN es que es una tecnología de espacio de usuario. Una VAN puede ser puesta en marcha por un desarrollador de forma rápida y fácil sin privilegios de administración. Mientras el desarrollador tenga acceso a un conjunto de espacios de nombres de Kubernetes, esos espacios de nombres pueden participar en una VAN.

Más información:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *