Distribuire un'applicazione Java con Open Liberty o WebSphere Liberty in un cluster servizio Azure Kubernetes

Questo articolo illustra come:

  • Eseguire l'applicazione Java, Java edizione Enterprise, Jakarta edizione Enterprise o MicroProfile nel runtime Open Liberty o IBM WebSphere Liberty.
  • Compilare l'immagine Docker dell'applicazione usando immagini contenitore Open Liberty o WebSphere Liberty.
  • Distribuire l'applicazione in contenitori in un cluster servizio Azure Kubernetes (AKS) usando Open Liberty Operator o WebSphere Liberty Operator.

Open Liberty Operator 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.

Questo articolo usa l'offerta di Azure Marketplace per Open Liberty o WebSphere Liberty per accelerare il percorso verso il servizio Azure Kubernetes. L'offerta effettua automaticamente il provisioning di alcune risorse di Azure, tra cui:

  • Istanza di Registro Azure Container.
  • Un cluster servizio Azure Kubernetes.
  • Istanza del controller in ingresso (AGIC) gateway applicazione.
  • Open Liberty Operator e WebSphere Liberty Operator.
  • Facoltativamente, un'immagine del contenitore che include Liberty e l'applicazione.

Se si preferisce indicazioni dettagliate manuali per l'esecuzione di Liberty nel servizio Azure Kubernetes, vedere Distribuire manualmente un'applicazione Java con Open Liberty o WebSphere Liberty in un cluster del servizio Azure Kubernetes servizio Azure Kubernetes.

Questo articolo è progettato per facilitare rapidamente la distribuzione. Prima di passare alla produzione, è consigliabile esplorare la documentazione IBM sull'ottimizzazione di Liberty.

Se non si ha una sottoscrizione di Azure, creare un account Azure gratuito prima di iniziare.

Prerequisiti

Nota

È anche possibile eseguire i comandi in questo articolo da Azure Cloud Shell. Questo approccio include tutti gli strumenti prerequisiti preinstallati, ad eccezione di Docker.

  • Se si eseguono i comandi in questa guida in locale (anziché Azure Cloud Shell):
    • Preparare un computer locale con sistema operativo simile a Unix installato (ad esempio Ubuntu, Azure Linux, macOS, Sottosistema Windows per Linux).
    • Installare un'implementazione java SE, versione 17 o successiva. (ad esempio, Eclipse Open J9).
    • Installare Maven 3.5.0 o versione successiva.
    • Installare Docker per il sistema operativo.
  • Assicurarsi di essere assegnati al ruolo o ai ruoli Owner o Contributor e User Access Administrator nella sottoscrizione. È possibile verificarlo seguendo la procedura descritta in Elencare le assegnazioni di ruolo per un utente o un gruppo.

Creare una distribuzione liberty nel servizio Azure Kubernetes usando il portale

La procedura seguente illustra come creare un runtime Liberty nel servizio Azure Kubernetes. Dopo aver completato questi passaggi, si avrà un'istanza del Registro Container e un cluster del servizio Azure Kubernetes per la distribuzione dell'applicazione in contenitori.

  1. Vai al portale di Azure. Nella casella di ricerca nella parte superiore della pagina immettere IBM Liberty nel servizio Azure Kubernetes. Quando vengono visualizzati i suggerimenti, selezionare l'unica corrispondenza nella sezione Marketplace .

    Se si preferisce, è possibile passare direttamente all'offerta.

  2. Seleziona Crea.

  3. Nel riquadro Informazioni di base:

    1. Creare un nuovo gruppo di risorse. Poiché i gruppi di risorse devono essere univoci all'interno di una sottoscrizione, scegliere un nome univoco. Un modo semplice per avere nomi univoci consiste nell'usare una combinazione delle iniziali, della data odierna e di un identificatore (ad esempio, ejb0913-java-liberty-project-rg).

    2. In Area selezionare Stati Uniti orientali.

    3. Creare una variabile di ambiente nella shell per i nomi dei gruppi di risorse per il cluster e il database:

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

  4. Selezionare Avanti. Nel riquadro servizio Azure Kubernetes è possibile selezionare facoltativamente un cluster del servizio Azure Kubernetes esistente e un'istanza del Registro Azure Container, anziché causare la creazione di nuove istanze della distribuzione. Questa scelta consente di usare il modello sidecar, come illustrato nel Centro architetture di Azure. È anche possibile modificare le impostazioni per le dimensioni e il numero delle macchine virtuali nel pool di nodi del servizio Azure Kubernetes.

    Ai fini di questo articolo, è sufficiente mantenere tutte le impostazioni predefinite in questo riquadro.

  5. Selezionare Avanti. Nel riquadro Bilanciamento del carico accanto a Connessione a app Azure lication Gateway?, selezionare . In questa sezione è possibile personalizzare le opzioni di distribuzione seguenti:

    • Per Rete virtuale e Subnet, è possibile personalizzare facoltativamente la rete virtuale e la subnet in cui la distribuzione inserisce le risorse. Non è necessario modificare i valori rimanenti rispetto alle impostazioni predefinite.

    • Per il certificato TLS/SSL, è possibile fornire il certificato TLS/SSL dal gateway di app Azure lication. Lasciare i valori predefiniti per fare in modo che l'offerta generi un certificato autofirmato.

      Non passare all'ambiente di produzione con un certificato autofirmato. Per altre informazioni sui certificati autofirmato, vedere Creare un certificato pubblico autofirmato per autenticare l'applicazione.

    • È possibile selezionare Abilita affinità basata su cookie, nota anche come sessioni permanenti. Questo articolo usa sessioni permanenti, quindi assicurarsi di selezionare questa opzione.

  6. Selezionare Avanti. Nel riquadro Operatore e applicazione questo articolo usa tutte le impostazioni predefinite. Tuttavia, è possibile personalizzare le opzioni di distribuzione seguenti:

    • È possibile distribuire WebSphere Liberty Operator selezionando per l'opzione IBM supported?. Lasciando l'impostazione predefinita No distribuisce Open Liberty Operator.
    • È possibile distribuire un'applicazione per l'operatore selezionato selezionando per l'opzione Distribuisci un'applicazione?. Se si lascia il valore predefinito No, non viene distribuita alcuna applicazione.
  7. Selezionare Rivedi e crea per convalidare le opzioni selezionate. Nel riquadro Rivedi e crea, quando viene visualizzato Crea diventa disponibile dopo il passaggio della convalida, selezionarlo.

    La distribuzione può richiedere fino a 20 minuti. Durante l'attesa del completamento della distribuzione, è possibile seguire la procedura descritta nella sezione Creare un'istanza di database SQL di Azure. Dopo aver completato questa sezione, tornare qui e continuare.

Acquisire le informazioni selezionate dalla distribuzione

Se si è spostati dal riquadro Distribuzione in corso , i passaggi seguenti illustrano come tornare a tale riquadro. Se si è ancora nel riquadro che mostra La distribuzione è stata completata, passare al gruppo di risorse appena creato e passare al terzo passaggio.

  1. Nell'angolo di qualsiasi pagina del portale selezionare il pulsante di menu e quindi gruppi di risorse.

  2. Nella casella con il testo Filtra per qualsiasi campo immettere i primi caratteri del gruppo di risorse creato in precedenza. Se è stata seguita la convenzione consigliata, immettere le iniziali e quindi selezionare il gruppo di risorse appropriato.

  3. Nell'elenco delle risorse nel gruppo di risorse selezionare la risorsa con il valore Type del Registro Container.

  4. Nel riquadro di spostamento, in Impostazioni, selezionare Chiavi di accesso.

  5. Salvare i valori per server di accesso, nome del registro, nome utente e password. È possibile usare l'icona di copia accanto a ogni campo per copiare il valore negli Appunti di sistema.

  6. Tornare al gruppo di risorse in cui sono state distribuite le risorse.

  7. Nella sezione Impostazioni selezionare Distribuzioni.

  8. Selezionare la distribuzione più in basso nell'elenco. Il valore Nome distribuzione corrisponde all'ID editore dell'offerta. Contiene la stringa ibm.

  9. Nel riquadro di spostamento selezionare Output.

  10. Usando la stessa tecnica di copia dei valori precedenti, salvare i valori per gli output seguenti:

    • cmdToConnectToCluster
    • appDeploymentTemplateYaml se la distribuzione non include un'applicazione. In altre informazioni, è stata selezionata l'opzione No for Deploy an application? (No for Deploy an application? when you deploy the Marketplace offer) (No for Deploy an application? when you deploy the Marketplace offer).
    • appDeploymentYaml se la distribuzione include un'applicazione. Vale a dire, è stato selezionato per Distribuisci un'applicazione?.

    Incollare il valore di appDeploymentTemplateYaml o appDeploymentYaml in una shell Bash, aggiungere | grep secretNameed eseguire il comando .

    L'output di questo comando è il nome del segreto TLS in ingresso, ad esempio - secretName: secret785e2c. Salva a parte il secretName valore.

Questi valori verranno usati più avanti in questo articolo. Si noti che gli output elencano diversi altri comandi utili.

Creare un'istanza del database SQL di Azure

Per creare un database singolo database SQL di Azure da usare con l'app, seguire la procedura descritta in Avvio rapido: Creare un database singolo in database SQL di Azure. Annotare attentamente le differenze seguenti:

  • Nel passaggio Informazioni di base annotare i valori per Gruppo di risorse, Nome database, <nome-server.database.windows.net>, account di accesso amministratore del server e Password. Questo articolo fa riferimento al valore del gruppo di risorse del database come <db-resource-group>.

  • Nel passaggio Rete impostare il metodoConnessione ivity su Endpoint pubblico, impostare Consenti ai servizi e alle risorse di Azure di accedere a questo server su e impostare Aggiungi indirizzo IP client corrente su .

    Screenshot del portale di Azure che mostra la scheda Rete della pagina Crea database SQL con le impostazioni Connessione ivity e Regole del firewall evidenziate.

Nota

Il livello di calcolo serverless selezionato per questo database consente di risparmiare denaro mettendo il database in sospensione durante i periodi di inattività. L'app di esempio avrà esito negativo se il database è in stato di sospensione all'avvio dell'app.

Per forzare la riattivazione del database, è possibile eseguire una query usando l'editor di query. Seguire la procedura descritta in Eseguire query sul database. Ecco una query di esempio: SELECT * FROM COFFEE;.

Creare una variabile di ambiente nella shell per il nome del gruppo di risorse per il database:

export DB_RESOURCE_GROUP_NAME=<db-resource-group>

Dopo aver creato il database e il cluster del servizio Azure Kubernetes, è possibile procedere alla preparazione del servizio Azure Kubernetes per ospitare l'applicazione Open Liberty.

Configurare e distribuire l'applicazione di esempio

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 questo articolo. L'esempio è disponibile in GitHub.

Nel repository sono disponibili alcuni esempi. Questo articolo usa java-app/. Eseguire i comandi seguenti per ottenere l'esempio:

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

Se viene visualizzato un messaggio sullo stato "HEAD scollegato", è possibile ignorarlo in modo sicuro. Il messaggio significa semplicemente che è stato estratto un tag.

Ecco la struttura di file dell'applicazione:

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

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 del servizio Azure Kubernetes sono disponibili cinque file di distribuzione:

  • db-secret.xml: usare questo file per creare segreti Kubernetes con credenziali di connessione al database.
  • openlibertyapplication-agic.yaml: usare questo file per distribuire l'applicazione Open Liberty con AGIC. In questo articolo si presuppone che si usi questo file.
  • openlibertyapplication.yaml: usare questo file se si vuole distribuire l'applicazione Open Liberty senza AGIC.
  • webspherelibertyapplication-agic.yaml: usare questo file per distribuire l'applicazione WebSphere Liberty con AGIC se WebSphere Liberty Operator è stato distribuito in precedenza in questo articolo.
  • webspherelibertyapplication.yaml: usare questo file per distribuire l'applicazione WebSphere Liberty senza AGIC se WebSphere Liberty Operator è stato distribuito in precedenza in questo articolo.

