Implementación de una aplicación Java con Open Liberty o WebSphere Liberty en un clúster de Azure Kubernetes Service

En este artículo se explica cómo:

  • Ejecutar una aplicación Java, Java EE, Yakarta EE o MicroProfile en el runtime de Open Liberty o IBM WebSphere Liberty.
  • Compilar la imagen de Docker de la aplicación mediante imágenes de contenedor de Open Liberty o WebSphere Liberty.
  • Implemente la aplicación contenedorizada en un clúster de Azure Kubernetes Service (AKS) mediante el operador de Open Liberty o el operador de WebSphere Liberty.

El operador de Open Liberty simplifica la implementación y administración de las aplicaciones que se ejecutan en clústeres de Kubernetes. Con el operador de Open Liberty o WebSphere Liberty, también puede realizar operaciones más avanzadas, como recopilar seguimientos y volcados.

En este artículo se usa la oferta de Azure Marketplace para Open Liberty o WebSphere Liberty para acelerar su transición a AKS. La oferta aprovisiona automáticamente algunos recursos de Azure, entre los que se incluyen:

  • Una instancia de Azure Container Registry.
  • Un clúster de AKS.
  • Una instancia del controlador de entrada de Application Gateway (AGIC).
  • El operador de Open Liberty y el operador de WebSphere Liberty.
  • Opcionalmente, una imagen de contenedor que incluye Liberty y la aplicación.

Si prefiere una guía manual paso a paso para ejecutar Liberty en AKS, consulte Implementación manual de una aplicación Java con Open Liberty o WebSphere Liberty en un clúster de Azure Kubernetes Service (AKS).

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

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

Requisitos previos

  • Instale la CLI de Azure. Si utiliza Windows o macOS, considere la posibilidad de ejecutar la CLI de Azure en un contenedor Docker. Para más información, vea Ejecución de la CLI de Azure en un contenedor de Docker.
  • 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 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 más información sobre las extensiones, consulte Uso 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. Este artículo requiere al menos la versión 2.31.0 de la CLI de Azure.
  • 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 Git está instalado.
  • Asegúrese de que se le haya asignado el rol Owner o los roles Contributor y User Access Administrator en la suscripción. Puede comprobarlo siguiendo los pasos descritos en Lista de las asignaciones de rol de un usuario o grupo.

Nota:

