Condividi tramite


Distribuire manualmente un'applicazione Java con Open Liberty o WebSphere Liberty in un cluster servizio Azure Kubernetes (AKS)

Questo articolo fornisce istruzioni dettagliate per la distribuzione manuale di Open/WebSphere Liberty in Azure.

In particolare, questo articolo illustra come eseguire le attività seguenti:

  • Eseguire l'applicazione Java, Java Enterprise Edition (EE), Jakarta EE o MicroProfile nel runtime Open Liberty o WebSphere Liberty.
  • Compila l'immagine Docker dell'applicazione usando le immagini contenitore Liberty con az acr build.
  • Distribuire l'applicazione in contenitori in un cluster del servizio Azure Kubernetes usando un operatore Liberty.

Un operatore Liberty semplifica la distribuzione e la gestione delle applicazioni in esecuzione nei cluster Kubernetes. Con Open Liberty Operator o WebSphere Liberty Operator, è anche possibile eseguire operazioni più avanzate, ad esempio la raccolta di tracce e dump.

Per una soluzione più automatizzata che accelera il percorso verso il servizio Azure Kubernetes usando una soluzione Marketplace disponibile nel portale di Azure, vedere Distribuire un'applicazione Java con Open Liberty/WebSphere Liberty in un cluster del servizio Azure Kubernetes.

Per altre informazioni su Open Liberty, vedere la pagina del progetto Open Liberty. Per altre informazioni su IBM WebSphere Liberty, vedere la pagina del prodotto WebSphere Liberty.

Questo articolo è progettato per facilitare rapidamente la distribuzione. Prima di passare alla produzione, è consigliabile esplorare Tuning Liberty.

Se si è interessati a fornire commenti e suggerimenti o lavorare sugli scenari di migrazione in stretta collaborazione con il team di progettazione che sviluppa WebSphere nelle soluzioni di Azure, compilare questo breve sondaggio sulla migrazione di WebSphere e includere le informazioni di contatto. Il team di responsabili del programma, architetti e ingegneri si metterà immediatamente in contatto con l'utente per avviare una stretta collaborazione.

Prerequisiti

Accedere ad Azure

Se non è già stato fatto, usare la procedura seguente per accedere alla sottoscrizione di Azure:

  1. Aprire l'interfaccia della riga di comando di Azure o PowerShell e quindi accedere usando az login. Per completare il processo di autenticazione, seguire la procedura visualizzata nel terminale. Per altre opzioni di accesso, vedere Accedere ad Azure con la CLI di Azure.

    Nota

    Se sono associati più tenant di Azure alle credenziali di Azure, è necessario specificare il tenant a cui si vuole accedere. È possibile specificare un tenant con l'opzione --tenant , az login --tenant contoso.onmicrosoft.comad esempio .

  2. Trovare la versione e le librerie dipendenti installate tramite az version.

  3. Eseguire l'aggiornamento alla versione più recente usando az upgrade.

Nota

Quando si usa l'interfaccia della riga di comando di Azure, se viene richiesto di installare un'estensione dell'interfaccia della riga di comando di Azure, eseguire questa operazione. Per altre informazioni sulle estensioni, vedere Usare e gestire le estensioni con l'interfaccia della riga di comando di Azure.

È possibile eseguire la maggior parte dei comandi dell'interfaccia della riga di comando di Azure in PowerShell come in Bash. La differenza esiste solo quando si usano variabili. Nelle sezioni seguenti la differenza viene risolta in schede diverse quando necessario.

Creare un gruppo di risorse

Un gruppo di risorse di Azure è un gruppo logico in cui le risorse di Azure vengono distribuite e gestite.

Creare un gruppo di risorse chiamato java-liberty-project usando az group create nella eastus2 posizione. Questo gruppo di risorse viene utilizzato successivamente per creare l'istanza di Azure Container Registry e il cluster AKS.

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

Creare un'istanza del registro di container

Usare az acr create per creare l'istanza del registro dei contenitori. Nell'esempio seguente viene creata un'istanza del registro contenitori denominata <your-unique-ACR-name>. Sostituire questo segnaposto con un valore univoco in Azure.

Nota

Questo articolo usa il meccanismo di autenticazione senza password consigliato per Registro Azure Container. È comunque possibile usare un nome utente e una password con docker login dopo aver usato az acr credential show per ottenere il nome utente e la password. L'uso di un nome utente e di una password è tuttavia meno sicuro dell'autenticazione senza password.

export REGISTRY_NAME=<your-unique-ACR-name>
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic

Dopo un breve periodo di tempo, dovresti visualizzare l'output JSON che contiene le righe seguenti:

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

Recupera il nome del server di accesso per l'istanza del registro dei container. Questo valore è necessario quando si distribuisce l'immagine dell'applicazione nel cluster del servizio Azure Kubernetes in un secondo momento.

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

Creare un cluster AKS

Usare az aks create per creare un cluster AKS, come illustrato nell'esempio seguente. In questo esempio viene creato un cluster del servizio Azure Kubernetes (AKS) denominato myAKSCluster con un nodo e si collega l'istanza del registro contenitori al cluster. Il completamento del comando richiede alcuni minuti.

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

Al termine del comando, restituisce informazioni in formato JSON sul cluster, incluso l'output seguente:

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

Connetti al cluster AKS

Usare la procedura seguente per gestire il cluster Kubernetes:

  1. Installare kubectl, il client della riga di comando di Kubernetes usando az aks install-cli, come illustrato nell'esempio seguente:

    az aks install-cli
    
  2. Usare az aks get-credentials per configurare kubectl per connettersi al cluster Kubernetes. Questo comando scarica le credenziali e configura l'interfaccia della riga di comando di Kubernetes per usarle, come illustrato nell'esempio seguente:

    Nota

    Il comando usa il percorso predefinito per il file di configurazione di Kubernetes, ovvero ~/.kube/config. È possibile specificare un percorso diverso per il file di configurazione kubernetes usando --file.

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --overwrite-existing \
        --admin
    
  3. Verificare la connessione al cluster usando kubectl get per restituire un elenco dei nodi del cluster, come illustrato nell'esempio seguente:

    kubectl get nodes
    

    L'esempio di output seguente mostra il nodo singolo creato nei passaggi precedenti. Assicurarsi che lo stato del nodo sia Ready:

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

Creare un database SQL di Azure

Creare un database singolo del database SQL di Azure per l'app seguendo questa procedura:

  1. Usare i comandi seguenti per impostare le variabili di ambiente correlate al database. Sostituire <your-unique-sql-server-name> con un nome univoco per il server database SQL di Azure.

    export SQL_SERVER_NAME=<your-unique-sql-server-name>
    export DB_NAME=demodb
    
  2. Usare i comandi seguenti per creare un singolo database e impostare l'utente connesso corrente come amministratore di Microsoft Entra. Per altre informazioni, vedere Avvio rapido: Creare un database singolo - Database SQL di Azure.

    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

Si crea un server SQL di Azure con autenticazione SQL disabilitata per considerazioni sulla sicurezza. Solo l'ID Microsoft Entra viene usato per eseguire l'autenticazione al server. Per altre informazioni sull'abilitazione dell'autenticazione SQL, vedere az sql server create.

Creare una connessione al servizio in AKS con Service Connector

Usare i comandi seguenti per creare una connessione tra il cluster AKS e il database SQL utilizzando il Microsoft Entra Workload ID con Service Connector. Per ulteriori informazioni, vedere Creare una connessione di servizio in 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

Messaggi di errore della risoluzione dei problemi

Se il az aks connection create sql comando genera un messaggio di errore, trovare il messaggio di errore nell'elenco seguente e quindi usare le istruzioni per risolvere il problema:

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

    Questo messaggio di errore indica che il pyodbc pacchetto non può essere installato, probabilmente a causa di problemi di autorizzazioni. Risolvere il problema attenendosi alla procedura seguente:

    1. Trovare il percorso di Python che funziona con l'interfaccia della riga di comando di Azure eseguendo il comando seguente:

      az --version
      

      L'output deve contenere Python location , ad esempio . Python location '/opt/az/bin/python3'

    2. Copiare il valore Python location.

    3. Per installare il pacchetto pyodbc in modalità sudo, usare il comando seguente. Sostituire <python-location> con il percorso Python copiato nel passaggio precedente.

      sudo <python-location> -m pip install pyodbc
      
  • libodbc.so: impossibile aprire il file oggetto condiviso: nessun file o directory di questo tipo

  • Si prega di installare manualmente odbc 17/18 per SQL Server

    Questi errori indicano che il odbc driver non è installato. Risolvere il problema attenendosi alla procedura seguente:

    Nota

    È consigliabile usare l'ID del carico di lavoro Microsoft Entra per proteggere l'accesso al database SQL di Azure senza usare l'autenticazione SQL. Se è necessario usare l'autenticazione SQL, ignorare i passaggi descritti in questa sezione e usare il nome utente e la password per connettersi al database SQL di Azure.

    1. Se usi Linux, apri Installa il driver ODBC di Microsoft per SQL Server (Linux). Se si usa MacOS, aprire Installare il driver MICROSOFT ODBC per SQL Server (macOS).

    2. Seguire le istruzioni per installare Microsoft ODBC Driver (18 o 17) per SQL Server.

    3. Usare az aks connection create sql di nuovo per creare la connessione al servizio, come illustrato nell'esempio seguente:

      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
      

Ottenere l'account di servizio e la chiave segreta creati da Service Connector

Per eseguire l'autenticazione con il database SQL di Azure, seguire questa procedura:

  1. Ottenere l'account del servizio e il segreto creati da Service Connector seguendo le istruzioni nella sezione Aggiorna il tuo contenitore dell'Esercitazione: Connettere un'app AKS a un database SQL di Azure. Usare l'opzione per creare direttamente una distribuzione usando il frammento di codice di esempio YAML fornito.

    Nota

    Il segreto creato da Service Connector contiene un AZURE_SQL_CONNECTIONSTRING valore, ovvero una stringa di connessione senza password al database SQL di Azure. Per ulteriori informazioni, vedere il valore di esempio nella sezione identità gestita assegnata dall'utente di Integrare il database SQL di Azure con il connettore di servizio.

  2. Dalle sezioni evidenziate nell'esempio di distribuzione YAML di Kubernetes, copiare i valori serviceAccountName e secretRef.name, come illustrato nell'esempio seguente.

    serviceAccountName: <service-account-name>
    containers:
    - name: raw-linux
       envFrom:
          - secretRef:
             name: <secret-name>
    
  3. Definire le variabili di ambiente usando i comandi seguenti. Assicurarsi di sostituire <service-account-name> e <secret-name> con i valori copiati nel passaggio precedente:

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

    Questi valori vengono usati nella sezione successiva per distribuire l'applicazione Liberty nel cluster del servizio Azure Kubernetes.

Installare l'operatore Open Liberty

In questa sezione si installa Open Liberty Operator nel cluster del servizio Azure Kubernetes per ospitare l'applicazione Liberty.

Installare Open Liberty Operator usando i comandi seguenti:

# 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

Configurare e compilare l'immagine dell'applicazione

Per distribuire ed eseguire l'applicazione Liberty nel cluster AKS, containerizza l'applicazione come immagine Docker utilizzando immagini Open Liberty o immagini WebSphere Liberty.

Seguire i passaggi descritti in questa sezione per distribuire l'applicazione di esempio nel runtime Liberty. Questi passaggi usano Maven.

Consultare l'applicazione

Clonare il codice di esempio per questa guida usando i comandi seguenti. L'esempio è disponibile nel repository GitHub Open Liberty/WebSphere Liberty in Azure Kubernetes Service Samples , che contiene alcuni esempi. Questo articolo usa l'esempio 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

Se viene visualizzato un messaggio relativo allo stato di detached HEAD, questo messaggio è sicuro da ignorare. Significa semplicemente che hai controllato un tag. La clonazione del repository crea la struttura di file seguente:

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

Le directory java, resources e webapp contengono il codice sorgente dell'applicazione di esempio. Il codice dichiara e usa un'origine dati denominata jdbc/JavaEECafeDB.

Nella directory aks, il file openlibertyapplication-passwordless-db.yaml viene utilizzato per distribuire l'immagine dell'applicazione. Nella directory docker sono disponibili due file per creare l'immagine dell'applicazione con Open Liberty o WebSphere Liberty.

Nella directory liberty/config il fileserver.xml viene usato per configurare la connessione di database per il cluster Open Liberty e WebSphere Liberty. Definisce una azure.sql.connectionstring variabile usata per connettersi al database SQL di Azure.

Il file pom.xml è il file POM (Project Object Model) di Maven che contiene le informazioni di configurazione per il progetto. Il file pom-azure-identity.xml dichiara la dipendenza azure-identity, usata per eseguire l'autenticazione ai servizi di Azure usando l'ID Microsoft Entra.

Nota

Questo esempio usa la libreria di azure-identity per eseguire l'autenticazione nel database SQL di Azure usando l'autenticazione Microsoft Entra, consigliata per considerazioni sulla sicurezza. Per altre informazioni sull'uso dell'autenticazione SQL nell'applicazione Liberty, vedere Connessioni di database relazionali con JDBC (Java Database Connectivity).

Compilare il progetto

Dopo aver raccolto le proprietà necessarie, compilare l'applicazione usando i comandi seguenti. Il file POM per il progetto legge molte variabili dall'ambiente. Come parte della compilazione Maven, queste variabili vengono usate per popolare i valori nei file YAML che si trovano in src/main/aks. Se si preferisce, è possibile eseguire operazioni simili per l'applicazione all'esterno di 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

Creare l'immagine per il deployment di AKS

Usare az acr build per compilare l'immagine, come illustrato nell'esempio seguente:

cd $BASE_DIR/java-app/target

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

Il az acr build comando carica gli artefatti specificati nel Dockerfile nell'istanza del registro contenitori, compila l'immagine e la archivia nell'istanza del registro contenitori.

Distribuire l'applicazione nel cluster del servizio Azure Kubernetes

Usare la procedura seguente per distribuire l'applicazione Liberty nel cluster del servizio Azure Kubernetes:

  1. Applicare il file di distribuzione usando i comandi seguenti:

    cd $BASE_DIR/java-app/target
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication-passwordless-db.yaml
    
  2. Determinare se l'istanza OpenLibertyApplication viene creata usando il comando seguente:

    kubectl get openlibertyapplication javaee-cafe-cluster --watch
    

    L'output seguente è tipico. Usare CTRL+C per uscire.

    NAME                  IMAGE                                        EXPOSED   RECONCILED   RESOURCESREADY   READY   WARNING   AGE
    javaee-cafe-cluster   <registry-name>.azurecr.io/javaee-cafe:v1              True         True             True              57s
    
  3. Determinare se la distribuzione creata dall'operatore è pronta usando il comando seguente:

    kubectl get deployment javaee-cafe-cluster --watch
    

    L'output seguente è tipico:

    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-cluster         0/3     3            0           20s
    
  4. Attendere che appaia 3/3 nella colonna READY e 3 nella colonna AVAILABLE, quindi usare Ctrl+C per arrestare il processo kubectl.

Testare l'applicazione

Quando l'applicazione viene eseguita, un servizio di bilanciamento del carico Kubernetes espone il front-end dell'applicazione a Internet. Il completamento di questo processo può richiedere del tempo.

Usare kubectl get service per ottenere l'indirizzo IP esterno del servizio quando è disponibile, come illustrato nell'esempio seguente:

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

Nota

Se non viene visualizzato un URL valido dall'output, attendere un po' di tempo ed eseguire di nuovo il comando.

Aprire l'URL in un Web browser e controllare la home page dell'applicazione. Se la pagina non viene caricata correttamente, aggiornare la pagina in un secondo momento, dopo l'avvio dell'app. Dovresti vedere il nome del pod delle repliche dell'applicazione visualizzato in alto a sinistra nella pagina. Attendere alcuni minuti e aggiornare la pagina per visualizzare un nome di pod diverso a causa del bilanciamento del carico fornito dal cluster AKS.

Screenshot della pagina iniziale dell'applicazione Java Liberty.

Nota

Attualmente, l'applicazione non usa HTTPS. È consigliabile abilitare Transport Layer Security (TLS) con certificati personalizzati. Per ulteriori informazioni, vedere Usare TLS con un controller di ingresso su Azure Kubernetes Service (AKS).

Pulire le risorse

Per evitare addebiti per Azure, è necessario eliminare le risorse non necessarie. Quando il cluster non è più necessario, usare az group delete per rimuovere il gruppo di risorse, il servizio contenitore, il registro contenitori, il database e tutte le risorse correlate.

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

Passaggi successivi

Per altre informazioni, vedere i riferimenti seguenti usati in questa guida:

Per incorporare Cache Redis di Azure in un'app Java, vedere Avvio rapido: Usare Cache Redis di Azure in Java con il client Redisson Redis.

Per esplorare le opzioni per eseguire prodotti WebSphere in Azure, vedere Quali sono le soluzioni per eseguire la famiglia di prodotti WebSphere in Azure?