Compartir a través de


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

En este artículo se proporcionan instrucciones paso a paso para implementar manualmente Open/WebSphere Liberty en Azure.

En concreto, en este artículo se explica cómo realizar las siguientes tareas:

  • Ejecute la aplicación Java, Java Enterprise Edition (EE), Jakarta EE o MicroProfile en el entorno de ejecución de Open Liberty o WebSphere Liberty.
  • Crea la imagen de Docker de la aplicación con az acr build utilizando imágenes de contenedor de Liberty.
  • Implemente la aplicación en contenedor en un clúster de Azure Kubernetes Service (AKS) mediante un operador Liberty.

Un operador Liberty simplifica la implementación y administración de 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.

Para obtener una solución más automatizada que acelere el recorrido a AKS mediante una solución de Marketplace disponible en Azure Portal, consulte Implementación de una aplicación Java con Open Liberty/WebSphere Liberty en un clúster de Azure Kubernetes Service (AKS).

Para más información sobre Open Liberty, consulte la página del proyecto Open Liberty. Para más información sobre IBM WebSphere Liberty, consulte la página del producto de WebSphere 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

Inicio de sesión en Azure

Si aún no lo ha hecho, siga estos pasos para iniciar sesión en la suscripción de Azure:

  1. Abra la CLI de Azure o PowerShell e inicie sesión con 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.

    Nota:

    Si hay varios inquilinos de Azure asociados a sus credenciales de Azure, debe indicar en qué inquilino desea iniciar sesión. Puede especificar un inquilino con la --tenant opción , por ejemplo, az login --tenant contoso.onmicrosoft.com.

  2. Busque la versión y las bibliotecas dependientes que se instalan mediante az version.

  3. Actualice a la versión más reciente mediante az upgrade.

Nota:

Al usar la CLI de Azure, si se le pide que instale una extensión de la CLI de Azure, hágalo. Para obtener más información sobre las extensiones, consulte Uso y administración de extensiones con la CLI de Azure.

Puede ejecutar la mayoría de los comandos de la CLI de Azure en PowerShell igual que en Bash. La diferencia solo existe cuando se usan variables. En las secciones siguientes, la diferencia se aborda en diferentes pestañas cuando sea necesario.

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 llamado java-liberty-project mediante az group create en la eastus2 ubicación. Este grupo de recursos se usa más adelante para crear la instancia de Azure Container Registry y el clúster de AKS.

export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --___location eastus2

Creación de una instancia de registro de contenedor

Use az acr create para crear la instancia del registro de contenedor. En el ejemplo siguiente se crea una instancia de registro de contenedor denominada <your-unique-ACR-name>. Reemplace este marcador de posición por un valor único en Azure.

Nota:

En este artículo se usa el mecanismo de autenticación sin contraseña recomendado para Azure Container Registry. Todavía es posible usar un nombre de usuario y una contraseña con docker login después de usar az acr credential show para obtener el nombre de usuario y la contraseña. Sin embargo, el uso de un nombre de usuario y contraseña es menos seguro que la autenticación sin contraseña.

export REGISTRY_NAME=<your-unique-ACR-name>
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 las siguientes líneas:

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

Recupere el nombre del servidor de inicio de sesión para la instancia del registro de contenedor. Necesitará este valor al implementar la imagen de aplicación en el clúster de AKS más adelante.

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)

Creación de un clúster de AKS

Use az aks create para crear un clúster de AKS, como se muestra en el ejemplo siguiente. En este ejemplo se crea un clúster de AKS denominado myAKSCluster con un nodo y se adjunta la instancia del registro de contenedor a él. 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 \
    --node-vm-size Standard_DS2_V2 \
    --generate-ssh-keys \
    --enable-managed-identity \
    --attach-acr $REGISTRY_NAME

Una vez completado el comando, devuelve información con formato JSON sobre el clúster, incluida la siguiente salida:

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

Conexión al clúster de AKS

Siga estos pasos para administrar el clúster de Kubernetes:

  1. Instale kubectl, el cliente de línea de comandos de Kubernetes, mediante az aks install-cli, como se muestra en el ejemplo siguiente:

    az aks install-cli
    
  2. Use az aks get-credentials para configurar kubectl para conectarse al clúster de Kubernetes. Este comando descarga las credenciales y configura la CLI de Kubernetes para usarlas, como se muestra en el ejemplo siguiente:

    Nota:

    El comando usa la ubicación predeterminada para el archivo de configuración de Kubernetes, que es ~/.kube/config. Puede especificar una ubicación diferente para el archivo de configuración de Kubernetes mediante --file.

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --overwrite-existing \
        --admin
    
  3. Compruebe la conexión al clúster mediante kubectl get para devolver una lista de los nodos del clúster, como se muestra en el ejemplo siguiente:

    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 Ready:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    <none>  76s     v1.29.9
    

Crear una base de datos de Azure SQL

Cree una base de datos única de Azure SQL Database para la aplicación mediante los pasos siguientes:

  1. Use los siguientes comandos para establecer variables de entorno relacionadas con la base de datos. Reemplace <your-unique-sql-server-name> por un nombre único para el servidor de Azure SQL Database.

    export SQL_SERVER_NAME=<your-unique-sql-server-name>
    export DB_NAME=demodb
    
  2. Use los siguientes comandos para crear una base de datos única y establecer el usuario que ha iniciado sesión actual como administrador de Microsoft Entra. Para más información, consulte Inicio rápido: Creación de una base de datos única: Azure SQL Database.

    export ENTRA_ADMIN_NAME=$(az account show \
        --query user.name \
        --output tsv)
    
    az sql server create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $SQL_SERVER_NAME \
        --enable-ad-only-auth \
        --external-admin-principal-type User \
        --external-admin-name $ENTRA_ADMIN_NAME \
        --external-admin-sid $(az ad signed-in-user show --query id --output tsv)
    
    az sql db create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $DB_NAME \
        --server $SQL_SERVER_NAME \
        --edition GeneralPurpose \
        --compute-model Serverless \
        --family Gen5 \
        --capacity 2
    

Nota:

Cree un servidor SQL de Azure con la autenticación SQL deshabilitada por consideraciones de seguridad. Solo microsoft Entra ID se usa para autenticarse en el servidor. Para obtener más información sobre cómo habilitar la autenticación de SQL, consulte az sql server create.

Creación de una conexión de servicio en AKS con Service Connector

Use los comandos siguientes para crear una conexión entre el clúster de AKS y la base de datos SQL mediante el identificador de carga de trabajo de Microsoft Entra con Service Connector. Para más información, consulte Creación de una conexión de servicio en AKS con Service Connector.

# Register the Service Connector and Kubernetes Configuration resource providers
az provider register --namespace Microsoft.ServiceLinker --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait

# Install the Service Connector passwordless extension
az extension add \
    --name serviceconnector-passwordless \
    --upgrade \
    --allow-preview true

# Retrieve the AKS cluster and Azure SQL Server resource IDs
export AKS_CLUSTER_RESOURCE_ID=$(az aks show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --query id \
    --output tsv)

export AZURE_SQL_SERVER_RESOURCE_ID=$(az sql server show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $SQL_SERVER_NAME \
    --query id \
    --output tsv)

# Create a user-assigned managed identity used for workload identity
export USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami
az identity create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME}

# Retrieve the user-assigned managed identity resource ID
export UAMI_RESOURCE_ID=$(az identity show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME} \
    --query id \
    --output tsv)

# Create a service connection between your AKS cluster and your SQL database using Microsoft Entra Workload ID
az aks connection create sql \
    --connection akssqlconn \
    --client-type java \
    --source-id $AKS_CLUSTER_RESOURCE_ID \
    --target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \
    --workload-identity $UAMI_RESOURCE_ID

Solucionar problemas de mensajes de error

Si el az aks connection create sql comando genera un mensaje de error, busque el mensaje de error en la lista siguiente y, a continuación, use las instrucciones para solucionar el problema:

  • Dependency pyodbc can't be installed, please install it manually

    Este mensaje de error indica que el pyodbc paquete no se puede instalar, lo más probable es que se deba a problemas de permisos. Corrija el problema mediante los pasos siguientes:

    1. Para buscar la ubicación de Python que funciona con la CLI de Azure, ejecute el siguiente comando:

      az --version
      

      La salida debe contener Python ___location , por ejemplo, Python ___location '/opt/az/bin/python3'.

    2. Copie el valor Python ___location.

    3. Para instalar el paquete pyodbc en modo sudo, use el siguiente comando. Reemplace por <python-___location> la ubicación de Python que copió en el paso anterior.

      sudo <python-___location> -m pip install pyodbc
      
  • libodbc.so: no se puede abrir el archivo de objeto compartido: no se puede abrir este archivo o directorio.

  • Instale manualmente odbc 17/18 para SQL Server.

    Estos errores indican que el odbc controlador no está instalado. Corrija el problema mediante los pasos siguientes:

    Nota:

    Debe usar el identificador de carga de trabajo de Microsoft Entra para el acceso seguro a azure SQL Database sin usar la autenticación de SQL. Si necesita usar la autenticación de SQL, omita los pasos descritos en esta sección y use el nombre de usuario y la contraseña para conectarse a Azure SQL Database.

    1. Si usa Linux, abra Instalar el controlador ODBC de Microsoft para SQL Server (Linux). Si usa MacOS, abra Instalar el controlador ODBC de Microsoft para SQL Server (macOS).

    2. Siga las instrucciones para instalar Microsoft ODBC Driver (18 o 17) para SQL Server.

    3. Use az aks connection create sql de nuevo para crear la conexión de servicio, como se muestra en el ejemplo siguiente:

      az aks connection create sql \
          --connection akssqlconn \
          --client-type java \
          --source-id $AKS_CLUSTER_RESOURCE_ID \
          --target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \
          --workload-identity $UAMI_RESOURCE_ID
      

Obtener la cuenta de servicio y el secreto creados por Service Connector

Para autenticarse con Azure SQL Database, siga estos pasos:

  1. Obtenga la cuenta de servicio y el secreto creados por Service Connector siguiendo las instrucciones de la sección Actualización del contenedor de Tutorial: Conexión de una aplicación de AKS a Azure SQL Database. Use la opción para crear directamente una implementación mediante el fragmento de código de ejemplo de YAML proporcionado.

    Nota:

    El secreto creado por Service Connector contiene un AZURE_SQL_CONNECTIONSTRING valor, que es una cadena de conexión sin contraseña a Azure SQL Database. Para obtener más información, consulte el valor de ejemplo de la sección identidad administrada asignada por el usuario de Integración de Azure SQL Database con Service Connector.

  2. En las secciones resaltadas del ejemplo de YAML de implementación de Kubernetes, copie los valores serviceAccountName y secretRef.name, como se muestra en el ejemplo siguiente.

    serviceAccountName: <service-account-name>
    containers:
    - name: raw-linux
       envFrom:
          - secretRef:
             name: <secret-name>
    
  3. Defina variables de entorno mediante los siguientes comandos. Asegúrese de reemplazar <service-account-name> y <secret-name> por los valores que copió en el paso anterior:

    export SERVICE_ACCOUNT_NAME=<service-account-name>
    export SECRET_NAME=<secret-name>
    

    Estos valores se usan en la sección siguiente para implementar la aplicación Liberty en el clúster de AKS.

Instalación del operador Open Liberty

En esta sección, instalará el operador open Liberty en el clúster de AKS para hospedar la aplicación Liberty.

Instale el operador Open Liberty mediante los siguientes comandos:

Nota:

Esta guía le dirige a instalar el operador Open Liberty. Para usar el operador WebSphere Liberty, consulte Instalación del operador WebSphere Liberty con la CLI de Kubernetes.

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

# Install the Open Liberty Operator
export OPERATOR_VERSION=1.4.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

# Remove the downloaded files
rm -rf overlays base

Configuración y compilación de la imagen de aplicación

Para implementar y ejecutar su aplicación Liberty en el clúster de AKS, containerice su aplicación como una imagen de Docker utilizando imágenes de Open Liberty o imágenes de contenedor de WebSphere Liberty.

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

Echa un vistazo a la aplicación

Clone el código de ejemplo de esta guía mediante los siguientes comandos. El ejemplo se encuentra en el repositorio de GitHub Open Liberty/WebSphere Liberty en azure Kubernetes Service Samples , que contiene algunos ejemplos. Este artículo utiliza la muestra java-app.

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

Si ve un mensaje sobre estar en el estado detached HEAD, este mensaje puede ser ignorado con seguridad. Solo significa que ha extraído una etiqueta del repositorio. La clonación del repositorio crea la siguiente estructura de archivos:

java-app
├─ src/main/
│  ├─ aks/
│  │  ├─ openlibertyapplication-passwordless-db.yaml
│  ├─ docker/
│  │  ├─ Dockerfile
│  │  ├─ Dockerfile-wlp
│  ├─ liberty/config/
│  │  ├─ server.xml
│  ├─ java/
│  ├─ resources/
│  ├─ webapp/
├─ pom.xml
├─ pom-azure-identity.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 , el archivo openlibertyapplication-passwordless-db.yaml se usa para implementar la imagen de aplicación. En el directorio docker, hay dos archivos para crear la imagen de aplicación con Open Liberty o WebSphere Liberty.

En el directorio liberty/config, el archivo server.xml se usa para configurar la conexión de base de datos para el clúster de Open Liberty y WebSphere Liberty. Define una azure.sql.connectionstring variable que se usa para conectarse a Azure SQL Database.

El archivo pom.xml es el archivo del modelo de objetos de proyecto (POM) de Maven que contiene la información de configuración del proyecto. El archivo pom-azure-identity.xml declara la dependencia azure-identity, que se usa para autenticarse en los servicios de Azure mediante el identificador de Microsoft Entra.

Nota:

En este ejemplo se usa la biblioteca de azure-identity para autenticarse en Azure SQL Database mediante la autenticación de Microsoft Entra, que se recomienda para tener en cuenta las consideraciones de seguridad. Para obtener más información sobre el uso de la autenticación de SQL en la aplicación Liberty, consulte Conexiones de bases de datos relacionales con la conectividad de base de datos java (JDBC) .

Construir el proyecto

Ahora que ha recopilado las propiedades necesarias, compile la aplicación mediante los siguientes comandos. 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 target/
export LOGIN_SERVER=${LOGIN_SERVER}
export SC_SERVICE_ACCOUNT_NAME=${SERVICE_ACCOUNT_NAME}
export SC_SECRET_NAME=${SECRET_NAME}

mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources

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

Use az acr build para compilar la imagen, como se muestra en el ejemplo siguiente:

cd $BASE_DIR/java-app/target

az acr build \
    --registry ${REGISTRY_NAME} \
    --image javaee-cafe:v1 \
    .

El az acr build comando carga los artefactos especificados en dockerfile en la instancia del registro de contenedor, compila la imagen y la almacena en la instancia del registro de contenedor.

Implemente la aplicación en el clúster de AKS.

Siga estos pasos para implementar la aplicación de Liberty en el clúster de AKS.

  1. Aplique el archivo de implementación mediante los siguientes comandos:

    cd $BASE_DIR/java-app/target
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication-passwordless-db.yaml
    
  2. Determine si la OpenLibertyApplication instancia se crea mediante el comando siguiente:

    kubectl get openlibertyapplication javaee-cafe-cluster --watch
    

    La salida siguiente es típica. Use Ctrl+C para salir.

    NAME                  IMAGE                                        EXPOSED   RECONCILED   RESOURCESREADY   READY   WARNING   AGE
    javaee-cafe-cluster   <registry-name>.azurecr.io/javaee-cafe:v1              True         True             True              57s
    
  3. Determine si la implementación creada por el operador está lista mediante el comando siguiente:

    kubectl get deployment javaee-cafe-cluster --watch
    

    La salida siguiente es típica:

    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-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 algún tiempo en completarse.

Use kubectl get service para obtener la dirección IP externa del servicio cuando esté disponible, como se muestra en el ejemplo siguiente:

export APP_URL=http://$(kubectl get service javaee-cafe-cluster -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $APP_URL

Nota:

Si no ve una dirección URL válida de la salida, espere un tiempo y vuelva a ejecutar el comando.

Abra la dirección URL en un explorador web y compruebe la página principal de la aplicación. Si la página no se carga correctamente, actualice la página más adelante después de que se inicie la aplicación. Debería ver el nombre de pod de las réplicas de la aplicación en la parte superior izquierda de la página. Espere unos minutos y actualice la página para que se muestre un nombre de pod diferente debido al equilibrio de carga que proporciona el clúster de AKS.

Captura de pantalla de la página principal de la aplicación Java Liberty.

Nota:

Actualmente, la aplicación no usa HTTPS. Se recomienda habilitar la seguridad de la capa de transporte (TLS) con sus propios certificados. Para obtener más información, consulte Uso de TLS con un controlador de entrada en Azure Kubernetes Service (AKS).

Limpieza de recursos

Para evitar los cargos de Azure, se recomienda limpiar los recursos que no sean necesarios. Cuando el clúster ya no sea necesario, use 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

Pasos siguientes

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

Para incorporar Azure Cache for Redis en una aplicación de Java, consulte Inicio rápido: Uso de Azure Cache for Redis en Java con el cliente de Redisson Redis.

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?