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


 


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 va a ser la parte 2

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


Conectarse a su cuenta de Azure

El Azure CLI nos ayudará en esta tarea, con este simple comando y usando nuestro email y contraseña con la cual sacamos la cuenta.


az login


Deberías obtener información de los tenants donde tienes acceso.




Crear un Azure Container Registry y Azure Kubernetes Service

En la parte 1 ya dejamos listo el MongoDB y RabbitMQ. Ahora vamos a crear el Registro de Contenedores  (ACR) y el Kubernetes en Azure (AKS). El Azure Container Registry nos va a permitir guardar las imágenes de nuestros micro servicios y en el AKS vamos a desplegar los contenedores que se crean a partir de dichas imágenes. 


Crear un Azure Container Registry


Ingresa al directorio 'java-on-aks':

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

Crea un Azure Container Registry usando Azure CLI:


# Create a Resource Group, if you have not created one
az group create --name ${RESOURCE_GROUP} \
    --location ${REGION}
    
# Create Azure Container Registry
az acr create --name ${CONTAINER_REGISTRY} \
    --resource-group ${RESOURCE_GROUP} \
    --sku basic --location ${REGION}
    
# Log into Azure Container Registry
az acr login -n ${CONTAINER_REGISTRY}

El resultado es el siguiente:



Crear el Azure Kubernetes Service


Creamos una instancia de Azure Kubernetes Service y lo asociamos al Azure Container Registry creando en el paso anterior usando Azure CLI:

az aks create --name ${AKS_CLUSTER} \
    --resource-group ${RESOURCE_GROUP} \
    --location ${REGION} \
    --attach-acr ${CONTAINER_REGISTRY} \
    --node-vm-size Standard_DS3_v2 \
    --node-count 5

Obtener las credenciales de acceso a el cluster AKS:

az aks get-credentials --name ${AKS_CLUSTER} \
    --resource-group ${RESOURCE_GROUP}


Desplegar Piggymetrics a Azure Kubernetes Service


Construir las aplicaciones Java, las imágenes docker, y pushear las imágenes a Azure Container Registry usando Maven y Jib:

cd config
mvn compile jib:build \
    -Djib.container.environment=CONFIG_SERVICE_PASSWORD=${CONFIG_SERVICE_PASSWORD}

cd ../registry
mvn compile jib:build

cd ../gateway
mvn compile jib:build

cd ../auth-service
mvn compile jib:build

cd ../account-service
mvn compile jib:build \
    -Djib.container.environment=ACCOUNT_SERVICE_PASSWORD=${ACCOUNT_SERVICE_PASSWORD}

cd ../statistics-service
mvn compile jib:build \
    -Djib.container.environment=STATISTICS_SERVICE_PASSWORD=${STATISTICS_SERVICE_PASSWORD}

cd ../notification-service
mvn compile jib:build \
    -Djib.container.environment=NOTIFICATION_SERVICE_PASSWORD=${NOTIFICATION_SERVICE_PASSWORD}


Jib está configurado para crear una distribución lista para producción. Por ejemplo:

<plugin>
    <groupId>com.google.cloud.tools</groupId>
    <artifactId>jib-maven-plugin</artifactId>
    <version>1.8.0</version>
    <configuration>
        <from>
            <!-- production-ready distribution of Java -->
            <image>mcr.microsoft.com/java/jre-headless:8u232-zulu-alpine</image>
        </from>
        <to>
            <image>${CONTAINER_REGISTRY}.azurecr.io/${parent.artifactId}-${project.name}</image>
        </to>
        <container>
            <jvmFlags>
                <jvmFlag>-Xms2048m</jvmFlag>
                <jvmFlag>-Xmx2048m</jvmFlag>
            </jvmFlags>
            <ports>
                <port>${CONFIG_PORT}</port>
            </ports>
            <labels>
                <key1>${project.version}</key1>
            </labels>
        </container>
    </configuration>
</plugin>

Preparar los archivos manifiesto para Kubernetes


Se prepara los manifiestos de Kubernetes usando el script provisto:

# cd to kubernetes folder
cd ../kubernetes
source ../.scripts/prepare-kubernetes-manifest-files.sh
NOTA: Yo he modificado los scripts para soportar Kubernetes 1.16.x, el proyecto original no lo hace y no va a funcionar todo lo que viene a continuación. 

Crear los Secretos en Kubernetes


Tu puedes crear Secretos para desplegar los micro servicios en Kubernetes:

kubectl apply -f deploy/0-secrets.yaml

# you can view Secrets in Kubernetes using:
kubectl get secret piggymetrics -o yaml

Desplegar Spring Cloud Config Server


Tu puedes desplegar el Spring Cloud Config Server a Kubernetes:

kubectl apply -f deploy/1-config.yaml

Desplegar Spring Cloud Service Registry


Tu puedes desplegar el Spring Cloud Service Registry a Kubernetes:

kubectl apply -f deploy/2-registry.yaml

Se puede validar que un Spring Cloud Config Server esta arriba y corriendo invocando su REST API.

Para saber en que IP público se esta ejecutando el Spring Cloud Config Server y Spring Cloud Service Registry usando kubectl:



Y ya con eso podemos testear todas las configuraciones usadas por los proyectos:


open http://<EXTERNAL-IP-of-config>:8888/gateway/profile
open http://<EXTERNAL-IP-of-config>:8888/account-service/profile
open http://<EXTERNAL-IP-of-config>:8888/statistics-service/profile
open http://<EXTERNAL-IP-of-config>:8888/notification-service/profile
...
open http://<EXTERNAL-IP-of-config>:8888/notification-service/profile/development
...



Se puede validar que un Spring Cloud Service Registry esta listo, abriendo el Service Registry Dashboard:



Desplegar Spring Cloud Gateway


Tu puedes desplegar el Spring Cloud Gateway a Kubernetes:

kubectl apply -f deploy/3-gateway.yaml

Desplegar los 4 Spring Cloud micro servicios


Tu puedes desplegar los spring cloud micro servicios a Kubernetes:

kubectl apply -f deploy/4-auth-service.yaml
kubectl apply -f deploy/5-account-service.yaml
kubectl apply -f deploy/6-statistics-service.yaml
kubectl apply -f deploy/7-notification-service.yaml

Tu puedes validar que los micro servicios están ejecutandose:




Abre el PiggyMetrics publicado en Kubernetes


Abre el landing page de Piggymetrics usando el IP externo del gateway:















Monitorear los micro servicios en Azure Kubernetes Service

Con el soporte fuera de la caja para agregar logs, métricas, y trazas de aplicaciones distribuidas que brinda Azure Monitor, tu puedes fácilmente visualizar como tus aplicaciones se ejecutan, detectar y diagnosticar issues en tus micro servicios y dependencias, revisar a profundidad la data que tiene problemas y tener un mejor entendimiento de que están haciendo los usuarios en tus aplicaciones. 


Revisar los logs de los micro servicios en cloud


Podemos ver los logs de cada micro servicio usando el comando kubectl:

# Stream logs from Spring Cloud Config Server
kubectl logs -f --timestamps=true -l app=config

# Stream logs from Spring Cloud Service Registry
kubectl logs -f --timestamps=true -l app=registry

# Stream logs from Spring Cloud Gateway
kubectl logs -f --timestamps=true -l app=gateway

# Stream logs from Spring Cloud micro service apps
kubectl logs -f --timestamps=true -l app=auth-service
kubectl logs -f --timestamps=true -l app=account-service
kubectl logs -f --timestamps=true -l app=statistics-service
kubectl logs -f --timestamps=true -l app=notification-service

Usar los logs agregados y métricas en Azure Log Analytics


Podemos agregar los logs en Azure Log Analytics y recuperar ellos usando consultas Kusto. Hay que crear en este punto un Analytics Workspace en Azure. 

1. Vamos a crear un Log Analytics workspace

2.  Configuramos los datos y creamos el ALAW.

3. El resultado es el siguiente:


4. Ahora vamos a nuestro Kubernetes y asociamos este ALAW.  Damos clic en Enable.



Luego de ello , aplica el scope al AKS:






O usando Kusto query para ver los logs de cada micro servicio:







//Logs for Spring Cloud Gateway
let ContainerIdList = KubePodInventory
| where ContainerName contains 'auth-service'
| where ClusterId  contains "aks-workshop-demo"
| distinct ContainerID;
ContainerLog
| where ContainerID in (ContainerIdList)
| where LogEntry !contains "AI:" 
| project LogEntrySource, LogEntry, TimeGenerated, Computer, Image, Name, ContainerID
| order by TimeGenerated desc
| render table


Espero les sirva para ver información de los micro servicios.


Video

He grabado también este vídeo para que puedas seguir el artículo sin problemas.






Enjoy!

Joe






Share:

1 comentario: