Поделиться через


Развертывание приложения Java с помощью Quarkus в кластере Служба Azure Kubernetes

В этой статье показано, как быстро развернуть Red Hat Quarkus на Служба Azure Kubernetes (AKS) с простым приложением CRUD. Приложение — это список действий с интерфейсом JavaScript и конечной точкой REST. База данных Azure для PostgreSQL гибкий сервер предоставляет уровень сохраняемости для приложения. В статье показано, как протестировать приложение локально и развернуть его в AKS.

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

  • Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.
  • Подготовьте локальный компьютер с установленной операционной системой, например Ubuntu, macOS или подсистема Windows для Linux.
  • Установите реализацию Java SE версии 17 или более поздней версии, например сборку OpenJDK майкрософт.
  • Установите Maven, версию 3.9.8 или более позднюю.
  • Установите Docker для своей операционной системы.
  • Установите jq.
  • Установите cURL.
  • Установите cli Quarkus версии 3.12.1 или более поздней.
  • Azure CLI для сред, таких как Unix. В этой статье требуется только вариант Azure CLI Bash.
    • Разработчик должен установить Azure CLI и войти в интерактивном режиме с помощью команды az login , чтобы войти в Azure, прежде чем использовать DefaultAzureCredential в коде.
      az login
      
    • Для этой статьи требуется по крайней мере версия 2.61.0 Azure CLI.

Создание проекта приложения

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

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2024-12-16
cd aks-quarkus

Если появится сообщение об отключенном состоянии HEAD , это сообщение безопасно игнорировать. Так как в этой статье нет фиксаций, отсоединяемое состояние HEAD подходит.

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

В этом разделе показано, как локально запустить приложение.

Quarkus поддерживает автоматическую подготовку ненастроенных служб в режиме разработки и тестирования. Quarkus ссылается на эту возможность как службы разработки. Предположим, вы включаете функцию Quarkus, например подключение к службе базы данных. Вы хотите протестировать приложение, но еще не полностью настроили подключение к реальной базе данных. Quarkus автоматически запускает контейнерную версию заглушки соответствующей службы и подключает приложение к нему. Дополнительные сведения см. в разделе "Общие сведения о службах разработки" в документации по Quarkus.

Убедитесь, что среда контейнера запущена и используйте следующую команду, чтобы ввести режим разработки Quarkus:

quarkus dev

Вместо этого quarkus devможно выполнить то же самое с Помощью Maven mvn quarkus:dev.

Вам может быть предложено отправить данные телеметрии использования режима разработки Quarkus. Если да, ответьте, как вам нравится.

Режим разработки Quarkus обеспечивает динамическую перезагрузку с фоновой компиляцией. Если изменить любой аспект исходного кода приложения и обновить браузер, вы увидите изменения. Если возникают проблемы с компиляцией или развертыванием, вы ознакаете сообщение об ошибке. Режим разработки Quarkus прослушивает отладчик через порт 5005. Если вы хотите дождаться подключения отладчика перед выполнением, перед -Dsuspend выполнением Если отладчик вообще не нужен, можно использовать -Ddebug=false.

Выходные данные должны выглядеть следующим образом:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO  [io.quarkus] (Quarkus Main Thread) quarkus-todo-demo-app-aks 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.0.Final) started in 3.377s. Listening on: http://localhost:8080

INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]

--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>

Нажмите клавишу W в терминале, где выполняется режим разработки Quarkus. Ключ w открывает веб-браузер по умолчанию для отображения Todo приложения. Вы также можете получить доступ к графическому интерфейсу http://localhost:8080 приложения напрямую.

Снимок экрана: пример приложения Todo.

Попробуйте выбрать несколько элементов todo в списке дел. Пользовательский интерфейс указывает выделение с помощью стиля текста с зачеркнутыми элементами. Вы также можете добавить новый элемент todo в список дел, введя "Проверить приложения todo" и нажав клавишу ВВОД, как показано на следующем снимке экрана:

Снимок экрана: пример приложения Todo с добавленными новыми элементами.

Доступ к API RESTful (/api) для получения всех элементов todo, которые хранятся в локальной базе данных PostgreSQL:

curl --verbose http://localhost:8080/api | jq .

Выходные данные должны выглядеть следующим образом:

* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 664
< Content-Type: application/json;charset=UTF-8
<
{ [664 bytes data]
100   664  100   664    0     0  13278      0 --:--:-- --:--:-- --:--:-- 15441
* Connection #0 to host localhost left intact
[
  {
    "id": 1,
    "title": "Introduction to Quarkus Todo App",
    "completed": false,
    "order": 0,
    "url": null
  },
  {
    "id": 2,
    "title": "Quarkus on Azure App Service",
    "completed": false,
    "order": 1,
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "id": 3,
    "title": "Quarkus on Azure Container Apps",
    "completed": false,
    "order": 2,
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "id": 4,
    "title": "Quarkus on Azure Functions",
    "completed": false,
    "order": 3,
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "id": 5,
    "title": "Verify Todo apps",
    "completed": false,
    "order": 5,
    "url": null
  }
]

Нажмите q, чтобы выйти из режима разработки Quarkus.

Создание ресурсов Azure для запуска приложения Quarkus

В этом разделе показано, как создать следующие ресурсы Azure для запуска примера приложения Quarkus:

  • Гибкий сервер Базы данных Azure для PostgreSQL
  • Реестр контейнеров Azure
  • Служба Azure Kubernetes (AKS)

Примечание.

В этой статье отключается проверка подлинности PostgreSQL для демонстрации рекомендаций по обеспечению безопасности. Идентификатор Microsoft Entra используется для проверки подлинности подключения к серверу. Если необходимо включить проверку подлинности PostgreSQL, ознакомьтесь с кратким руководством. Использование Java и JDBC с База данных Azure для PostgreSQL — гибкий сервер и перейдите на вкладку "Пароль".

Некоторые из этих ресурсов должны иметь уникальные имена в пределах подписки Azure. Чтобы обеспечить эту уникальность, можно использовать инициалы, последовательность, дату, суффикс шаблон. Чтобы применить этот шаблон, присвойте ресурсам имя, перечислив свои инициалы, некоторые порядковые номера, текущую дату и определенный суффикс ресурса, например rg для группы ресурсов. Следующие переменные среды используют этот шаблон. Замените значения UNIQUE_VALUE заполнителей и собственными значениями, LOCATION а затем выполните следующие команды в терминале:

export UNIQUE_VALUE=<your unique value, such as ejb010717>
export RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg
export LOCATION=<your desired Azure region for deploying your resources - for example, northeurope>
export REGISTRY_NAME=${UNIQUE_VALUE}reg
export DB_SERVER_NAME=${UNIQUE_VALUE}db
export DB_NAME=demodb
export CLUSTER_NAME=${UNIQUE_VALUE}aks
export AKS_NS=${UNIQUE_VALUE}ns

Создание гибкого сервера База данных Azure для PostgreSQL

Гибкий сервер Базы данных Azure для PostgreSQL — это полностью управляемая служба базы данных, которая обеспечивает более детализированный контроль и гибкость функций управления базами данных, а также параметров конфигурации. В этом разделе показано, как создать экземпляр гибкого сервера База данных Azure для PostgreSQL с помощью Azure CLI.

Сначала создайте группу ресурсов для хранения сервера базы данных и других ресурсов с помощью следующей команды:

az group create \
    --name $RESOURCE_GROUP_NAME \
    --location $LOCATION

Затем создайте гибкий экземпляр сервера База данных Azure для PostgreSQL с помощью следующей команды:

az postgres flexible-server create \
    --name $DB_SERVER_NAME \
    --database-name $DB_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --public-access 0.0.0.0 \
    --sku-name Standard_B1ms \
    --tier Burstable \
    --active-directory-auth Enabled \
    --yes

Создание сервера, базы данных, пользователя администратора и правил брандмауэра занимает несколько минут. Если команда выполнена успешно, выходные данные выглядят примерно так:

{
  "connectionString": "postgresql://REDACTED@ejb011212qdb.postgres.database.azure.com/demodb?sslmode=require",
  "databaseName": "demodb",
  "firewallName": "AllowAllAzureServicesAndResourcesWithinAzureIps_2024-12-12_14-30-22",
  "host": "ejb011212qdb.postgres.database.azure.com",
  "id": "/subscriptions/c7844e91-b11d-4a7f-ac6f-996308fbcdb9/resourceGroups/ejb011211sfi/providers/Microsoft.DBforPostgreSQL/flexibleServers/ejb011212qdb",
  "location": "East US 2",
  "password": "REDACTED",
  "resourceGroup": "ejb011211sfi",
  "skuname": "Standard_B1ms",
  "username": "sorrycamel2",
  "version": "16"
}

Локальное тестирование приложения с помощью гибкого сервера База данных Azure для PostgreSQL

В предыдущем разделе вы тестировали приложение Quarkus локально в режиме разработки с базой данных PostgreSQL, подготовленной в качестве контейнера Docker. Теперь проверьте подключение к локальному экземпляру гибкого сервера База данных Azure для PostgreSQL.

Сначала добавьте текущего вошедшего пользователя в качестве администратора Microsoft Entra в экземпляр гибкого сервера База данных Azure для PostgreSQL с помощью следующих команд:

ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)
az postgres flexible-server ad-admin create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server-name $DB_SERVER_NAME \
    --display-name $ENTRA_ADMIN_NAME \
    --object-id $(az ad signed-in-user show --query id --output tsv)

