Implementación 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 explica cómo:

  • Ejecutar una aplicación Java, Java EE, Yakarta EE o Microprofile en el runtime en Open Liberty o WebSphere Liberty.
  • Compilar la imagen de Docker de la aplicación mediante imágenes de contenedor de Open Liberty.
  • Implementar la aplicación contenedorizada en un clúster de AKS mediante el operador de Open 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 este operador también puede realizar operaciones más avanzadas, como recopilar seguimientos y volcados.

Para más detalles sobre Open Liberty, consulte la página del proyecto Open Liberty. Para obtener más información sobre IBM WebSphere Liberty, consulte la página del producto WebSphere Liberty.

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

Requisitos previos

  • Use el entorno de Bash en Azure Cloud Shell.

    Iniciar Cloud Shell en una nueva ventana

  • Si lo prefiere, instale la CLI de Azure para ejecutar sus comandos de referencia.

    • Si usa una instalación local, 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.

    • Cuando 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.

  • 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 de forma local (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 (por ejemplo, AdoptOpenJDK OpenJDK 8 LTS/OpenJ9).
    • Instale Maven 3.5.0 o una versión superior.
    • Instale Docker para el sistema operativo.

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.

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",

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 -n $REGISTRY_NAME --query 'loginServer' -o tsv)
export USER_NAME=$(az acr credential show -n $REGISTRY_NAME --query 'username' -o tsv)
export PASSWORD=$(az acr credential show -n $REGISTRY_NAME --query 'passwords[0].value' -o tsv)

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

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

Creación de un clúster de AKS

Use el comando az aks create para crear un clúster de AKS. En el siguiente ejemplo se crea un clúster denominado myAKSCluster con un nodo. Este proceso tardará varios minutos en completarse.

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

Transcurridos unos minutos, el comando se completa y devuelve información en formato JSON sobre el clúster, incluida la siguiente:

  "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

Nota

El comando anterior usa la ubicación predeterminada para el archivo de configuración de Kubernetes, ~/.kube/config. Puede especificar otra ubicación para el archivo de configuración de Kubernetes con la opción --file.

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.

OPERATOR_NAMESPACE=default
WATCH_NAMESPACE='""'

# Install Custom Resource Definitions (CRDs) for OpenLibertyApplication
kubectl apply -f https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-crd.yaml

# Install cluster-level role-based access
curl -L https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-cluster-rbac.yaml \
      | sed -e "s/OPEN_LIBERTY_OPERATOR_NAMESPACE/${OPERATOR_NAMESPACE}/" \
      | kubectl apply -f -

# Install the operator
curl -L https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/master/deploy/releases/0.7.1/openliberty-app-operator.yaml \
      | sed -e "s/OPEN_LIBERTY_WATCH_NAMESPACE/${WATCH_NAMESPACE}/" \
      | kubectl apply -n ${OPERATOR_NAMESPACE} -f -

Creación de la imagen de la aplicación

Para implementar y ejecutar la aplicación de Liberty en un clúster de AKS, incluya en un contenedor la aplicación como una imagen de Docker mediante las imágenes de contenedor de Open Liberty o las imágenes de contenedor de WebSphere Liberty.

  1. Clone el código de ejemplo de esta guía. El ejemplo se encuentra en GitHub.

  2. Cambie el directorio a javaee-app-simple-cluster del clon local.

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

  4. Ejecute mvn liberty:dev para probar la aplicación. Si el resultado de la operación es satisfactorio, debería ver The defaultServer server is ready to run a smarter planet. en la salida del comando. Use CTRL-C para detener la aplicación.

  5. Recupere los valores de las propiedades artifactId y version definidas en pom.xml.

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

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

    • Compile con la imagen de base de Open Liberty si prefiere usar Open Liberty como Java™ Runtime ligero de 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 .
      
    • Compile con la imagen de 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 --file=Dockerfile-wlp .
      

Implementación de una aplicación en el clúster de AKS

Siga los pasos que se indican a continuación para implementar la aplicación de Liberty en el clúster de AKS.

  1. Cree un secreto de extracción para que el clúster de AKS se autentique para extraer la imagen de la instancia de ACR.

    kubectl create secret docker-registry acr-secret \
       --docker-server=${LOGIN_SERVER} \
       --docker-username=${USER_NAME} \
       --docker-password=${PASSWORD}
    
  2. Compruebe que el directorio de trabajo actual sea javaee-app-simple-cluster/target del clon local.

  3. Ejecute 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.

    # Create OpenLibertyApplication "javaee-cafe-cluster"
    kubectl apply -f openlibertyapplication.yaml
    
    openlibertyapplication.openliberty.io/javaee-cafe-cluster created
    
    # Check if OpenLibertyApplication instance is created
    kubectl get openlibertyapplication ${artifactId}-cluster
    
    NAME                        IMAGE                                                   EXPOSED   RECONCILED   AGE
    javaee-cafe-cluster         youruniqueacrname.azurecr.io/javaee-cafe:1.0.25         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-cluster         0/3     3            0           20s
    
  4. Espere hasta ver 3/3 en la columna READY y 3 en la columna AVAILABLE, use CTRL-C para detener el proceso de inspección 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-cluster         LoadBalancer   10.0.251.169   52.152.189.57   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 kubectl proceso de inspección.

Abra un explorador web en la dirección IP externa del servicio (52.152.189.57 en el ejemplo anterior) para ver la página principal de 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 ver otro nombre de pod debido al equilibrio de carga proporcionado por el clúster de AKS.

Aplicación de Liberty de Java implementada correctamente en AKS

Nota

Limpiar los 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

Pasos siguientes

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