Desplegando una aplicación spring boot y spring cloud a Kubernetes usando Azure Devops - Parte 1

 





Introducción

Cuando empecé a experimentar con Spring Boot y Spring Cloud, encontré este gran proyecto en Github denominado PiggyMetrics

Si bien usa algunos proyectos que desde ya desde la versión Greenwich de Spring Cloud se recomienda reemplazarlos:

- Hystrix por Resilience4j

- Hystrix Dashboard y Turbine por Micrometer y el sistema de monitoreo

- Zuul por Spring Cloud Gateway


Te muestra como implementar tus micro servicios, el uso de Eureka, Config ServerRibbon, Hystrix, Feign y el uso del stack ELK y tracing distribuido con Spring Cloud Sleuth para ver las trazas en Zipkin. En resumen tiene de todo. Te invito a probar dicho proyecto usando el url de GitHub que te menciono líneas arriba y experimentar con dicha solución. 

Todo el trabajo estará documentado en https://github.com/joedayz/java-on-aks que ha sido actualizado por mi persona para usar Kubernetes 1.16.x.

Objetivo

El objetivo de este artículo no es explicarte como se construyo PiggyMetrics, sino, mostrarte la experiencia de desplegarlo en Azure Kubernetes Service (AKS) y luego automatizar el despliegue con Azure Devops

- Se creará un MongoDB y RabbitMQ en Azure.  Esta va a ser la parte 1.

- Se creará un Azure Kubernetes Service y Azure Container Registry, se desplegará Piggymetrics a Azure Kubernetes Service y se verá cómo resolver problemas de los micro servicios en Azure Kubernetes Service. Esta es la parte 2

- Se automatizará el despliegue a Azure Kubernetes Service usando Azure Devops. Esta es la parte 3


Prerequisitos

Para que puedas desplegar esta aplicación Java al cloud, necesitas una subscripción en Azure, sino la tienes, puedes activar una subscribiendote a MSDN o sacandote una cuenta gratuita en Azure

Luego en tu maquina necesitas:

- Azure Cli

- Java 8

- Maven 3

- Git y cuenta en Github

- ACR Docker Credential Helper

- Docker

- Kubectl

- Helm

- dos2unix


Inicia - clonando el repositorio

Hay que clonar el repositorio y cambiar a dicho directorio:


git clone https://github.com/joedayz/java-on-aks.git
cd java-on-aks


Crear MongoDB y RabbitMQ

Hay que crear el MongoDB y RabbitMQ en Azure y capturar las coordenadas y credenciales para luego publicarlas en setup-env-variables-azure.sh.


Preparando el entorno de desarrollo


Realiza una copia del script template para crear tu script de configuración de entorno de desarrollo:

cp .scripts/setup-env-variables-azure-template.sh .scripts/setup-env-variables-azure.sh

Prepara el entorno de desarrollo colocando tus propios valores en las siguientes variables de entorno de dicho archivo setup-env-variables-azure.sh, por ejemplo:

# ====== Piggy Metrics Azure Coordinates =====
export RESOURCE_GROUP=rg-workshop-demo
export REGION=westus2
export AKS_CLUSTER=aks-workshop-demo
export CONTAINER_REGISTRY=acr061174

## ===== Mongo DB
export MONGODB_DATABASE=mongodb-workshop-demo
export MONGODB_USER=cosmosdb-user

## ===== Rabbit MQ
export RABBITMQ_RESOURCE_GROUP=rg-workshop-demo
export RABBITMQ_VM_NAME=rabbitmq-vm-workshop-demo
export RABBITMQ_ADMIN_USERNAME=rabbitmq-admin


Luego exporta estas variables de entorno desde el directorio 'java-on-aks':

pwd 
/Users/josediaz/Downloads/java-on-aks

source .scripts/setup-env-variables-azure.sh



Crear MongoDB


Crear una instancia de MongoDB:

# Change directory
cd java-on-aks

# Login into Azure
az login

# Create a Resource Group
az group create --name ${RESOURCE_GROUP} \
    --location ${REGION}

# Create a Cosmos DB account
az cosmosdb create --kind MongoDB \
    --resource-group ${RESOURCE_GROUP} \
    --name ${MONGODB_USER}

Cortar y pegar el resource 'id' de la respuesta de Azure CLI en setup-env-variables-azure.sh, por ejemplo:

"id": "/subscriptions/7c947db2-4b57-48ef-a998-d0f495f492fc/resourceGroups/rg-workshop-demo/providers/Microsoft.DocumentDB/databaseAccounts/cosmosdb-user"

export MONGODB_RESOURCE_ID="/subscriptions/7c947db2-4b57-48ef-a998-d0f495f492fc/resourceGroups/rg-workshop-demo/providers/Microsoft.DocumentDB/databaseAccounts/cosmosdb-user"


Luego, es necesario obtener los connections strings y usar el primary connection string como MONGODB_URI en el archivo setup-env-variables-azure.sh.

# Get Cosmos DB connection strings  
az cosmosdb list-connection-strings --resource-group ${RESOURCE_GROUP} \
    --name ${MONGODB_USER} 

Lo copiamos al archivo así:

export MONGODB_URI="mongodb://cosmosdb-user:6Qxfc85NOBVtAbKzKzotTu7pVuG2PTMuCc5m5pcFcsStD3Y5FEqvRlmMkr3cAnjC2EsHzxV5nQBlLPI3x0N0TQ==@cosmosdb-user.documents.azure.com:10255/?ssl=true&replicaSet=globaldb"


Conectarse a MongoDB


Te recomiendo Robo 3T que es gratuito. 

1. Connection


2. Authentication


3. SSH. Lo dejamos tal cual
4. SSL 


5. Advanced. Lo dejamos tal cual.

6. Probamos la conexión y listo.




Crear RabbitMQ


Crear una instancia de RabbitMQ certificado por Bitnami para el Microsoft Azure, ir a https://portal.azure.com/#blade/Microsoft_Azure_Marketplace/MarketplaceOffersBlade/selectedMenuItemId/home/searchQuery/rabbitmq e iniciar:


Llena el formulario y usa los valores de RABBITMQ_RESOURCE_GROUP, RABBITMQ_VM_NAME y RABBITMQ_VM_ADMIN_USERNAME, y escoge SSH. Selecciona 'Standard DS3 v2' como el tamaño: 

Acepta los valores por defecto en las siguientes pantallas, pero, no olvides descargar el archivo .pem para poder luego conectarnos a este RabbitMQ desde nuestra máquina local. 

El resultado final debe ser así:




Abre el cliente RabbitMQ y puertos de administración:

# https://docs.bitnami.com/azure/infrastructure/rabbitmq/get-started/understand-default-config/
az vm open-port --port 5672 --name ${RABBITMQ_VM_NAME} \
    --resource-group ${RABBITMQ_RESOURCE_GROUP}
az vm open-port --port 15672 --name ${RABBITMQ_VM_NAME} \
    --resource-group ${RABBITMQ_RESOURCE_GROUP} --priority 1100


En la imagen anterior puedes copiar el Public IP address de la maquina virtual Linux donde se esta ejecutando RabbitMQ y configurar la variable de entorno RABBITMQ_HOST en el archivo setup-env-variables-azure.sh:

## ===== Rabbit MQ
export RABBITMQ_HOST=52.183.30.245
export RABBITMQ_PORT=5672


Luego probamos que podemos conectarnos a dicha maquina vía ssh de la siguiente manera:

1. Desde el directorio 'java-on-aks':

# Open an SSH connection, say
# First, export the environment variables
source .scripts/setup-env-variables-azure.sh

2. Desde el directorio donde descargaste el archivo .pem:

chmod 400 rabbitmq-vm-workshop-demo_key.pem

3.  Nos conectamos ahora al servidor con este comando:

ssh -i rabbitmq-vm-workshop-demo_key.pem rabbitmq-admin@${RABBITMQ_HOST}

El resultado es el siguiente:



4. Ahora procedemos a darnos permiso para conectarnos desde nuestra maquina local:

# https://docs.bitnami.com/azure/infrastructure/rabbitmq/administration/control-services/
sudo /opt/bitnami/ctlscript.sh status

# Stop RabbitMQ
sudo /opt/bitnami/ctlscript.sh stop

# Edit RabbitMQ configurtion file
# https://docs.bitnami.com/azure/infrastructure/rabbitmq/administration/connect-remotely/
# https://github.com/rabbitmq/rabbitmq-server/blob/master/docs/rabbitmq.config.example
sudo nano /opt/bitnami/rabbitmq/etc/rabbitmq/rabbitmq.config

# Particularly, change line 4 from
    {tcp_listeners, [{"127.0.0.1", 5672}, {"::1", 5672}]},
# TO
    {tcp_listeners, [{"0.0.0.0", 5672}, {"::1", 5672}]},

# Start RabbitMQ
sudo /opt/bitnami/ctlscript.sh start


El resultado debe quedar así:



5. Luego, debemos obtener las credenciales administrativas RabbitMQ con este comando:

cat ./bitnami_credentials


Copia las credenciales y cierra la conexión SSH y colocalas en el archivo .scripts/setup-env-variables-azure.sh y exportarlas en variables de entorno:

# Rabbit MQ
export RABBITMQ_USERNAME=user
export RABBITMQ_PASSWORD=xxxxxxxxxxxx

# export them
source .scripts/setup-env-variables-azure.sh

Luego de todo esto, ya podrías abrir la consola administrativa en este URL:




Variables de entorno para el ambiente de desarrollo


Hasta este punto, deberíamos tener las siguientes variables en .scripts/setup-env-variables-azure.sh y exportarlas en el ambiente de desarrollo:





Y bueno esta es la parte 1. En los sucesivo iremos agregando las otras partes para que lo puedan practicar.  Lo haremos en partes porque el proceso es largo y mejor ir paso a paso para hacerlo mas didáctico.

Vídeo paso a paso


Y por supuesto, hay un video para apoyarte a seguir los pasos de este primer artículo.





Enjoy!

Joe




Share:
Ubicación: Perú

1 comentario:

  1. Excelente post Jose, lo encontre ahora que me tome con el tema de Hystrix y las alternativas ahora que ya esta deprecado, esperamos la parte 2

    ResponderBorrar