Успешные выходные данные — это объект JSON, включая свойство "type": "Microsoft.DBforPostgreSQL/flexibleServers/administrators".

Затем добавьте локальный IP-адрес в правила брандмауэра экземпляра гибкого сервера База данных Azure для PostgreSQL, выполнив следующие действия.

  1. Получите локальный IP-адрес компьютера, на котором выполняется приложение Quarkus локально. Например, посетите сайт https://whatismyipaddress.com , чтобы получить общедоступный IP-адрес версии 4.

  2. Определите переменную среды с локальным IP-адресом, который вы получили на предыдущем шаге.

    export AZ_LOCAL_IP_ADDRESS=<your local IP address>
    
  3. Выполните следующую команду, чтобы добавить локальный IP-адрес в правила брандмауэра экземпляра гибкого сервера База данных Azure для PostgreSQL:

    az postgres flexible-server firewall-rule create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $DB_SERVER_NAME \
        --rule-name $DB_SERVER_NAME-database-allow-local-ip \
        --start-ip-address $AZ_LOCAL_IP_ADDRESS \
        --end-ip-address $AZ_LOCAL_IP_ADDRESS
    

Затем задайте следующие переменные среды в предыдущем терминале. Эти переменные среды используются для подключения к экземпляру гибкого сервера База данных Azure для PostgreSQL из приложения Quarkus, работающего локально:

export AZURE_POSTGRESQL_HOST=${DB_SERVER_NAME}.postgres.database.azure.com
export AZURE_POSTGRESQL_PORT=5432
export AZURE_POSTGRESQL_DATABASE=${DB_NAME}
export AZURE_POSTGRESQL_USERNAME=${ENTRA_ADMIN_NAME}

Примечание.

Значения переменных AZURE_POSTGRESQL_HOSTсреды , AZURE_POSTGRESQL_DATABASEAZURE_POSTGRESQL_PORTи AZURE_POSTGRESQL_USERNAME считываются свойствами конфигурации базы данных, определенными в файле src/main/resources/application.properties, представленном в предыдущем разделе. Эти значения автоматически внедряются в приложение во время выполнения с помощью расширения без пароля соединителя службы при развертывании приложения Quarkus в кластере AKS далее в этой статье.

Теперь запустите приложение Quarkus локально, чтобы проверить подключение к экземпляру гибкого сервера База данных Azure для PostgreSQL. Используйте следующую команду, чтобы запустить приложение в рабочем режиме:

quarkus build
java -jar target/quarkus-app/quarkus-run.jar

Примечание.

Если приложение не удается начать с сообщения об ошибке, похожее ERROR [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) Acquisition timeout while waiting for new connectionна , скорее всего, из-за сетевого параметра локального компьютера. Повторите попытку добавить текущий IP-адрес клиента из портал Azure. Дополнительные сведения см. в разделе "Создание правила брандмауэра после создания сервера" в разделе "Создание правил брандмауэра и управление ими" для База данных Azure для PostgreSQL — гибкий сервер с помощью портал Azure. Затем снова запустите приложение.

Откройте новый веб-браузер для http://localhost:8080 доступа к приложению Todo. Вы должны увидеть приложение Todo, похожее на то, что вы видели при локальном запуске приложения в режиме разработки.

создадите экземпляр реестра контейнеров Azure;

Так как Quarkus — это облачная технология, она имеет встроенную поддержку создания контейнеров, работающих в Kubernetes. Kubernetes полностью зависит от наличия реестра контейнеров, из которого он находит образы контейнеров для запуска. AKS имеет встроенную поддержку Реестр контейнеров Azure.

Используйте команду az acr create для создания экземпляра реестра контейнеров. В следующем примере создается экземпляр реестра контейнеров с именем значения переменной ${REGISTRY_NAME}среды:

az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location ${LOCATION} \
    --name $REGISTRY_NAME \
    --sku Basic

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

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "<YOUR_RESOURCE_GROUP>",

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

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

Подключение docker к экземпляру реестра контейнеров

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

az acr login --name $REGISTRY_NAME

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

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

Используйте команду az aks create, чтобы создать кластер AKS. В следующем примере создается кластер с именем со значением переменной ${CLUSTER_NAME} среды с одним узлом. Кластер подключен к экземпляру реестра контейнеров, созданному на предыдущем шаге. Выполнение этой команды занимает несколько минут. Кластер запускается с включенным управляемым удостоверением. Этот шаг необходим для подключения к базе данных без пароля.

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

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

  "nodeResourceGroup": "MC_<your resource_group_name>_<your cluster name>_<your region>",
  "privateFqdn": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "<your resource group name>",

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

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

az aks install-cli

Дополнительные сведения о kubectlсредстве командной строки (kubectl) см. в документации kubernetes.

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

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

Успешные выходные данные включают текст, аналогичный следующему примеру:

Merged "ejb010718aks-admin" as current context in /Users/edburns/.kube/config

Вы можете найти его полезным для псевдонима k kubectl. В этом случае используйте следующую команду:

alias k=kubectl

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

kubectl get nodes

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

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

Создание пространства имен в AKS

Используйте следующую команду, чтобы создать новое пространство имен в службе Kubernetes для приложения Quarkus:

kubectl create namespace ${AKS_NS}

Выходные данные должны выглядеть следующим образом:

namespace/<your namespace> created

Создание подключения к службе в AKS с помощью соединителя службы

В этом разделе описано, как создать подключение к службе между кластером AKS и гибким сервером База данных Azure для PostgreSQL с помощью Идентификация рабочей нагрузки Microsoft Entra с соединителем службы. Это подключение позволяет кластеру AKS получить доступ к гибкому серверу База данных Azure для PostgreSQL без использования проверки подлинности SQL.

Выполните следующие команды, чтобы создать подключение между кластером AKS и базой данных PostgreSQL с помощью Идентификация рабочей нагрузки Microsoft Entra с соединителем службы:

# 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_POSTGRESQL_RESOURCE_ID=$(az postgres flexible-server show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DB_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 PostgreSQL database using Microsoft Entra Workload ID
az aks connection create postgres-flexible \
    --connection akspostgresconn \
    --kube-namespace $AKS_NS \
    --source-id $AKS_CLUSTER_RESOURCE_ID \
    --target-id $AZURE_POSTGRESQL_RESOURCE_ID/databases/$DB_NAME \
    --workload-identity $UAMI_RESOURCE_ID

Наличие следующего JSON в выходных данных конечной команды на предыдущих шагах указывает на успешную установку соединителя службы:

"name": "akspostgresconn",
"provisioningState": "Succeeded",

Примечание.

Мы рекомендуем использовать Идентификация рабочей нагрузки Microsoft Entra для безопасного доступа к гибкому серверу База данных Azure для PostgreSQL без использования проверки подлинности имени пользователя и пароля. Если необходимо использовать проверку подлинности имени пользователя и пароля, пропустить предыдущие шаги в этом разделе и использовать имя пользователя и пароль для подключения к базе данных.

Получение учетной записи службы и секрета, созданного соединителем службы

Чтобы пройти проверку подлинности на гибком сервере База данных Azure для PostgreSQL, необходимо получить учетную запись службы и секрет Kubernetes, созданный соединителем службы. Следуйте инструкциям в разделе "Обновление контейнера" руководства. Подключение приложения AKS к База данных SQL Azure. Выберите параметр "Напрямую создать развертывание" с помощью предоставленного фрагмента кода YAML и выполните следующий шаг:

  • Из выделенных разделов в примере YAML развертывания Kubernetes скопируйте значения serviceAccountName и secretRef.name, представленные в <service-account-name> <secret-name> следующем примере:

    serviceAccountName: <service-account-name>
    containers:
    - name: raw-linux
        envFrom:
           - secretRef:
              name: <secret-name>
    

    Эти значения используются в следующем разделе для развертывания приложения Quarkus в кластере AKS.

Настройка собственной конфигурации облака

В качестве облачной технологии Quarkus предлагает возможность автоматически настраивать ресурсы для стандартных Kubernetes, Red Hat OpenShift и Knative. Дополнительные сведения см. в руководстве Quarkus Kubernetes, руководстве Quarkus OpenShift и руководстве quarkus Knative. Разработчики могут развернуть приложение в целевом кластере Kubernetes, применяя созданные манифесты.

Чтобы создать соответствующие ресурсы Kubernetes, используйте следующую команду, чтобы добавить quarkus-kubernetes и container-image-jib расширения в локальный терминал:

quarkus ext add kubernetes container-image-jib

Quarkus изменяет POM, чтобы убедиться, что эти расширения перечислены как <dependencies>. Если будет предложено установить что-то вызываемое JBang, ответьте да и разрешите его установке.

Выходные данные должны выглядеть следующим образом:

[SUCCESS] ✅  Extension io.quarkus:quarkus-kubernetes has been installed
[SUCCESS] ✅  Extension io.quarkus:quarkus-container-image-jib has been installed

Чтобы проверить добавление расширений, можно запустить git diff и проверить выходные данные.

Как облачная технология Quarkus поддерживает понятие профилей конфигурации. Quarkus имеет следующие три встроенных профиля:

  • dev — активируется в режиме разработки
  • test — активируется при выполнении тестов
  • prod — Профиль по умолчанию, если он не запущен в режиме разработки или тестирования

Quarkus поддерживает любое количество именованных профилей по мере необходимости.

Остальные действия, описанные в этом разделе, позволяют настроить значения в файле src/main/resources/application.properties .

Префикс prod. указывает, что эти свойства активны при выполнении prod в профиле. Дополнительные сведения о профилях конфигурации см. в документации Quarkus.

Конфигурация базы данных

Изучите следующие переменные конфигурации базы данных. Связанные свойства %prod.quarkus.datasource.jdbc.url подключения к базе данных и %prod.quarkus.datasource.username значения считываются из переменных AZURE_POSTGRESQL_HOSTсреды , AZURE_POSTGRESQL_PORTAZURE_POSTGRESQL_DATABASEи AZURE_POSTGRESQL_USERNAMEсоответственно. Эти переменные среды сопоставляют с секретными значениями, которые хранят сведения о подключении к базе данных. По соображениям безопасности они автоматически генерируются с помощью расширения без пароля соединителя служб, как показано в этой статье.

# Database configurations
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
&sslmode=require
%prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME}
%prod.quarkus.datasource.jdbc.acquisition-timeout=10
%prod.quarkus.hibernate-orm.database.generation=drop-and-create
%prod.quarkus.hibernate-orm.sql-load-script=import.sql

Конфигурация Kubernetes

Изучите следующие переменные конфигурации Kubernetes. service-type установлено, чтобы load-balancer получить доступ к приложению извне. Замените значения <service-account-name> <secret-name> и значения фактических значений, скопированных в предыдущем разделе.

# Kubernetes configurations
%prod.quarkus.kubernetes.deployment-target=kubernetes
%prod.quarkus.kubernetes.service-type=load-balancer
%prod.quarkus.kubernetes.labels."azure.workload.identity/use"=true
%prod.quarkus.kubernetes.service-account=<service-account-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_CLIENT_ID.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_CLIENT_ID.with-key=AZURE_POSTGRESQL_CLIENTID
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_HOST.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_HOST.with-key=AZURE_POSTGRESQL_HOST
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_PORT.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_PORT.with-key=AZURE_POSTGRESQL_PORT
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_DATABASE.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_DATABASE.with-key=AZURE_POSTGRESQL_DATABASE
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_USERNAME.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_USERNAME.with-key=AZURE_POSTGRESQL_USERNAME

Другие конфигурации Kubernetes указывают сопоставление значений секрета с переменными среды в приложении Quarkus. Секрет <secret-name> содержит сведения о подключении к базе данных. AZURE_POSTGRESQL_CLIENTID, AZURE_POSTGRESQL_HOST, AZURE_POSTGRESQL_DATABASEAZURE_POSTGRESQL_PORTи AZURE_POSTGRESQL_USERNAME ключи в схеме секрета с AZURE_CLIENT_IDпеременными , AZURE_POSTGRESQL_HOSTAZURE_POSTGRESQL_PORTAZURE_POSTGRESQL_DATABASEAZURE_POSTGRESQL_USERNAME и среды соответственно.

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

kubectl -n ${AKS_NS} get secret <secret-name> -o jsonpath="{.data.AZURE_POSTGRESQL_USERNAME}" | base64 --decode

Конфигурация образа контейнера

В качестве облачной технологии Quarkus поддерживает создание образов контейнеров OCI, совместимых с Docker. Замените значение <LOGIN_SERVER_VALUE> фактической переменной ${LOGIN_SERVER} среды.

# Container Image Build
%prod.quarkus.container-image.build=true
%prod.quarkus.container-image.image=<LOGIN_SERVER_VALUE>/todo-quarkus-aks:1.0

В качестве окончательной проверки при завершении всех необходимых подстановок в application.properties не должно быть вхождения символа < . Если есть, дважды проверьте, выполнили ли вы все необходимые замены.

Создание образа контейнера и отправка его в реестр контейнеров

Теперь используйте следующую команду для создания самого приложения. Эта команда использует расширения Kubernetes и Jib для создания образа контейнера.

quarkus build --no-tests

Выходные данные должны заканчиваться BUILD SUCCESS. Файлы манифеста Kubernetes создаются в target/kubernetes, как показано в следующем примере:

tree target/kubernetes
target/kubernetes
├── kubernetes.json
└── kubernetes.yml

0 directories, 2 files

Вы можете проверить, создается ли образ контейнера, а также с помощью docker командной строки (CLI). Результат должен быть аналогичным приведенному ниже:

docker images | grep todo-quarkus-aks
<LOGIN_SERVER_VALUE>/todo-quarkus-aks   1.0       b13c389896b7   18 minutes ago   422MB

Отправьте образы контейнеров в реестр контейнеров с помощью следующей команды:

export TODO_QUARKUS_TAG=$(docker images | grep todo-quarkus-aks | head -n1 | cut -d " " -f1)
echo ${TODO_QUARKUS_TAG}
docker push ${TODO_QUARKUS_TAG}:1.0

Результат должен выглядеть следующим образом:

The push refers to repository [<LOGIN_SERVER_VALUE>/todo-quarkus-aks]
dfd615499b3a: Pushed
56f5cf1aa271: Pushed
4218d39b228e: Pushed
b0538737ed64: Pushed
d13845d85ee5: Pushed
60609ec85f86: Pushed
1.0: digest: sha256:0ffd70d6d5bb3a4621c030df0d22cf1aa13990ca1880664d08967bd5bab1f2b6 size: 1995

После отправки приложения в реестр контейнеров можно сообщить AKS запустить приложение.

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

В этом разделе показано, как запустить пример приложения Quarkus в созданных вами ресурсах Azure.

Использование kubectl для развертывания приложения Quarkus в AKS

Разверните ресурсы Kubernetes с помощью kubectl командной строки, как показано в следующем примере:

kubectl apply -f target/kubernetes/kubernetes.yml -n ${AKS_NS}

Выходные данные должны выглядеть следующим образом:

service/quarkus-todo-demo-app-aks created
deployment.apps/quarkus-todo-demo-app-aks created

Убедитесь, что приложение запущено с помощью следующей команды:

kubectl -n $AKS_NS get pods

Если значение STATUS поля отображает что-либо другое Running, устраните и устраните проблему, прежде чем продолжить. Это может помочь изучить журналы pod с помощью следующей команды:

kubectl -n $AKS_NS logs $(kubectl -n $AKS_NS get pods | grep quarkus-todo-demo-app-aks | cut -d " " -f1)

EXTERNAL-IP Получите доступ к приложению Todo с помощью следующей команды:

kubectl get svc -n ${AKS_NS}

Выходные данные должны выглядеть следующим образом:

NAME                        TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
quarkus-todo-demo-app-aks   LoadBalancer   10.0.236.101   20.12.126.200   80:30963/TCP   37s

Для сохранения значения переменной среды в качестве полного EXTERNAL-IP URL-адреса можно использовать следующую команду:

export QUARKUS_URL=http://$(kubectl get svc -n ${AKS_NS} | grep quarkus-todo-demo-app-aks | cut -d " " -f10)
echo $QUARKUS_URL

Откройте новый веб-браузер со значением ${QUARKUS_URL}. Затем добавьте новый элемент todo с текстом Deployed the Todo app to AKS. Кроме того, выберите Introduction to Quarkus Todo App элемент как завершенный.

Снимок экрана: пример приложения Todo, запущенного в AKS.

Доступ к API RESTful (/api) для получения всех элементов todo, хранящихся в базе данных Azure PostgreSQL, как показано в следующем примере:

curl --verbose ${QUARKUS_URL}/api | jq .

Выходные данные должны выглядеть следующим образом:

* Connected to 20.237.68.225 (20.237.68.225) port 80 (#0)
> GET /api HTTP/1.1
> Host: 20.237.68.225
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 828
< Content-Type: application/json;charset=UTF-8
<
[
  {
    "id": 2,
    "title": "Quarkus on Azure App Service",
    "completed": false,
    "order": 1,
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "id": 3,
    "title": "Quarkus on Azure Container Apps",
    "completed": false,
    "order": 2,
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "id": 4,
    "title": "Quarkus on Azure Functions",
    "completed": false,
    "order": 3,
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "id": 5,
    "title": "Deployed the Todo app to AKS",
    "completed": false,
    "order": 5,
    "url": null
  },
  {
    "id": 1,
    "title": "Introduction to Quarkus Todo App",
    "completed": true,
    "order": 0,
    "url": null
  }
]

Убедитесь, что база данных обновлена

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

ACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
az postgres flexible-server execute \
    --admin-user $ENTRA_ADMIN_NAME \
    --admin-password $ACCESS_TOKEN \
    --name $DB_SERVER_NAME \
    --database-name $DB_NAME \
    --querytext "select * from todo;"

Если вам будет предложено установить расширение, ответ Y.

Выходные данные должны выглядеть примерно так, как показано в следующем примере, и должны содержать те же элементы в графическом интерфейсе приложения Todo и выходных curl данных команды ранее:

Successfully connected to <DB_SERVER_NAME>.
Ran Database Query: 'select * from todo;'
Retrieving first 30 rows of query output, if applicable.
Closed the connection to <DB_SERVER_NAME>
[
  {
    "completed": false,
    "id": 2,
    "ordering": 1,
    "title": "Quarkus on Azure App Service",
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "completed": false,
    "id": 3,
    "ordering": 2,
    "title": "Quarkus on Azure Container Apps",
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "completed": false,
    "id": 4,
    "ordering": 3,
    "title": "Quarkus on Azure Functions",
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "completed": false,
    "id": 5,
    "ordering": 5,
    "title": "Deployed the Todo app to AKS",
    "url": null
  },
  {
    "completed": true,
    "id": 1,
    "ordering": 0,
    "title": "Introduction to Quarkus Todo App",
    "url": null
  }
]

По завершении удалите правило брандмауэра, позволяющее локальному IP-адресу получить доступ к экземпляру гибкого сервера База данных Azure для PostgreSQL с помощью следующей команды:

az postgres flexible-server firewall-rule delete \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DB_SERVER_NAME \
    --rule-name $DB_SERVER_NAME-database-allow-local-ip \
    --yes

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

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

git reset --hard
docker rmi ${TODO_QUARKUS_TAG}:1.0
docker rmi postgres
az identity delete --ids ${UAMI_RESOURCE_ID}
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Вы также можете использовать для docker rmi удаления образов postgres контейнеров и testcontainers создания в режиме разработки Quarkus.

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