Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье показано, как быстро развернуть 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" и нажав клавишу ВВОД, как показано на следующем снимке экрана:
Доступ к 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, выполнив следующие действия.
Получите локальный IP-адрес компьютера, на котором выполняется приложение Quarkus локально. Например, посетите сайт https://whatismyipaddress.com , чтобы получить общедоступный IP-адрес версии 4.
Определите переменную среды с локальным IP-адресом, который вы получили на предыдущем шаге.
export AZ_LOCAL_IP_ADDRESS=<your local IP address>
Выполните следующую команду, чтобы добавить локальный 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_PORT
AZURE_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
Вы можете найти его полезным для псевдонима 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 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
элемент завершённым.
Доступ к 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.
Следующие шаги
Azure Kubernetes Service