Nella directory docker sono disponibili due file per creare l'immagine dell'applicazione:

  • Dockerfile: usare questo file per compilare l'immagine dell'applicazione con Open Liberty in questo articolo.
  • Dockerfile-wlp: usare questo file per compilare l'immagine dell'applicazione con WebSphere Liberty se è stato distribuito WebSphere Liberty Operator in precedenza in questo articolo.

Nella directory liberty/config si usa il file server.xml per configurare la connessione di database per il cluster Open Liberty e WebSphere Liberty.

Compilare il progetto

Ora che sono disponibili le proprietà necessarie, è possibile compilare l'applicazione. 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 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

(Facoltativo) Testare il progetto in locale

Eseguire e testare il progetto in locale prima di eseguire la distribuzione in Azure. Per praticità, questo articolo usa liberty-maven-plugin. Per altre informazioni su liberty-maven-plugin, vedere l'articolo Open Liberty Building a web application with Maven (Creazione di un'applicazione Web con Maven).

Per l'applicazione, è possibile eseguire operazioni simili usando qualsiasi altro meccanismo, ad esempio l'ambiente di sviluppo locale. È anche possibile prendere in considerazione l'uso dell'opzione liberty:devc destinata allo sviluppo con i contenitori. Per altre informazioni, liberty:devc vedere la documentazione di Open Liberty.

  1. Avviare l'applicazione usando liberty:run. liberty:run usa anche le variabili di ambiente definite in precedenza.

    cd $BASE_DIR/java-app
    mvn liberty:run
    
  2. Se il test ha esito positivo, nell'output del comando viene visualizzato un messaggio simile a [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds . Passare a http://localhost:9080/ nel browser e verificare che l'applicazione sia accessibile e che tutte le funzioni funzioni funzionino.

  3. Selezionare CTRL+C per arrestare.

Compilare l'immagine per la distribuzione del servizio Azure Kubernetes

È ora possibile eseguire il docker build comando per compilare l'immagine:

cd $BASE_DIR/java-app/target

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

(Facoltativo) Testare l'immagine Docker in locale

Usare la procedura seguente per testare l'immagine Docker in locale prima di eseguire la distribuzione in Azure:

  1. Eseguire l'immagine usando il comando seguente. Questo comando usa le variabili di ambiente definite in precedenza.

    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. Dopo l'avvio del contenitore, passare a http://localhost:9080/ nel browser per accedere all'applicazione.

  3. Selezionare CTRL+C per arrestare.

Caricare l'immagine in Registro Azure Container

Caricare l'immagine compilata nell'istanza del Registro Container creata nell'offerta:

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

Distribuire e testare l'applicazione

Usare la procedura seguente per distribuire e testare l'applicazione:

  1. Connettersi al cluster servizio Azure Kubernetes.

    Incollare il valore di cmdToConnectToCluster in una shell ed eseguire il comando .

  2. Applicare il segreto del database:

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

    L'output è secret/db-secret-sql created.

  3. Applicare il file di distribuzione:

    kubectl apply -f openlibertyapplication-agic.yaml
    
  4. Attendere il riavvio di tutti i pod usando il comando seguente:

    kubectl get pods --watch
    

    L'output simile all'esempio seguente indica che tutti i pod sono in esecuzione:

    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. Verificare i risultati:

    1. Ottenere l'indirizzo della risorsa di ingresso distribuita con l'applicazione:

      kubectl get ingress
      

      Copia il valore di ADDRESS dall'output. Questo valore è l'indirizzo IP pubblico front-end dell'istanza di gateway applicazione distribuita.

    2. Passare a https://<ADDRESS> per testare l'applicazione. Per praticità, questo comando shell crea una variabile di ambiente il cui valore è possibile incollare direttamente nel browser:

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

      Se il rendering della pagina Web non viene eseguito correttamente o restituisce un 502 Bad Gateway errore, l'app viene comunque avviata in background. Attendere alcuni minuti e ripetere l'operazione.

Pulire le risorse

Per evitare addebiti per Azure, è necessario eliminare le risorse non necessarie. Quando il cluster non è più necessario, usare il comando 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
az group delete --name $DB_RESOURCE_GROUP_NAME --yes --no-wait

Passaggi successivi

Per altre informazioni, vedere le risorse riportate di seguito: