Compartir a través de


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 Java EE JCache en una aplicación contenedorizada implementada en AKS.

En esta guía, hará lo siguiente:

  • Crear la infraestructura para ejecutar una aplicación Java, Java EE, Jakarta EE o Microprofile en el entorno de ejecución de Open Liberty o WebSphere Liberty.
  • Usar 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 está interesado en proporcionar comentarios o trabajar estrechamente en sus escenarios de migración con el equipo de ingeniería que desarrolla WebSphere en soluciones de Azure, rellene esta breve encuesta sobre la migración de WebSphere e incluya la información de contacto. El equipo de administradores de programas, arquitectos e ingenieros se pondrá en contacto rápidamente con usted para iniciar una estrecha colaboración.

Requisitos previos

  • Suscripción a Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Prepara una máquina local con un sistema operativo similar a Unix instalado (por ejemplo, Ubuntu, macOS o Subsistema de Windows para Linux).
  • Para ejecutar comandos de la CLI de Azure, instale la CLI de Azure.
    • Inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión en Azure con la CLI de Azure.
    • En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para obtener más información sobre las extensiones, consulte Uso y administración de extensiones con la CLI de Azure.
    • Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.
  • Instala la versión 17 o una posterior de implementación de Java SE; por ejemplo, Compilación de Microsoft de OpenJDK.
  • Instale Maven 3.5.0 o una versión superior.
  • Instale Docker para el sistema operativo.
  • Asegúrese de que Git está instalado.
  • Asegúrese de que se le ha asignado el rol Owner o los roles Contributor y User Access Administrator para la suscripción. Puede comprobar las asignaciones siguiendo los pasos descritos en Lista de las asignaciones de rol de un usuario o grupo.

Crear 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

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 una instancia de Azure Container Registry mediante Azure Portal.

Conexión a la instancia de ACR

Tendrá que 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)

az acr login \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME

Nota:

No se recomienda el uso de credenciales de nombre de usuario y contraseña para conceder acceso a un registro de contenedor. Si sus requisitos de uso concretos sugieren que el acceso basado en credenciales es el mejor enfoque, puede obtener el nombre de usuario y la contraseña mediante az acr credential show y usar estos valores con docker login.

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

Si ve un problema al iniciar sesión en la instancia de Azure Container Registry, consulte Solución de problemas de inicio de sesión en el 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. El comando tarda 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

Transcurridos unos minutos, el comando se completa y devuelve información en 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. 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 es 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.3.3
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 para 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 anote su información de conexión. Usará esta información más adelante.

  1. Siga los pasos descritos en Inicio rápido: Uso de Azure Cache for Redis en Java, hasta la sección Descripción del ejemplo de Java.

    Nota:

    En el paso 6 de la sección Creación de una instancia de Azure Cache for Redis, seleccione Autenticación de claves de acceso para la opción Autenticación. Esta opción es necesaria para que la aplicación de ejemplo se conecte a la instancia de Azure Cache for Redis mediante la biblioteca cliente de Redisson. Para obtener más información, consulte Configuración de Redisson.

  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 contenedorizar la aplicación de ejemplo. En estos pasos se usa Maven, liberty-maven-plugin y 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 20240909
cd java-app-jcache

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, se usa el archivo de implementación openlibertyapplication.yaml para implementar la imagen de la 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, se usa el archivo server.xml 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 contenedorizar la aplicación como una imagen de Docker. Puede usar imágenes de contenedor de Open Liberty o imágenes de contenedor de WebSphere Liberty.

  1. Compruebe que el directorio de trabajo actual es java-app-jcache en el 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 de entorno REDISCACHEHOSTNAME 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 el resultado de la prueba es satisfactorio, debería ver The defaultServer server is ready to run a smarter planet. en la salida del comando. Debería ver una salida similar al ejemplo siguiente, si la conexión de Redis se realiza correctamente.

    [INFO] [err] [Default Executor-thread-5] INFO org.redisson.Version - Redisson 3.23.4
    [INFO] [err] [redisson-netty-2-7] 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 comando siguiente para compilar con una imagen base de Open Liberty si prefiere usar Open Liberty como Java™ Runtime ligero de código abierto:

      # Build and tag application image. This causes 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 comando siguiente 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 causes 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 que aparecen en esta sección para implementar la aplicación de ejemplo contenedorizada 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 comandos siguientes para implementar la aplicación de Liberty con tres réplicas en el clúster de AKS. La salida del comando también se muestra insertada.

    # 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 ver 3/3 en la columna READY y 3 en la columna AVAILABLE y, luego, use Ctrl+C para detener el proceso de inspección de kubectl.

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 inspección de kubectl.

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 de pod de las réplicas de la aplicación en la parte superior izquierda de la página (javaee-cafe-jcache-cluster-77d54bccd4-5xnzx en 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íos: 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 de pod javaee-cafe-jcache-cluster-<pod id from your running app>:

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 Redis Cache en Azure Portal.

  2. Seleccione Consola para abrir la consola de Redis.

  3. Para ver los datos de la sesión, ejecute los siguientes comandos:

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. Busque cafe.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 el 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:

Si desea explorar las opciones para ejecutar los productos WebSphere en Azure, consulte ¿Cuáles son las soluciones para ejecutar la familia de productos WebSphere en Azure?