Dela via


Distribuera ett Java-program manuellt med Open Liberty eller WebSphere Liberty i ett AKS-kluster (Azure Kubernetes Service)

Den här artikeln innehåller stegvisa manuella anvisningar för att köra Open/WebSphere Liberty på Azure.

Mer specifikt förklarar den här artikeln hur du utför följande uppgifter:

  • Kör ditt Java-, Java EE-, Jakarta EE- eller MicroProfile-program på Open Liberty- eller WebSphere Liberty-körningen.
  • Skapa programmets Docker-avbildning med az acr build hjälp av Liberty-containeravbildningar.
  • Distribuera det containerbaserade programmet till ett AKS-kluster (Azure Kubernetes Service) med hjälp av Liberty Operator.

Liberty Operator förenklar distributionen och hanteringen av program som körs i Kubernetes-kluster. Med Open Liberty Operator eller WebSphere Liberty Operator kan du också utföra mer avancerade åtgärder, till exempel att samla in spårningar och dumpar.

En mer automatiserad lösning som påskyndar din resa till AKS finns i Distribuera ett Java-program med Open Liberty/WebSphere Liberty i ett AKS-kluster (Azure Kubernetes Service).

Mer information om Open Liberty finns på open liberty-projektsidan. Mer information om IBM WebSphere Liberty finns på produktsidan för WebSphere Liberty.

Den här artikeln är avsedd att hjälpa dig att snabbt komma till distributionen. Innan du går till produktion bör du utforska Tuning Liberty.

Om du är intresserad av att ge feedback eller arbeta nära dina migreringsscenarier med teknikteamet som utvecklar WebSphere på Azure-lösningar kan du fylla i den här korta undersökningen om WebSphere-migrering och inkludera din kontaktinformation. Teamet med programchefer, arkitekter och ingenjörer kommer snabbt att kontakta dig för att initiera ett nära samarbete.

Förutsättningar

  • Installera en Java Standard Edition-implementering (SE), version 17 (till exempel Eclipse Open J9).
  • Installera Maven version 3.5.0 eller senare.
  • Kontrollera att Git är installerat.
  • Kontrollera att du har tilldelats rollen Owner eller rollerna Contributor och User Access Administrator i prenumerationen. Du kan verifiera tilldelningen genom att följa stegen i Lista Azure-rolltilldelningar med hjälp av Azure Portal.

Logga in på Azure

Om du inte redan har gjort det loggar du in på din Azure-prenumeration med hjälp av kommandot az login och följer anvisningarna på skärmen.

az login

Kommentar

Du kan köra de flesta Azure CLI-kommandon i PowerShell på samma sätt som i Bash. Skillnaden finns bara när du använder variabler. I följande avsnitt åtgärdas skillnaden på olika flikar när det behövs.

Om du har flera Azure-klienter associerade med dina Azure-autentiseringsuppgifter måste du ange vilken klientorganisation du vill logga in på. Du kan göra detta med alternativet --tenant . Exempel: az login --tenant contoso.onmicrosoft.com

Skapa en resursgrupp

En Azure-resursgrupp är en logisk grupp där Azure-resurser distribueras och hanteras.

Skapa en resursgrupp med namnet java-liberty-project med kommandot az group create på den eastus2 platsen. Den här resursgruppen används senare för att skapa Azure Container Registry-instansen och AKS-klustret.

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

Skapa en Container Registry-instans

Använd kommandot az acr create för att skapa Container Registry-instansen. I följande exempel skapas en Container Registry-instans med namnet youruniqueacrname. Se till att youruniqueacrname är unikt i Azure.

Kommentar

Den här artikeln använder den rekommenderade mekanismen för lösenordsfri autentisering för Container Registry. Det går fortfarande att använda användarnamn och lösenord med docker login när du har använt az acr credential show för att hämta användarnamnet och lösenordet. Användning av användarnamn och lösenord är mindre säkert än lösenordsfri autentisering.

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

Efter en kort tid bör du se en JSON-utdata som innehåller följande rader:

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

Hämta sedan inloggningsservern för Container Registry-instansen. Du behöver det här värdet när du distribuerar programavbildningen till AKS-klustret senare.

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

Skapa ett AKS-kluster

Använd kommandot az aks create för att skapa ett AKS-kluster. I följande exempel skapas ett kluster med namnet myAKSCluster med en nod. Det tar flera minuter att slutföra det här kommandot.

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

Efter några minuter slutförs kommandot och returnerar JSON-formaterad information om klustret, inklusive följande utdata:

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

Koppla Container Registry-instansen till AKS-klustret

Kör kommandot az aks update för att koppla Container Registry-instansen till AKS-klustret så att AKS-klustret autentiseras för att hämta avbildningar från Container Registry-instansen, som du ser i följande exempel:

az aks update \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --attach-acr $REGISTRY_NAME

Ansluta till AKS-klustret

Om du vill hantera ett Kubernetes-kluster använder du kubectl, Kubernetes-kommandoradsklienten. Om du vill installera kubectl lokalt använder du kommandot az aks install-cli enligt följande exempel:

az aks install-cli

Om du vill konfigurera kubectl för att ansluta till kubernetes-klustret använder du kommandot az aks get-credentials. Det här kommandot laddar ned autentiseringsuppgifter och konfigurerar Kubernetes CLI för att använda dem.

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

Kommentar

Kommandot ovan använder standardplatsen för Kubernetes-konfigurationsfilen, som är ~/.kube/config. Du kan ange en annan plats för kubernetes-konfigurationsfilen med hjälp av --file.

Om du vill verifiera anslutningen till klustret använder du kommandot kubectl get för att returnera en lista över klusternoderna.

kubectl get nodes

Följande exempelutdata visar den enskilda nod som skapades i föregående steg. Kontrollera att status för noden är Klar:

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

Skapa en Azure SQL Database

I det här avsnittet skapar du en enkel Azure SQL Database-databas för användning med din app.

Ange först databasrelaterade miljövariabler. Ersätt <your-unique-sql-server-name> med ett unikt namn för Azure SQL Database-servern.

export SQL_SERVER_NAME=<your-unique-sql-server-name>
export DB_NAME=demodb

Kör följande kommando i terminalen för att skapa en enkel databas i Azure SQL Database och ange den aktuella inloggade användaren som Microsoft Entra-administratör. Mer information finns i Snabbstart: Skapa en enkel databas – Azure SQL Database.

export ENTRA_ADMIN_NAME=$(az ad signed-in-user show --query userPrincipalName --output tsv)

az sql server create \
    --name $SQL_SERVER_NAME \
    --resource-group $RESOURCE_GROUP_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 \
    --server $SQL_SERVER_NAME \
    --name $DB_NAME \
    --edition GeneralPurpose \
    --compute-model Serverless \
    --family Gen5 \
    --capacity 2

Lägg sedan till den lokala IP-adressen i Azure SQL Database-serverns brandväggsregler så att den lokala datorn kan ansluta till databasen för lokal testning senare.

export AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)
az sql server firewall-rule create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $SQL_SERVER_NAME \
    --name AllowLocalIP \
    --start-ip-address $AZ_LOCAL_IP_ADDRESS \
    --end-ip-address $AZ_LOCAL_IP_ADDRESS

Kommentar

Du skapar en Azure SQL-server med SQL-autentisering inaktiverad av säkerhetsskäl. Endast Microsoft Entra-ID används för att autentisera till servern. Mer information finns i az sql server create om du behöver aktivera SQL-autentisering.

Skapa en tjänstanslutning i AKS med Service Connector

Kör följande kommandon för att skapa en anslutning mellan AKS-klustret och SQL-databasen med microsoft entra-arbetsbelastnings-ID med Service Connector. Mer information finns i Skapa en tjänstanslutning i AKS med Service Connector (förhandsversion).

# 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

Kommentar

Vi rekommenderar att du använder Microsoft Entra-arbetsbelastnings-ID för säker åtkomst till din Azure SQL Database utan att använda SQL-autentisering. Om du behöver använda SQL-autentisering ignorerar du stegen ovan i det här avsnittet och använder användarnamnet och lösenordet för att ansluta till Azure SQL Database.

Hämta tjänstkonto och hemlighet som skapats av Service Connector

Om du vill autentisera till Azure SQL Database måste du hämta tjänstkontot och hemligheten som skapats av Service Connector. Följ avsnittet Uppdatera containern. Välj alternativet Skapa en distribution direkt med hjälp av YAML-exempelkodfragmentet och kör följande steg:

  1. Från de markerade avsnitten i kubernetes-exempeldistributionens serviceAccountName YAML kopierar du värdena och secretRef.name , som du ser i följande exempel:

    serviceAccountName: <service-account-name>
    containers:
    - name: raw-linux
       envFrom:
          - secretRef:
             name: <secret-name>
    
  2. Ersätt <service-account-name> och <secret-name> med de värden som du kopierade i föregående steg för att definiera följande miljövariabler:

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

    Dessa värden används i nästa avsnitt för att distribuera Liberty-programmet till AKS-klustret.

Kommentar

Hemligheten som skapas av Service Connector innehåller AZURE_SQL_CONNECTIONSTRING, vilket är ett kostnadsfritt lösenord anslutningssträng till Azure SQL Database. Mer information finns i exempelvärdet från Användartilldelad hanterad identitetsautentisering .

Installera Open Liberty-operatorn

I det här avsnittet installerar du Open Liberty Operator i AKS-klustret som värd för Liberty-programmet.

Installera Open Liberty-operatorn genom att köra följande kommandon:

# 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.4.0
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

Konfigurera och skapa programbilden

Om du vill distribuera och köra ditt Liberty-program i AKS-klustret kan du containerisera ditt program som en Docker-avbildning med hjälp av Open Liberty-containeravbildningar eller WebSphere Liberty-containeravbildningar.

Följ stegen i det här avsnittet för att distribuera exempelprogrammet på Liberty-körningen. De här stegen använder Maven.

Kolla in programmet

Klona exempelkoden för den här guiden. Exemplet finns på GitHub. Det finns några exempel på lagringsplatsen. Den här artikeln använder exemplet java-app . De viktiga filerna visas härnäst.

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

Om du ser ett meddelande om att vara i detached HEAD läge går det här meddelandet att ignorera utan problem. Det betyder bara att du checkade ut en tagg.

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

Katalogerna java, resources och webapp innehåller källkoden för exempelprogrammet. Koden deklarerar och använder en datakälla med namnet jdbc/JavaEECafeDB.

I aks-katalogen används filen openlibertyapplication-passwordless-db.yaml för att distribuera programbilden. I docker-katalogen finns det två filer för att skapa programbilden med antingen Open Liberty eller WebSphere Liberty.

I katalogen liberty/configanvänds server.xml-filen för att konfigurera databasanslutningen för Open Liberty- och WebSphere Liberty-klustret. Den definierar en variabel azure.sql.connectionstring som används för att ansluta till Azure SQL Database.

Filen pom.xml är Maven-projektobjektmodellen (POM) som innehåller konfigurationsinformationen för projektet. Filen pom-azure-identity.xmlazure-identitytill Azure-tjänster med hjälp av Microsoft Entra-ID.

Kommentar

Det här exemplet använder azure-identity-biblioteket för att autentisera till Azure SQL Database med hjälp av Microsoft Entra-autentisering, vilket rekommenderas för säkerhetsöverväganden. Mer information finns i Relationsdatabasanslutningar med JDBC om du behöver använda SQL-autentisering i ditt Liberty-program.

Bygga projektet

Nu när du har samlat in de nödvändiga egenskaperna kan du skapa programmet. POM-filen för projektet läser många variabler från miljön. Som en del av Maven-versionen används dessa variabler för att fylla i värden i YAML-filerna som finns i src/main/aks. Du kan göra något liknande för ditt program utanför Maven om du vill.

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

Testa projektet lokalt

Nu kan du köra och testa projektet lokalt innan du distribuerar till Azure. För enkelhetens skull använder du liberty-maven-plugin. Mer information om finns i liberty-maven-pluginSkapa ett webbprogram med Maven. För ditt program kan du göra något liknande med någon annan mekanism, till exempel din lokala IDE. Du kan också överväga att använda det liberty:devc alternativ som är avsett för utveckling med containrar. Du kan läsa mer om liberty:devc i Liberty-dokumenten.

Kommentar

Om du har valt en "serverlös" databasdistribution kontrollerar du att SQL-databasen inte har angett pausläge. Ett sätt att göra detta är att logga in på databasfrågeredigeraren enligt beskrivningen i Snabbstart: Använd Azure Portal frågeredigeraren (förhandsversion) för att fråga Azure SQL Database.

  1. Starta programmet med .liberty:run

    cd $BASE_DIR/java-app
    
    # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by configuration variable `azure.sql.connectionstring` in server.xml
    export AZURE_SQL_CONNECTIONSTRING="jdbc:sqlserver://$SQL_SERVER_NAME.database.windows.net:1433;databaseName=$DB_NAME;authentication=ActiveDirectoryDefault"
    mvn liberty:run
    
  2. Kontrollera att programmet fungerar som förväntat. Du bör se ett meddelande som liknar [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds. i kommandoutdata om det lyckas. Gå till http://localhost:9080/ i webbläsaren för att kontrollera att programmet är tillgängligt och att alla funktioner fungerar.

  3. Tryck på Ctrl+C för att stoppa. Välj Y- om du uppmanas att avsluta batchjobbet.

När du är klar tar du bort brandväggsregeln som gör att din lokala IP-adress kan komma åt Azure SQL Database med hjälp av följande kommando:

az sql server firewall-rule delete \
    --resource-group $RESOURCE_GROUP_NAME \
    --server $SQL_SERVER_NAME \
    --name AllowLocalIP

Skapa avbildningen för AKS-distribution

Du kan nu köra kommandot az acr build för att skapa avbildningen, som du ser i följande exempel:

cd $BASE_DIR/java-app/target

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

Kommandot az acr build laddar upp artefakterna som anges i Dockerfile till Container Registry-instansen, skapar avbildningen och lagrar den i Container Registry-instansen.

Distribuera programmet till AKS-klustret

Använd följande steg för att distribuera Liberty-programmet i AKS-klustret:

  1. Använd distributionsfilen genom att köra följande kommandon:

    cd $BASE_DIR/java-app/target
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication-passwordless-db.yaml
    
  2. Kontrollera om instansen OpenLibertyApplication skapas genom att köra följande kommando:

    kubectl get openlibertyapplication javaee-cafe-cluster
    

    Du bör se utdata som liknar följande exempel:

    NAME                  IMAGE                                        EXPOSED   RECONCILED   RESOURCESREADY   READY   WARNING   AGE
    javaee-cafe-cluster   jiangma102924acr.azurecr.io/javaee-cafe:v1             True         True             True              57s
    
  3. Kontrollera om distributionen som skapats av operatorn är klar genom att köra följande kommando:

    kubectl get deployment javaee-cafe-cluster --watch
    

    Du bör se utdata som liknar följande exempel:

    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-cluster         0/3     3            0           20s
    
  4. Vänta tills du ser 3/3 under READY kolumnen och 3 under AVAILABLE kolumnen och använd sedan Ctrl+C för att stoppa kubectl klockprocessen.

Testa programmet

När programmet körs exponerar en Kubernetes-lastbalanserartjänst programmets klientdel till Internet. Den här processen kan ta en stund att slutföra.

Om du vill övervaka förloppet använder du kommandot kubectl get service med argumentet --watch, som du ser i följande exempel:

kubectl get service javaee-cafe-cluster --watch

Du bör se utdata som liknar följande exempel:

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

När EXTERNAL-IP adressen ändras från pending till en faktisk offentlig IP-adress använder du Ctrl+C så kan du stoppa kubectl bevakningsprocessen.

Om det gick en stund mellan att köra stegen i det här avsnittet och det föregående, kontrollerar du att databasen är aktiv om det behövs. Se föregående anteckning om databaspaus.

Öppna en webbläsare till tjänstens externa IP-adress (52.152.189.57 i exemplet ovan) för att se programmets startsida. Om sidan inte läses in korrekt beror det på att appen startas. Du kan vänta en stund och uppdatera sidan senare. Du bör se poddnamnet för dina programrepliker som visas längst upp till vänster på sidan. Vänta några minuter och uppdatera sidan för att se ett annat poddnamn som visas på grund av belastningsutjämning som tillhandahålls av AKS-klustret.

Java Liberty-programmet har distribuerats på AKS.

Kommentar

För närvarande använder programmet inte HTTPS. Vi rekommenderar att du aktiverar TLS med dina egna certifikat. Mer information finns i Använda TLS med en ingresskontrollant på Azure Kubernetes Service (AKS).

Rensa resurser

För att undvika Azure-avgifter bör du rensa onödiga resurser. När klustret inte längre behövs använder du kommandot az group delete för att ta bort resursgruppen, containertjänsten, containerregistret, databasen och alla relaterade resurser.

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

Nästa steg

Du kan lära dig mer från referenser som används i den här guiden:

Information om hur du införlivar Azure Cache for Redis i en Java-app finns i Använda Azure Cache for Redis i Java med Redisson Redis-klienten.

Information om alternativ för att köra WebSphere-produkter i Azure finns i Vad är lösningar för att köra WebSphere-serien med produkter i Azure?