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

Questo articolo spiega come:

  • Eseguire l'applicazione Java, Java EE, Jakarta EE o MicroProfile nel runtime Open Liberty o WebSphere Liberty.
  • Compilare l'immagine Docker dell'applicazione usando le immagini del contenitore Liberty.
  • Distribuire l'applicazione in contenitori in un cluster del servizio Azure Kubernetes servizio Azure Kubernetes usando l'operatore Liberty.

L'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 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 è una guida dettagliata per l'esecuzione di Open/WebSphere Liberty in Azure. Per una soluzione più automatizzata che accelera il percorso verso il servizio Azure Kubernetes, vedere Distribuire un'applicazione Java con Open Liberty/WebSphere Liberty in un cluster servizio Azure Kubernetes (AKS).

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

Se non si ha una sottoscrizione di Azure, creare un account 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.

Accedere ad Azure

Se non è già stato fatto, accedere alla sottoscrizione di Azure usando il comando az login e seguire le istruzioni visualizzate.

az login

Nota

È 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 verrà risolta in schede diverse quando necessario.

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

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 denominato java-liberty-project usando il comando az group create nella località eastus . Questo gruppo di risorse viene usato in un secondo momento per creare l'istanza di Registro Azure Container (ACR) e il cluster del servizio Azure Kubernetes.

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

Creare un'istanza di Registro Azure Container

Usa il comando az acr create per creare l'istanza di Registro Azure Container. Nell'esempio seguente viene creata un'istanza di Registro Azure Container denominata youruniqueacrname. Assicurarsi che youruniqueacrname sia univoco all'interno di Azure.

export REGISTRY_NAME=youruniqueacrname
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic \
    --admin-enabled

Dopo un breve periodo di tempo, dovrebbe essere visualizzato un output JSON contenente le righe seguenti:

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

Connessione all'istanza di Registro Azure Container

È necessario accedere all'istanza di Registro Azure Container prima di poter eseguire il push di un'immagine. Eseguire i comandi seguenti per verificare la connessione:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'passwords[0].value' \
    --output tsv)

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

Se si è connessi all'istanza di Registro Azure Container, verrà visualizzato Login Succeeded alla fine dell'output del comando.

Creare un cluster del servizio Azure Kubernetes

Usare il comando az aks create per creare un cluster del servizio Azure Kubernetes. L'esempio seguente crea un cluster denominato myAKSCluster con un nodo. Il completamento di questo comando richiede diversi minuti.

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

Il comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON relative al cluster, he includono il seguente output:

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

Connettersi al cluster servizio Azure Kubernetes

Per gestire un cluster Kubernetes, usare kubectl, il client della riga di comando Kubernetes. Per eseguire l'installazione kubectl in locale, usa il comando az aks install-cli, come illustrato nell'esempio seguente:

az aks install-cli

Per configurare kubectl per la connessione al cluster Kubernetes, usare il comando az servizio Azure Kubernetes get-credentials. Questo comando scarica le credenziali e configura l'interfaccia della riga di comando di Kubernetes per usarli.

az aks get-credentials \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --overwrite-existing \
    --admin

Nota

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

Per verificare la connessione al cluster, usare il comando kubectl get per restituire un elenco di nodi del cluster.

kubectl get nodes

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

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.23.8

Creare un database SQL di Azure

In questa sezione viene creato un database singolo database SQL di Azure da usare con l'app.

Creare un database singolo in database SQL di Azure seguendo i passaggi dell'interfaccia della riga di comando di Azure o di PowerShell in Avvio rapido: Creare un database singolo database SQL di Azure. Usare le istruzioni seguenti durante l'articolo, quindi tornare a questo documento dopo aver creato e configurato il server di database.

  1. Quando si raggiunge la sezione Imposta valori dei parametri della guida introduttiva, annotare tutte le variabili nell'esempio di codice con Variable blocketichetta , tra cui location, resourceGroup,databaseserver , , logine password. Questo articolo fa riferimento al database resourceGroup come <db-resource-group>.

  2. Dopo aver creato il server di database, passare al server appena creato nel portale di Azure. Nel riquadro Rete, nella scheda Connessione ivity impostare La versione minima di TLS su TLS 1.0.

    Screenshot della configurazione della rete del database SQL TLS 1.0.

  3. Nel riquadro Rete, nella scheda Accesso pubblico selezionare Consenti ai servizi e alle risorse di Azure di accedere a questo server.

    Screenshot delle regole del firewall: consente l'accesso alle risorse di Azure.

  4. Se si vuole testare l'applicazione in locale, assicurarsi che l'indirizzo IPv4 client sia incluso nell'elenco consenti regole del firewall

    Screenshot delle regole del firewall: consente l'accesso client.

  5. Salvare le modifiche di rete.

  6. Usare il comando seguente per creare una variabile di ambiente 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 preparare il servizio Azure Kubernetes per ospitare Liberty.

Installare Open Liberty Operator

Dopo aver creato e connesso il cluster, installare Open Liberty Operator.

Installare Open Liberty Operator eseguendo i comandi seguenti:

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

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

Configurare e compilare l'immagine dell'applicazione

Per distribuire ed eseguire l'applicazione Liberty nel cluster del servizio Azure Kubernetes, inserire in un contenitore l'applicazione come immagine Docker usando immagini del contenitore Open Liberty o immagini del contenitore 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. L'esempio è disponibile in GitHub. Nel repository sono disponibili alcuni esempi. Questo articolo usa java-app. Ecco la struttura di file dell'applicazione.

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20230830

Se viene visualizzato un messaggio relativo allo stato "HEAD scollegato", questo messaggio può essere tranquillamente ignorato. Significa semplicemente che è stato estratto un tag.

java-app
├─ src/main/
│  ├─ aks/
│  │  ├─ db-secret.yaml
│  │  ├─ openlibertyapplication.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 presenti due file di distribuzione. db-secret.xml viene usato per creare segreti Kubernetes con le credenziali di connessione del database. Il file openlibertyapplication.yaml viene usato 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 file server.xml viene usato per configurare la connessione db per il cluster Open Liberty e WebSphere Liberty.

Compilare il progetto

Dopo aver raccolto 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 <path-to-your-repo>/java-app

# The following variables will be used for deployment file generation into target/
export LOGIN_SERVER=${LOGIN_SERVER}
export REGISTRY_NAME=${REGISTRY_NAME}
export USER_NAME=${USER_NAME}
export PASSWORD=${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>

mvn clean install

(Facoltativo) Testare il progetto in locale

È ora possibile eseguire e testare il progetto in locale prima di eseguire la distribuzione in Azure. Per praticità, usare .liberty-maven-plugin Per altre informazioni su liberty-maven-plugin, vedere Compilazione di un'applicazione Web con Maven. Per l'applicazione, è possibile eseguire operazioni simili usando qualsiasi altro meccanismo, ad esempio l'IDE locale. È anche possibile prendere in considerazione l'uso dell'opzione liberty:devc destinata allo sviluppo con i contenitori. Per altre informazioni su liberty:devc, vedere la documentazione di Liberty.

Nota

Se è stata selezionata una distribuzione di database "serverless", verificare che il database SQL non sia stato attivato in modalità di sospensione. Un modo per eseguire questa operazione consiste nell'accedere all'editor di query del database come descritto in Avvio rapido: Usare l'editor di query portale di Azure (anteprima) per eseguire query database SQL di Azure.

  1. Avviare l'applicazione usando liberty:run. liberty:run usa le variabili di ambiente definite nel passaggio precedente.

    cd <path-to-your-repo>/java-app
    mvn liberty:run
    
  2. Verificare che l'applicazione funzioni come previsto. Se ha esito positivo, verrà visualizzato un messaggio simile a [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds. nell'output del comando. Passare a http://localhost:9080/ nel browser per verificare che l'applicazione sia accessibile e che tutte le funzioni funzionino.

  3. Premere CTRL+C per arrestarsi.

Compilare l'immagine per la distribuzione del servizio Azure Kubernetes

Nota

Se si è scelto di usare l'ambiente Bash in Azure Cloud Shell, usare il az acr build comando per compilare ed eseguire il push dell'immagine da un file Docker, vedere Avvio rapido: Compilare ed eseguire un'immagine del contenitore usando Registro Azure Container Attività. Successivamente, passare direttamente alla sezione Distribuire l'applicazione nel cluster del servizio Azure Kubernetes. Se si sceglie di eseguire i comandi in locale, è possibile usare le indicazioni seguenti.

È ora possibile eseguire il docker build comando per compilare l'immagine, come illustrato nell'esempio seguente:

cd <path-to-your-repo>/java-app/target

# If you are running with Open Liberty
docker build -t javaee-cafe:v1 --pull --file=Dockerfile .

# If you are running with WebSphere Liberty
docker build -t javaee-cafe:v1 --pull --file=Dockerfile-wlp .

(Facoltativo) Testare l'immagine Docker in locale

È ora possibile 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. Premere CTRL+C per arrestarsi.

Caricare l'immagine in Registro Azure Container

Caricare quindi l'immagine compilata nel Registro Azure Container creato nei passaggi precedenti.

Se non è già stato fatto, accedere al registro contenitori usando il comando seguente:

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

Usare i comandi seguenti per contrassegnare ed eseguire il push dell'immagine del contenitore:

docker tag javaee-cafe:v1 ${LOGIN_SERVER}/javaee-cafe:v1
docker push ${LOGIN_SERVER}/javaee-cafe:v1

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. Collegare l'istanza del Registro Azure Container al cluster del servizio Azure Kubernetes in modo che il cluster del servizio Azure Kubernetes sia autenticato per eseguire il pull dell'immagine dall'istanza di Registro Azure Container, come illustrato nell'esempio seguente:

    az aks update \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --attach-acr $REGISTRY_NAME
    
  2. Applicare il file di distribuzione e il segreto del database eseguendo i comandi seguenti:

    cd <path-to-your-repo>/java-app/target
    
    # Apply DB secret
    kubectl apply -f db-secret.yaml
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication.yaml
    
  3. Determinare se l'istanza OpenLibertyApplication viene creata eseguendo il comando seguente:

    kubectl get openlibertyapplication javaee-cafe-cluster
    

    L'output dovrebbe essere simile all'esempio seguente:

    NAME                        IMAGE                                                   EXPOSED   RECONCILED   AGE
    javaee-cafe-cluster         youruniqueacrname.azurecr.io/javaee-cafe:1.0.25         True         59s
    
  4. Determinare se la distribuzione creata dall'operatore è pronta eseguendo il comando seguente:

    kubectl get deployment javaee-cafe-cluster --watch
    

    L'output dovrebbe essere simile all'esempio seguente:

    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-cluster         0/3     3            0           20s
    
  5. Attendere fino a quando non viene visualizzato 3/3 sotto la READY colonna e 3 sotto la AVAILABLE colonna, quindi usare CTRL+C per arrestare il kubectl processo di controllo.

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 alcuni minuti.

Per monitorare lo stato di avanzamento, usare il comando kubectl get service con l'argomento --watch , come illustrato nell'esempio seguente:

kubectl get service javaee-cafe-cluster --watch

L'output dovrebbe essere simile all'esempio seguente:

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

Dopo che l'indirizzo EXTERNAL-IP passa da in sospeso a un indirizzo IP pubblico effettivo, usare CTRL+C per arrestare il processo di kubectl controllo.

Se è trascorso del tempo tra l'esecuzione dei passaggi in questa sezione e quella precedente, verificare che il database sia attivo, se necessario. Vedere la nota precedente relativa alla sospensione del database.

Aprire un Web browser all'indirizzo IP esterno del servizio (52.152.189.57 per l'esempio precedente) per visualizzare la home page dell'applicazione. Se la pagina non viene caricata correttamente, è perché l'app viene avviata. È possibile attendere un po' di tempo e aggiornare la pagina in un secondo momento. Verrà visualizzato 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 del servizio Azure Kubernetes.

Applicazione Java liberty distribuita correttamente nel servizio Azure Kubernetes.

Nota

Attualmente, l'applicazione non usa HTTPS. È consigliabile abilitare TLS con i propri certificati. Per altre informazioni, vedere Usare TLS con un controller di ingresso in servizio Azure Kubernetes (servizio Azure Kubernetes).

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 i riferimenti usati in questa guida: