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


Развертывание приложения 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.
  • Установите Quarkus CLI версии 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://[email protected]/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 Database for 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_PORTAZURE_POSTGRESQL_DATABASEи 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 Container Registry.

Используйте команду 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

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

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 Workload ID с Service Connector. Это подключение позволяет кластеру AKS получить доступ к гибкому серверу База данных Azure для PostgreSQL без использования проверки подлинности SQL.

Выполните следующие команды, чтобы создать подключение между кластером AKS и базой данных PostgreSQL с помощью Microsoft Entra Workload ID и Service Connector:

# 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_PORT, AZURE_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_PORT, AZURE_POSTGRESQL_DATABASE и AZURE_POSTGRESQL_USERNAME ключи на тайной карте соответствуют переменным окружения AZURE_CLIENT_ID, AZURE_POSTGRESQL_HOST, AZURE_POSTGRESQL_PORT, AZURE_POSTGRESQL_DATABASE и AZURE_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

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

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 apply для развертывания приложения 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.

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