También puede ejecutar los comandos de este artículo en Azure Cloud Shell. Este enfoque tiene todas las herramientas de requisitos previos preinstaladas, a excepción de Docker.

  • Si ejecuta los comandos de esta guía de forma local (en lugar de Azure Cloud Shell):
    • Prepare un equipo local con un sistema operativo similar a Unix instalado (por ejemplo, Ubuntu, Azure Linux, 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 haya asignado el rol Owner o los roles Contributor y User Access Administrator en la suscripción. Puede comprobarlo siguiendo los pasos descritos en Lista de las asignaciones de rol de un usuario o grupo.

Creación de una implementación de Liberty en AKS mediante el portal

Los siguientes pasos le guiarán para crear un tiempo de ejecución de Liberty en AKS. Después de completar estos pasos, tendrá una instancia de Container Registry y un clúster de AKS para implementar la aplicación contenedorizada.

  1. Vaya a Azure Portal. En el cuadro de búsqueda de la parte superior de la página, escriba IBM Liberty en AKS. Cuando aparezcan las sugerencias, seleccione la única coincidencia en la sección Marketplace.

    Si lo prefiere, puede ir directamente a la oferta.

  2. Seleccione Crear.

  3. En el panel Aspectos básicos:

    1. Crear un nuevo grupo de recursos. Dado que los grupos de recursos deben ser únicos dentro de una suscripción, elija un nombre único. Una forma fácil de tener nombres únicos es usar una combinación de sus iniciales, la fecha de hoy y algún identificador (por ejemplo, ejb0913-java-liberty-project-rg).

    2. En Región, seleccione Este de EE. UU. .

    3. Cree una variable de entorno en el shell para los nombres del grupo de recursos para el clúster y la base de datos:

      export RESOURCE_GROUP_NAME=<your-resource-group-name>
      

  4. Seleccione Siguiente. En el panel AKS, puede seleccionar opcionalmente un clúster de AKS existente y una instancia de Container Registry, en lugar de hacer que la implementación cree unos nuevos. Esta opción le permite usar el patrón sidecar, como se muestra en el Centro de arquitectura de Azure. También puede ajustar la configuración del tamaño y el número de máquinas virtuales del grupo de nodos de AKS.

    Para los fines de este artículo, mantenga todos los valores predeterminados en este panel.

  5. Seleccione Siguiente. En el panel Equilibrio de carga, junto a ¿Quiere conectarse a Azure Application Gateway?, seleccione . En esta sección, puede personalizar las siguientes opciones de implementación:

    • Opcionalmente, puede personalizar la red virtual y la subred en las que la implementación colocará los recursos. No es necesario cambiar los valores restantes de sus valores predeterminados.

    • En Certificado TLS/SSL, puede proporcionar el certificado TLS/SSL de Azure Application Gateway. Deje los valores predeterminados para que la oferta genere un certificado autofirmado.

      No pase a producción con un certificado autofirmado. Para obtener más información sobre los certificados autofirmados, consulte Creación de un certificado público autofirmado para autenticar la aplicación.

    • Puede seleccionar Habilitar afinidad basada en cookies, también conocida como "sesiones permanentes". En este artículo se usan sesiones permanentes, así que asegúrese de seleccionar esta opción.

  6. Seleccione Siguiente. En el panel Operador y aplicación, en este artículo se usan todos los valores predeterminados. Sin embargo, puede personalizar las siguientes opciones de implementación:

    • Puede implementar el operador de WebSphere Liberty seleccionando en la opción ¿Es compatible con IBM?. Al dejar el valor predeterminado No, se implementará Open Liberty Operator.
    • Puede implementar una aplicación para el operador seleccionado eligiendo en la opción ¿Quiere implementar una aplicación?. Si se deja el valor predeterminado No, no se implementará ninguna aplicación.
  7. Seleccione Revisar y crear para validar las opciones seleccionadas. En el panel Revisar y crear, cuando vea la opción Crear activada después de superar la validación, selecciónela.

    La implementación puede tardar hasta 20 minutos. Mientras espera a que finalice la implementación, puede seguir los pasos descritos en la sección Creación de una instancia de Azure SQL Database. Después de completar esa sección, vuelva aquí y continúe.

Captura de la información seleccionada de la implementación

Si ha salido del panel La implementación está en curso, los pasos siguientes le muestran cómo volver a ese panel. Si todavía está en el panel que indica Se completó la implementación, vaya al grupo de recursos recién creado y continúe con el tercer paso.

  1. En la esquina de cualquier página del portal, seleccione el botón de menú y, después. seleccione Grupos de recursos.

  2. En el cuadro con el texto Filtrar para cualquier campo, escriba los primeros caracteres del grupo de recursos que creó anteriormente. Si ha seguido la convención recomendada, escriba sus iniciales y, después, seleccione el grupo de recursos adecuado.

  3. En la lista de recursos del grupo de recursos, seleccione el recurso con el valor de Tipo establecido en Registro de contenedor.

  4. En el panel de navegación, en Configuración, seleccione Claves de acceso.

  5. Guarde los valores de Servidor de inicio de sesión, Nombre de registro, Nombre de usuario y Contraseña. Puede usar el icono de copia situado junto a cada campo para copiar el valor en el Portapapeles del sistema.

  6. Vuelva al grupo de recursos en el que implementó los recursos.

  7. En la sección Configuración, seleccione Implementaciones.

  8. Seleccione la implementacióne inferior de la lista. El valor de Nombre de implementación coincidirá con el identificador del publicador de la oferta. Contiene la cadena ibm.

  9. En el panel de navegación, seleccione Salidas.

  10. Mediante la misma técnica de copia que usó con los valores anteriores, guarde en otro lugar los valores de las salidas siguientes:

    • cmdToConnectToCluster
    • appDeploymentTemplateYaml si la implementación no incluye una aplicación. Es decir, ha seleccionado No en ¿Quiere implementar una aplicación? al implementar la oferta de Marketplace.
    • appDeploymentYaml si la implementación incluye una aplicación. Es decir, ha seleccionado en ¿Quiere implementar una aplicación?.

    Pegue el valor de appDeploymentTemplateYaml o appDeploymentYaml en un shell de Bash, anexe | grep secretName y ejecute el comando.

    La salida de este comando es el nombre del secreto de TLS de entrada, como - secretName: secret785e2c. Guarde el valor de secretName.

Usará estos valores más adelante en este artículo. Tenga en cuenta que en las salidas se enumeran otros comandos útiles.

Creación de una instancia de Azure SQL Database

Para crear una base de datos única de Azure SQL Database a fin de usarla con la aplicación, siga los pasos descritos en Inicio rápido: Creación de una base de datos única en Azure SQL Database. Tenga en cuenta las siguientes diferencias:

  • En el paso Aspectos básicos, anote los valores de Grupo de recursos, Nombre de la base de datos, <server-name>.database.windows.net, Inicio de sesión del administrador del servidor y Contraseña. En este artículo se hace referencia al valor Grupo de recursos de la base de datos como <db-resource-group>.

  • En el paso Redes, establezca Método de conectividad en Punto de conexión público, establezca Permitir que los servicios y recursos de Azure accedan a este servidor en y establezca Agregar dirección IP de cliente actual en .

    Captura de pantalla de Azure Portal que muestra la pestaña Redes de la página Crear base de datos SQL con la configuración de reglas de firewall y método de conectividad resaltada.

Nota:

El nivel de proceso sin servidor seleccionado para esta base de datos ahorra dinero colocando la base de datos en suspensión durante períodos de inactividad. Se producirá un error en la aplicación de ejemplo si la base de datos está inactiva cuando se inicia la aplicación.

Para forzar la reactivación de la base de datos, puede ejecutar una consulta mediante el editor de consultas. Siga los pasos descritos en Consultar la base de datos. Esta es una consulta de ejemplo: SELECT * FROM COFFEE;.

Cree una variable de entorno en el shell para el nombre del grupo de recursos de la base de datos:

export DB_RESOURCE_GROUP_NAME=<db-resource-group>

Ahora que ha creado la base de datos y el clúster de AKS, puede continuar con la preparación de AKS para hospedar la aplicación Open Liberty.

Configuración e implementación de la aplicación de ejemplo

Siga los pasos que aparecen en esta sección para implementar la aplicación de ejemplo en el entorno de ejecución de Liberty. Esos pasos usan Maven.

Extracción de la aplicación

Clone el código de ejemplo de este artículo. El ejemplo se encuentra en GitHub.

Hay algunos ejemplos en el repositorio. En este artículo se usa java-app/. Ejecute los siguientes comandos para obtener el ejemplo:

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
export BASE_DIR=$PWD
git checkout 20240220

Si ve un mensaje sobre estar en estado "HEAD desasociado", es seguro omitir este mensaje. El mensaje simplemente significa que ha extraído una etiqueta del repositorio.

Esta es la estructura de archivos de la aplicación:

java-app
├─ src/main/
│  ├─ aks/
│  │  ├─ db-secret.yaml
│  │  ├─ openlibertyapplication-agic.yaml
│  │  ├─ openlibertyapplication.yaml
│  │  ├─ webspherelibertyapplication-agic.yaml
│  │  ├─ webspherelibertyapplication.yaml
│  ├─ docker/
│  │  ├─ Dockerfile
│  │  ├─ Dockerfile-wlp
│  ├─ liberty/config/
│  │  ├─ server.xml
│  ├─ java/
│  ├─ resources/
│  ├─ webapp/
├─ pom.xml

Los directorios java, resources y webapp contienen el código fuente de la aplicación de ejemplo. El código declara y usa un origen de datos denominado jdbc/JavaEECafeDB.

En el directorio aks, hay cinco archivos de implementación:

  • db-secret.xml: use este archivo para crear secretos de Kubernetes con credenciales de conexión de base de datos.
  • openlibertyapplication-agic.yaml: use este archivo para implementar la aplicación Open Liberty con AGIC. En este artículo se da por supuesto que usa este archivo.
  • openlibertyapplication.yaml: use este archivo si quiere implementar la aplicación Open Liberty sin AGIC.
  • webspherelibertyapplication-agic.yaml: use este archivo para implementar la aplicación WebSphere Liberty con AGIC si ha implementado el operador de WebSphere Liberty anteriormente en este artículo.
  • webspherelibertyapplication.yaml: use este archivo para implementar la aplicación WebSphere Liberty sin AGIC si ha implementado el operador de WebSphere Liberty anteriormente en este artículo.

En el directorio docker, hay dos archivos para crear la imagen de aplicación:

  • Dockerfile: use este archivo para compilar la imagen de aplicación con Open Liberty en este artículo.
  • Dockerfile-wlp: use este archivo para compilar la imagen de aplicación con WebSphere Liberty si ha implementado el operador de WebSphere Liberty anteriormente en este artículo.

En el directorio liberty/config, use el archivo server.xml para configurar la conexión de base de datos para el clúster de Open Liberty y WebSphere Liberty.

Compilación del proyecto

Ahora que tiene las propiedades necesarias, puede compilar la aplicación. El archivo POM del proyecto lee muchas variables del entorno. Como parte de la compilación de Maven, estas variables se usan para rellenar los valores de los archivos YAML ubicados en src/main/aks. Si lo prefiere, puede hacer algo similar para la aplicación fuera de Maven.

cd $BASE_DIR/java-app
# The following variables are used for deployment file generation into the target.
export LOGIN_SERVER=<Azure-Container-Registry-Login-Server-URL>
export REGISTRY_NAME=<Azure-Container-Registry-name>
export USER_NAME=<Azure-Container-Registry-username>
export PASSWORD='<Azure-Container-Registry-password>'
export DB_SERVER_NAME=<server-name>.database.windows.net
export DB_NAME=<database-name>
export DB_USER=<server-admin-login>@<server-name>
export DB_PASSWORD='<server-admin-password>'
export INGRESS_TLS_SECRET=<ingress-TLS-secret-name>

mvn clean install

(Opcional) Prueba local del proyecto

Ejecute y pruebe el proyecto localmente antes de implementarlo en Azure. Para mayor comodidad, en este artículo se usa liberty-maven-plugin. Para obtener más información sobre liberty-maven-plugin, consulte el artículo Creación de una aplicación web con Maven de Open Liberty.

Para la aplicación, puede hacer algo similar mediante cualquier otro mecanismo, como el entorno de desarrollo local. También puede considerar el uso de la opción liberty:devc destinada al desarrollo con contenedores. Puede obtener más información sobre liberty:devc en la documentación de Open Liberty.

  1. Inicie la aplicación mediante liberty:run. liberty:run también usa las variables de entorno que ha definido anteriormente.

    cd $BASE_DIR/java-app
    mvn liberty:run
    
  2. Si la prueba se completa correctamente, aparece un mensaje similar a [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds en la salida del comando. Vaya a http://localhost:9080/ en el explorador y compruebe que la aplicación es accesible y que todas las funciones hacen su trabajo.

  3. Presione Ctrl+C para detener la aplicación.

Compilación de la imagen para la implementación de AKS

Ahora puede ejecutar el comando docker build para compilar la imagen:

cd $BASE_DIR/java-app/target

docker buildx build --platform linux/amd64 -t javaee-cafe:v1 --pull --file=Dockerfile .

(Opcional) Prueba local de la imagen de Docker

Siga estos pasos para probar la imagen de Docker localmente antes de realizar la implementación en Azure:

  1. Ejecute la imagen usando el siguiente comando. Este comando usa las variables de entorno que ha definido anteriormente.

    docker run -it --rm -p 9080:9080 \
       -e DB_SERVER_NAME=${DB_SERVER_NAME} \
       -e DB_NAME=${DB_NAME} \
       -e DB_USER=${DB_USER} \
       -e DB_PASSWORD=${DB_PASSWORD} \
       javaee-cafe:v1
    
  2. Una vez que se inicie el contenedor, vaya a http://localhost:9080/ en el explorador para acceder a la aplicación.

  3. Presione Ctrl+C para detener la aplicación.

Carga de la imagen en Azure Container Registry

Cargue la imagen compilada en la instancia de Container Registry que creó en la oferta:

docker tag javaee-cafe:v1 ${LOGIN_SERVER}/javaee-cafe:v1
docker login -u ${USER_NAME} -p ${PASSWORD} ${LOGIN_SERVER}
docker push ${LOGIN_SERVER}/javaee-cafe:v1

Implementar y probar la aplicación

Use los siguientes pasos para implementar y probar la aplicación:

  1. Conéctese al clúster de AKS.

    Pegue el valor de cmdToConnectToCluster en un shell y ejecute el comando.

  2. Aplique el secreto de base de datos:

    cd $BASE_DIR/java-app/target
    kubectl apply -f db-secret.yaml
    

    La salida es secret/db-secret-sql created.

  3. Aplique el archivo de implementación:

    kubectl apply -f openlibertyapplication-agic.yaml
    
  4. Espere hasta que todos los pods se reinicien correctamente con el comando siguiente:

    kubectl get pods --watch
    

    Un resultado similar al siguiente ejemplo indica que todos los pods se están ejecutando:

    NAME                                       READY   STATUS    RESTARTS   AGE
    javaee-cafe-cluster-agic-67cdc95bc-2j2gr   1/1     Running   0          29s
    javaee-cafe-cluster-agic-67cdc95bc-fgtt8   1/1     Running   0          29s
    javaee-cafe-cluster-agic-67cdc95bc-h47qm   1/1     Running   0          29s
    
  5. Compruebe los resultados:

    1. Obtenga la dirección del recurso de entrada implementado con la aplicación:

      kubectl get ingress
      

      Copie el valor de ADDRESS de la salida. Este valor es la dirección IP pública de front-end de la instancia de Application Gateway implementada.

    2. Vaya a https://<ADDRESS> para probar la aplicación. Para su comodidad, este comando de shell creará una variable de entorno cuyo valor puede pegar directamente en el explorador:

      export APP_URL=https://$(kubectl get ingress | grep javaee-cafe-cluster-agic-ingress | cut -d " " -f14)/
      echo $APP_URL
      

      Si la página web no se representa correctamente o devuelve un error 502 Bad Gateway, la aplicación sigue empezando en segundo plano. Espere unos minutos y vuelva a intentarlo.

Limpieza de recursos

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

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

Pasos siguientes

Puede obtener más información en estas referencias: