Использование Java EE JCache с Open Liberty или WebSphere Liberty в кластере Служба Azure Kubernetes (AKS)

В этой статье описывается, как использовать JCache Java EE в контейнерном приложении, развернутом в AKS.

В руководстве описаны следующие действия:

  • Создайте инфраструктуру для запуска приложения Java, Java EE, Jakarta EE или MicroProfile в среде выполнения Open Liberty или WebSphere Liberty.
  • Используйте JCache Java EE, поддерживаемую Кэш Azure для Redis в качестве кэша сеансов.
  • Создание образа приложения Docker с использованием образов контейнеров Open Liberty или WebSphere Liberty.
  • Разверните контейнерное приложение в кластере AKS с использованием Open Liberty Operator.

Эта статья предназначена для быстрого развертывания. Прежде чем перейти к производству, вы должны исследовать Настройка Свободы.

Если вы заинтересованы в предоставлении отзывов или тесной работе с сценариями миграции с помощью группы разработчиков, разрабатывающей веб-sphere в решениях Azure, заполните этот короткий опрос по миграции WebSphere и включите контактные данные. Команда руководителей программ, архитекторов и инженеров будет быстро связаться с вами, чтобы начать тесное сотрудничество.

Необходимые компоненты

Создание инфраструктуры

В этом разделе описано, как создать инфраструктуру приложений в Azure. После выполнения этих действий у вас будет Реестр контейнеров Azure, кластер Служба Azure Kubernetes и экземпляр Кэш Azure для Redis для запуска примера приложения.

Создание или изменение группы ресурсов

Группа ресурсов Azure — это логическая группа, в которой развертываются и управляются ресурсы Azure.

Создайте группу ресурсов java-liberty-project в расположении eastus с помощью команды az group create. Эта группа ресурсов используется позже для создания экземпляра Реестр контейнеров Azure (ACR) и кластера AKS.

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

Создание экземпляра ACR

Создайте экземпляр ACR с помощью команды az acr create. В следующем примере создается экземпляр ACR с именем youruniqueacrname. Убедитесь, что имя youruniqueacrname является уникальным в Azure.

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

Через некоторое время вы увидите выходные данные JSON, которые содержат следующие данные:

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

Кроме того, можно создать экземпляр реестра контейнеров Azure, выполнив действия, описанные в кратком руководстве. Создание реестра контейнеров Azure с помощью портал Azure.

Подключение к экземпляру ACR

Перед отправкой образа в экземпляр ACR вам потребуется войти в экземпляр ACR. Выполните следующие команды, чтобы проверить подключение:

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

az acr login \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME

Примечание.

Использование учетных данных пользователя и пароля для предоставления доступа к реестру контейнеров не рекомендуется. Если определенные требования к использованию предлагают доступ на основе учетных данных лучше всего подходит, вы можете получить имя пользователя и пароль, используя az acr credential show и использовать эти значения.docker login

Если вы успешно вошли в экземпляр ACR, вы увидите Login Succeeded в конце выходных данных команды.

Если возникла проблема при входе в реестр контейнеров Azure, см . статью "Устранение неполадок входа в реестр".

Создание кластера AKS

Используйте команду az aks create, чтобы создать кластер AKS и предоставить ему разрешение на извлечение образа из экземпляра ACR. В следующем примере создается кластер myAKSCluster с одним узлом. Выполнение этой команды занимает несколько минут.

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

Через несколько минут команда завершает работу и возвращает данные в формате JSON о кластере, включая следующие строки:

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

Подключение к кластеру AKS

Управлять кластером Kubernetes можно c помощью kubectl, клиента командной строки Kubernetes. Чтобы установить kubectl локально, используйте команду az aks install-cli:

az aks install-cli

Чтобы настроить kubectl на подключение к кластеру Kubernetes, выполните команду az aks get-credentials. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.

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

Чтобы проверить подключение к кластеру, используйте команду kubectl get для получения списка узлов кластера.

kubectl get nodes

В следующем примере показан единый узел, созданный на предыдущих шагах. Убедитесь, что состояние узла готово.

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

Установка Open Liberty Operator

После создания кластера и подключения к нему установите Open Liberty Operator с помощью команд ниже.

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

Создание экземпляра кэша Azure для Redis

Кэш Azure для Redis поддерживает сохраняемость HttpSession приложения Java, работающего на сервере Open Liberty или WebSphere Liberty. Выполните действия, описанные в этом разделе, чтобы создать экземпляр Кэш Azure для Redis и запишите сведения о подключении. Позже мы будем использовать эту информацию.

  1. Выполните действия, описанные в кратком руководстве. Используйте Кэш Azure для Redis в Java до, но не в том числе сведения о примере Java.

    Примечание.

    На шаге 6 раздела "Создание Кэш Azure для Redis" выберите "Проверка подлинности ключей доступа" для параметра "Проверка подлинности". Этот параметр необходим для подключения примера приложения к экземпляру Кэш Azure для Redis с помощью клиентской библиотеки Redisson. Дополнительные сведения см. в разделе "Конфигурация Redisson".

  2. Скопируйте имя узла и первичный ключ доступа для экземпляра Кэш Azure для Redis, а затем выполните следующие команды, чтобы добавить переменные среды:

    export REDISCACHEHOSTNAME=<YOUR_HOST_NAME>
    export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
    

Сборка приложения

Выполните действия, описанные в этом разделе, чтобы создать и контейнеризировать пример приложения. В этих шагах используется Maven, liberty-maven-pluginа также az acr build. Дополнительные сведения о liberty-maven-plugin см. в статье Создание веб-приложения с помощью Maven.

Получение приложения для изменения

Используйте следующие команды, чтобы клонировать пример кода для этого руководства. Пример находится в репозитории open-liberty-on-aks на GitHub. В репозитории содержится несколько примеров. В этой статье используется java-app-jcache.

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20240909
cd java-app-jcache

Если появится сообщение об отключенном состоянии HEAD, это сообщение безопасно игнорировать. Это просто означает, что вы проверили тег.

Приложение имеет следующую структуру файлов:

java-app-jcache/
├── pom.xml
└── src
    └── main
        ├── aks
        │   └── openlibertyapplication.yaml
        ├── docker
        │   ├── Dockerfile
        │   └── Dockerfile-wlp
        ├── java
        ├── liberty
        │   └── config
        │       └── server.xml
        ├── redisson
        │   └── redisson-config.yaml
        ├── resources
        └── webapp

Каталоги java, ресурсов и веб-приложений содержат исходный код примера приложения.

В каталоге aks файл развертывания openlibertyapplication.yaml используется для развертывания образа приложения.

В каталоге Docker мы помещаем два файла Dockerfile . Dockerfile используется для создания образа с помощью Open Liberty и Dockerfile-wlp используется для создания образа с помощью WebSphere Liberty.

В каталоге liberty/config файл server.xml используется для настройки кэша сеансов для кластера Open Liberty и WebSphere Liberty.

В каталоге redisson файл redisson-config.yaml используется для настройки подключения экземпляра Кэш Azure для Redis.

Помещение приложения в контейнер

Чтобы развернуть и запустить приложение Liberty в кластере AKS, выполните следующие действия, чтобы контейнеризировать приложение в виде образа Docker. Вы можете использовать образы контейнеров Open Liberty или образы контейнеров WebSphere Liberty.

  1. Убедитесь, что текущий рабочий каталог — java-app-jcache в локальном клоне.

  2. Выполните команду mvn clean package, чтобы упаковать приложение.

  3. Запустите mvn -Predisson validate , чтобы скопировать файл конфигурации Redisson в указанное расположение. На этом шаге вставляются значения переменных REDISCACHEHOSTNAME среды и REDISCACHEKEY в файл redisson-config.yaml , на который ссылается файл server.xml .

  4. Выполните команду mvn liberty:dev, чтобы протестировать приложение. Если тест выполнен успешно, вы увидите The defaultServer server is ready to run a smarter planet. в выходных данных команды. Вы должны увидеть выходные данные, аналогичные приведенному ниже, если подключение Redis выполнено успешно.

    [INFO] [err] [Default Executor-thread-5] INFO org.redisson.Version - Redisson 3.23.4
    [INFO] [err] [redisson-netty-2-7] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    [INFO] [err] [redisson-netty-2-20] INFO org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    
  5. Вы можете просмотреть http://localhost:9080/ запущенное приложение, но подтверждение работы Redis — это выходные данные, перечисленные на предыдущем шаге.

  6. Нажмите клавиши CTRL+C, чтобы остановить приложение.

  7. Используйте следующие команды для получения значений свойств artifactId и version определенных в файле pom.xml .

    export artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec)
    export version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
    
  8. Выполните команду cd target, чтобы изменить каталог на сборку примера.

  9. Выполните одну из следующих команд, чтобы создать образ приложения и отправить его в экземпляр ACR.

    • Используйте следующую команду, чтобы создать базовый образ Open Liberty, если вы предпочитаете использовать Open Liberty в качестве упрощенного открытый код среды выполнения Java™:

      # Build and tag application image. This causes the ACR instance to pull the necessary Open Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME .
      
    • Используйте следующую команду, чтобы создать базовый образ WebSphere Liberty, если вы предпочитаете использовать коммерческую версию Open Liberty:

      # Build and tag application image. This causes the ACR instance to pull the necessary WebSphere Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME --file=Dockerfile-wlp .
      

Развертывание приложения

Выполните действия, описанные в этом разделе, чтобы развернуть контейнерное пример приложения в кластере AKS.

  1. Убедитесь, что текущий рабочий каталог — java-app-jcache/target в локальном клоне.

  2. Используйте следующие команды, чтобы создать секрет с информацией о конфигурации Redisson. С помощью этого секрета приложение может подключиться к созданному экземпляру Кэш Azure для Redis.

    export REDISSON_CONFIG_SECRET_NAME=redisson-config-secret
    kubectl create secret generic ${REDISSON_CONFIG_SECRET_NAME} --from-file=$(pwd)/liberty/wlp/usr/servers/defaultServer/redisson-config.yaml
    
  3. Используйте следующие команды для развертывания приложения Liberty с тремя репликами в кластере AKS. Выходные данные команды также отображаются встроенными.

    # Set number of application replicas
    export REPLICAS=3
    
    # Create OpenLibertyApplication "javaee-cafe-jcache-cluster"
    envsubst < openlibertyapplication.yaml | kubectl create -f -
    
    openlibertyapplication.openliberty.io/javaee-cafe-jcache-cluster created
    
    # Check if OpenLibertyApplication instance is created
    kubectl get openlibertyapplication ${artifactId}-cluster
    
    NAME                               IMAGE                                                         EXPOSED      RECONCILED   AGE
    javaee-cafe-jcache-cluster         youruniqueacrname.azurecr.io/javaee-cafe-jcache:1.0.0                      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-jcache-cluster         0/3     3            0           20s
    
  4. Подождите, пока не увидите 3/3 READY столбец и 3 под столбцом AVAILABLE , а затем нажмите клавиши CTRL+C, чтобы остановить процесс отслеживания kubectl .

Тестирование приложения

При запуске приложения служба балансировки нагрузки Kubernetes предоставляет внешний интерфейс приложения в Интернете. Этот процесс может занять некоторое время.

Чтобы отслеживать ход выполнения, используйте команду kubectl get service с аргументом --watch.

kubectl get service ${artifactId}-cluster --watch

NAME                               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
javaee-cafe-jcache-cluster         LoadBalancer   10.0.50.29     20.84.16.169    80:31732/TCP     68s

После изменения внешнего IP-адреса на фактический общедоступный IP-адрес используйте CTRL+C, чтобы остановить процесс отслеживанияkubectl.

Откройте в веб-браузере внешний IP-адрес вашей службы (20.84.16.169 для приведенного выше примера), чтобы увидеть домашнюю страницу приложения. Если страница не загружена правильно, это связано с запуском приложения. Вы можете подождать некоторое время и обновить страницу позже. Имя модуля pod реплик приложения отображается в левом верхнем углу страницы (javaee-cafe-jcache-cluster-77d54bccd4-5xnzx в данном случае).

Снимок экрана: приложение Java liberty успешно развернуто в A S.

В форме создания кофе в сеансе задайте значения полей "Имя" и "Цена", а затем нажмите кнопку "Отправить". Через несколько секунд вы увидите количество отправки: 1 отображается в левой части страницы.

Снимок экрана: пример приложения, показывающий создание и сохранение нового кофе в сеансе приложения.

Чтобы продемонстрировать, что кэш сеансов сохраняется во всех репликах приложения, выполните следующую команду, чтобы удалить текущую реплику с именем javaee-cafe-jcache-cluster-<pod id from your running app>pod:

kubectl delete pod javaee-cafe-jcache-cluster-77d54bccd4-5xnzx

pod "javaee-cafe-jcache-cluster-77d54bccd4-5xnzx" deleted

Затем обновите домашнюю страницу приложения. Вы увидите те же данные, отображаемые в разделе "Новый кофе" в сеансе , но другое имя pod, отображаемое в левом верхнем углу страницы.

Наконец, выполните следующие действия, чтобы продемонстрировать, что данные сеанса сохраняются в экземпляре Кэш Azure для Redis. Команды можно выдавать экземпляру Кэш Azure для Redis с помощью консоли Redis.

  1. Найдите экземпляр Кэш Azure для Redis из портал Azure.

  2. Выберите консоль , чтобы открыть консоль Redis.

  3. Выполните следующие команды, чтобы просмотреть данные сеанса:

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. Найдите café.model.entity.Coffee[id=1, name=Coffee 3, price=30.0] на веб-странице, которая представляет собой созданный и сохраненный кофе в экземпляре Кэш Azure для Redis.

Очистка ресурсов

Чтобы избежать расходов за использование Azure, необходимо удалить ненужные ресурсы. Чтобы удалить ненужные кластер, группу ресурсов, службу контейнеров, реестр контейнеров и все связанные с ними ресурсы, выполните команду az group delete.

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

Чтобы удалить экземпляр Кэш Azure для Redis, найдите имя группы ресурсов и выполните следующую команду:

az group delete --name <AZURE_CACHE_FOR_REDIS_RESOURCE_GROUP_NAME> --yes --no-wait

Следующие шаги

Дополнительные сведения можно найти по следующим ссылкам:

Сведения о возможностях запуска продуктов WebSphere в Azure см. в статье "Что такое решения для запуска семейства продуктов WebSphere в Azure?"