Uso de Java EE JCache con Open Liberty o WebSphere Liberty en un clúster de Azure Kubernetes Service (AKS)

En este artículo se describe cómo usar JCache de Java EE en una aplicación en contenedor implementada en AKS.

En esta guía, hará lo siguiente:

  • Cree la infraestructura para ejecutar la aplicación Java, Java EE, Jakarta EE o MicroProfile en el entorno de ejecución de Open Liberty o WebSphere Liberty.
  • Use Java EE JCache respaldado por Azure Cache for Redis como caché de sesión.
  • Compilar la imagen de Docker de la aplicación mediante imágenes de contenedor de Open Liberty o WebSphere Liberty.
  • Implementar la aplicación contenedorizada en un clúster de AKS mediante el operador de Open Liberty.

Este artículo está diseñado para ayudarle a llegar rápidamente a la implementación. Antes de ir a producción, debe explorar Tuning Liberty.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

  • En este artículo se necesita la versión más reciente de la CLI de Azure. Si usa Azure Cloud Shell, ya está instalada la versión más reciente.
  • Si ejecuta los comandos de esta guía localmente (en lugar de Azure Cloud Shell):
    • Prepare una máquina local con un sistema operativo similar a Unix instalado (por ejemplo, Ubuntu, macOS o Subsistema de Windows para Linux).
    • Instale una implementación de Java SE, versión 17 o posterior (por ejemplo, Eclipse Open J9).
    • Instale Maven 3.5.0 o una versión superior.
    • Instale Docker para el sistema operativo.
  • Asegúrese de que se le ha asignado el Owner rol o Contributor y User Access Administrator los roles de la suscripción. Puede comprobar las asignaciones siguiendo los pasos descritos en Enumeración de asignaciones de roles para un usuario o grupo.

Creación de la infraestructura

Los pasos de esta sección le guían para crear la infraestructura de aplicaciones en Azure. Después de completar estos pasos, tendrá una instancia de Azure Container Registry, un clúster de Azure Kubernetes Service y una instancia de Azure Cache for Redis para ejecutar la aplicación de ejemplo.

Crear un grupo de recursos

Un grupo de recursos de Azure es un grupo lógico en el que se implementan y administran recursos de Azure.

Cree un grupo de recursos denominado java-liberty-project mediante el comando az group create en la ubicación eastus. Este grupo de recursos se usará más adelante para crear la instancia de Azure Container Registry (ACR) y el clúster de AKS.

export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus

Creación de una instancia de ACR

Use el comando az acr create para crear la instancia de ACR. En el ejemplo siguiente se crea una instancia de ACR denominada youruniqueacrname. Asegúrese de que youruniqueacrname sea única en Azure.

export REGISTRY_NAME=youruniqueacrname
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic \
    --admin-enabled

Tras un breve período de tiempo, debería ver una salida JSON que contiene:

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "java-liberty-project",

Como alternativa, puede crear una instancia de Azure Container Registry siguiendo los pasos descritos en Inicio rápido: Creación de un registro de contenedor de Azure mediante Azure Portal.

Conexión a la instancia de ACR

Deberá iniciar sesión en la instancia de ACR para poder insertar una imagen en ella. Ejecute los comandos siguientes para comprobar la conexión:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'loginServer' \
    --output tsv)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'passwords[0].value' \
    --output tsv)

docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

Debería ver Login Succeeded al final de la salida del comando si ha iniciado sesión correctamente en la instancia de ACR.

Si ve un problema al iniciar sesión en el registro de contenedor de Azure, consulte Solución de problemas de inicio de sesión del registro.

Creación de un clúster de AKS

Use el comando az aks create para crear un clúster de AKS y concederle permiso de extracción de imágenes de la instancia de ACR. En el siguiente ejemplo se crea un clúster denominado myAKSCluster con un nodo. Este comando tardará varios minutos en completarse.

export CLUSTER_NAME=myAKSCluster
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --generate-ssh-keys \
    --enable-managed-identity \
    --attach-acr $REGISTRY_NAME

Después de unos minutos, el comando finaliza y devuelve información con formato JSON sobre el clúster, incluidas las siguientes líneas:

  "nodeResourceGroup": "MC_java-liberty-project_myAKSCluster_eastus",
  "privateFqdn": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "java-liberty-project",

Conexión al clúster de AKS

Para administrar un clúster de Kubernetes, usará kubectl, el cliente de línea de comandos de Kubernetes. Si usa Azure Cloud Shell, kubectl ya está instalado. Para instalar kubectl localmente, use el comando az aks install-cli:

az aks install-cli

Para configurar kubectl para conectarse a su clúster de Kubernetes, use el comando az aks get-credentials. Con este comando se descargan las credenciales y se configura la CLI de Kubernetes para usarlas.

az aks get-credentials \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --overwrite-existing

Para comprobar la conexión al clúster, use el comando kubectl get para devolver una lista de los nodos del clúster.

kubectl get nodes

La salida del ejemplo siguiente muestra el nodo único creado en los pasos anteriores. Asegúrese de que el estado del nodo sea Listo.

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.18.10

Instalación de Operator de Open Liberty

Después de crear el clúster y conectarse a él, ejecute los comandos siguientes para instalar Operator de Open Liberty.

# Install cert-manager Operator
CERT_MANAGER_VERSION=v1.11.2
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml

# Install Open Liberty Operator
export OPERATOR_VERSION=1.2.2
mkdir -p overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/olo-all-namespaces.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/cluster-roles.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/kustomization.yaml -q -P ./overlays/watch-all-namespaces
mkdir base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/kustomization.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-crd.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-operator.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-roles.yaml -q -P ./base
kubectl create namespace open-liberty
kubectl apply --server-side -k overlays/watch-all-namespaces

Creación de una instancia de Azure Redis Cache

Azure Cache for Redis respalda la persistencia de HttpSession una aplicación Java que se ejecuta dentro de un servidor Open Liberty o WebSphere Liberty. Siga los pasos de esta sección para crear una instancia de Azure Cache for Redis y anotar su información de conexión. Usaremos esta información más adelante.

  1. Siga los pasos descritos en Inicio rápido: Uso de Azure Cache for Redis en Java hasta el momento, pero no incluye Descripción del ejemplo de Java.

  2. Copie el nombre de host y la clave de acceso principal de la instancia de Azure Cache for Redis y, a continuación, ejecute los siguientes comandos para agregar variables de entorno:

    export REDISCACHEHOSTNAME=<YOUR_HOST_NAME>
    export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
    

Compilar la aplicación

Siga los pasos de esta sección para compilar y incluir en contenedores la aplicación de ejemplo. En estos pasos se usa Maven, liberty-maven-pluginy az acr build. Para más información sobre liberty-maven-plugin, consulte Creación de una aplicación web con Maven.

Extracción de la aplicación

Use los siguientes comandos para clonar el código de ejemplo de esta guía. El ejemplo se encuentra en el repositorio open-liberty-on-aks en GitHub. Hay algunos ejemplos en el repositorio. En este artículo se usa java-app-jcache.

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20230906

Si se ve un mensaje sobre estar en estado "HEAD desasociado", es seguro ignorar este mensaje. Solo significa que ha desprotegido una etiqueta.

La aplicación tiene la siguiente estructura de archivos:

java-app-jcache/
├── pom.xml
└── src
    └── main
        ├── aks
        │   └── openlibertyapplication.yaml
        ├── docker
        │   ├── Dockerfile
        │   └── Dockerfile-wlp
        ├── java
        ├── liberty
        │   └── config
        │       └── server.xml
        ├── redisson
        │   └── redisson-config.yaml
        ├── resources
        └── webapp

Los directorios java, resources y webapp contienen el código fuente de la aplicación de ejemplo.

En el directorio aks , el archivo de implementación openlibertyapplication.yaml se usa para implementar la imagen de aplicación.

En el directorio docker , colocamos dos Dockerfiles. Dockerfile se usa para compilar una imagen con Open Liberty y Dockerfile-wlp para compilar la imagen con WebSphere Liberty.

En el directorio liberty/config , el archivo server.xml se usa para configurar la caché de sesión para el clúster de Open Liberty y WebSphere Liberty.

En el directorio redisson, el archivo redisson-config.yaml se usa para configurar la conexión de la instancia de Azure Cache for Redis.

Incluir la aplicación en contenedores

Para implementar y ejecutar la aplicación Liberty en el clúster de AKS, siga estos pasos para incluir la aplicación en contenedores como una imagen de Docker. Puede usar imágenes de contenedor de Open Liberty o imágenes de contenedor de WebSphere Liberty.

  1. Cambie el directorio a java-app-jcache del clon local.

  2. Ejecute mvn clean package para empaquetar la aplicación.

  3. Ejecute mvn -Predisson validate para copiar el archivo de configuración de Redisson en la ubicación especificada. Este paso inserta los valores de las variables REDISCACHEHOSTNAME de entorno y REDISCACHEKEY en el archivo redisson-config.yaml , al que hace referencia el archivo server.xml .

  4. Ejecute mvn liberty:dev para probar la aplicación. Si la prueba se realiza correctamente, debería ver The defaultServer server is ready to run a smarter planet. en la salida del comando. Debería ver una salida similar a la siguiente si la conexión de Redis se ha realizado correctamente.

    [INFO] [err] [Default Executor-thread-5] INFO org.redisson.Version - Redisson 3.16.7
    [INFO] [err] [redisson-netty-2-2] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    [INFO] [err] [redisson-netty-2-20] INFO org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    
  5. Puede visitar http://localhost:9080/ para ver la aplicación en ejecución, pero la prueba de funcionamiento de Redis es la salida que se muestra en el paso anterior.

  6. Use Ctrl+C para detener la aplicación.

  7. Use los comandos siguientes para recuperar los valores de las propiedades artifactId y version definidos en el archivo pom.xml .

    export artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec)
    export version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
    
  8. Ejecute cd target para cambiar el directorio a la compilación del ejemplo.

  9. Ejecute uno de estos comandos para crear la imagen de la aplicación e insertarla en la instancia de ACR.

    • Use el siguiente comando para compilar con una imagen base de Open Liberty si prefiere usar Open Liberty como un entorno de ejecución ligero de Java™ código abierto:

      # Build and tag application image. This will cause the ACR instance to pull the necessary Open Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME .
      
    • Use el siguiente comando para compilar con una imagen base de WebSphere Liberty si prefiere usar una versión comercial de Open Liberty:

      # Build and tag application image. This will cause the ACR instance to pull the necessary WebSphere Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME --file=Dockerfile-wlp .
      

Implementación de la aplicación

Siga los pasos de esta sección para implementar la aplicación de ejemplo en contenedor en el clúster de AKS.

  1. Compruebe que el directorio de trabajo actual es java-app-jcache/target en el clon local.

  2. Use los siguientes comandos para crear un secreto con información de configuración de Redisson. Con este secreto, la aplicación puede conectarse a la instancia de Azure Cache for Redis creada.

    export REDISSON_CONFIG_SECRET_NAME=redisson-config-secret
    kubectl create secret generic ${REDISSON_CONFIG_SECRET_NAME} --from-file=$(pwd)/liberty/wlp/usr/servers/defaultServer/redisson-config.yaml
    
  3. Use los siguientes comandos para implementar la aplicación Liberty con tres réplicas en el clúster de AKS. La salida del comando también se muestra en línea.

    # Set number of application replicas
    export REPLICAS=3
    
    # Create OpenLibertyApplication "javaee-cafe-jcache-cluster"
    envsubst < openlibertyapplication.yaml | kubectl create -f -
    
    openlibertyapplication.openliberty.io/javaee-cafe-jcache-cluster created
    
    # Check if OpenLibertyApplication instance is created
    kubectl get openlibertyapplication ${artifactId}-cluster
    
    NAME                               IMAGE                                                         EXPOSED      RECONCILED   AGE
    javaee-cafe-jcache-cluster         youruniqueacrname.azurecr.io/javaee-cafe-jcache:1.0.0                      True         59s
    
    # Check if deployment created by Operator is ready
    kubectl get deployment ${artifactId}-cluster --watch
    
    NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-jcache-cluster         0/3     3            0           20s
    
  4. Espere hasta que vea 3/3 debajo de la READY columna y 3 debajo de la AVAILABLE columna y, a continuación, use Ctrl+C para detener el proceso de kubectl inspección.

Prueba de la aplicación

Cuando se ejecuta la aplicación, un servicio de equilibrador de carga de Kubernetes expone el front-end de la aplicación a Internet. Este proceso puede tardar en completarse.

Para supervisar el progreso, utilice el comando kubectl get service con el argumento --watch.

kubectl get service ${artifactId}-cluster --watch

NAME                               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
javaee-cafe-jcache-cluster         LoadBalancer   10.0.50.29     20.84.16.169    80:31732/TCP     68s

Una vez que la dirección EXTERNAL-IP cambia de pendiente a una dirección IP pública real, use Ctrl+C para detener el proceso de kubectl inspección.

Abra un explorador web en la dirección IP externa del servicio (20.84.16.169 en el ejemplo anterior) para ver la página principal de la aplicación. Si la página no se carga correctamente, esto se debe a que la aplicación se está iniciando. Puede esperar un tiempo y actualizar la página más adelante. Debería ver el nombre del pod de las réplicas de aplicación que se muestran en la parte superior izquierda de la página (javaee-cafe-jcache-cluster-77d54bccd4-5xnzx para este caso).

Captura de pantalla de la aplicación Java Liberty implementada correctamente en A K S.

En el formulario Nuevo café en la sesión, establezca valores para los campos Nombre y Precio y, a continuación, seleccione Enviar. Después de unos segundos, verá Recuento de envío: 1 mostrado en la parte inferior izquierda de la página.

Captura de pantalla de la aplicación de ejemplo que muestra el nuevo café creado y conservado en la sesión de la aplicación.

Para demostrar que la memoria caché de sesión se conserva en todas las réplicas de la aplicación, ejecute el siguiente comando para eliminar la réplica actual con el nombre javaee-cafe-jcache-cluster-<pod id from your running app>del pod :

kubectl delete pod javaee-cafe-jcache-cluster-77d54bccd4-5xnzx

pod "javaee-cafe-jcache-cluster-77d54bccd4-5xnzx" deleted

A continuación, actualice la página principal de la aplicación. Verá los mismos datos que se muestran en la sección Nuevo café en la sesión , pero se muestra un nombre de pod diferente en la parte superior izquierda de la página.

Por último, siga estos pasos para demostrar que los datos de sesión se conservan en la instancia de Azure Cache for Redis. Puede emitir comandos a la instancia de Azure Cache for Redis mediante la consola de Redis.

  1. Busque la instancia de Azure Cache for Redis desde Azure Portal.

  2. Seleccione Consola para abrir la consola de Redis.

  3. Ejecute los siguientes comandos para ver los datos de sesión:

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. Busque café.model.entity.Coffee[id=1, name=Coffee 3, price=30.0] desde la página web, que es el café que creó y se conserva en la instancia de Azure Cache for Redis.

Limpieza de recursos

Para evitar los cargos de Azure, se recomienda limpiar los recursos que no sean necesarios. Cuando el clúster ya no se necesite, puede usar el comando az group delete para quitar el grupo de recursos, el servicio de contenedor, el registro de contenedor y todos los recursos relacionados.

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Para eliminar la instancia de Azure Cache for Redis, busque su nombre del grupo de recursos y ejecute el siguiente comando:

az group delete --name <AZURE_CACHE_FOR_REDIS_RESOURCE_GROUP_NAME> --yes --no-wait

Pasos siguientes

Puede obtener más información en las referencias que se usan en esta guía: