Использование 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.

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

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начать работу.

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

  • Используйте среду Bash в Azure Cloud Shell. Дополнительные сведения см . в кратком руководстве по Bash в Azure Cloud Shell.

  • Если вы предпочитаете выполнять справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, Azure CLI можно запустить в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.

    • Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы выполнить аутентификацию, следуйте инструкциям в окне терминала. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.

    • Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.

    • Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.

  • Для работы с этой статьей требуется последняя версия Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена.
  • Если вы выполняете команды в этом руководстве локально (вместо Azure Cloud Shell):
    • Подготовьте локальный компьютер с установленной операционной системой типа Unix (например, Ubuntu, macOS или подсистема Windows для Linux).
    • Установите реализацию Java SE версии 17 или более поздней (например, Eclipse Open J9).
    • Установите Maven 3.5.0 или более поздней версии.
    • Установите Docker для своей операционной системы.
  • Убедитесь, что вы были назначены как роль, так Owner и ContributorUser Access Administrator роли для подписки. Вы можете проверить назначения, выполнив действия, описанные в разделе "Перечисление назначений ролей" для пользователя или группы.

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

В этом разделе описано, как создать инфраструктуру приложений в 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 \
    --admin-enabled

Через некоторое время вы увидите выходные данные 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)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'passwords[0].value' \
    --output tsv)

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

Если вы успешно вошли в экземпляр 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. Если вы используете Azure Cloud Shell, kubectl уже установлен. Чтобы установить 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.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

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

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

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

  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 20230906

Если появится сообщение об отключенном состоянии 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.16.7
    [INFO] [err] [redisson-netty-2-2] 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 и определения в файле pom.xmlversion.

    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 will cause 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 will cause 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/3READY столбец и 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в данном случае).

Screenshot of Java liberty application successfully deployed on A K S.

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

Screenshot of sample application showing new coffee created and persisted in the session of the application.

Чтобы продемонстрировать, что кэш сеансов сохраняется во всех реплика приложения, выполните следующую команду, чтобы удалить текущую реплика с именем 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

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

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