Implantar um aplicativo Java com o Quarkus em um cluster do Serviço de Kubernetes do Azure
Esse artigo mostra como implantar rapidamente o Red Hat Quarkus no Serviço de Kubernetes do Azure (AKS) com um aplicativo CRUD simples. O aplicativo é uma "lista de tarefas" com um front-end em JavaScript e um ponto de extremidade REST. O Servidor Flexível do Banco de Dados do Azure para PostgreSQL fornece a camada de persistência para o aplicativo. O artigo mostra como testar seu aplicativo localmente e implantá-lo no AKS.
Pré-requisitos
- Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.
- Prepare um computador local com sistema operacional semelhante ao Unix instalado - por exemplo, Ubuntu, macOS ou o Subsistema do Windows para Linux.
- Instale uma implementação Java SE versão 17 ou posterior – por exemplo, o build da Microsoft do OpenJDK.
- Instale o Maven, versão 3.9.8 ou superior.
- Instalar o Docker para o seu sistema operacional.
- Instale o jq.
- Instale o cURL.
- Instale a CLI do Quarkus, versão 3.12.1 ou superior.
- CLI do Azure para ambientes do tipo Unix. Esse artigo requer apenas a variante Bash da CLI do Azure.
Um desenvolvedor deve instalar a CLI do Azure e entrar interativamente com o comando az login para fazer logon no Azure antes de usar o DefaultAzureCredential no código. az login
- Este artigo requer pelo menos a versão 2.61.0 da CLI do Azure.
Criar o projeto de aplicativo
Use o comando a seguir para clonar o projeto Java de exemplo para este artigo. O exemplo está no GitHub.
git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2024-12-16
cd aks-quarkus
Se você vir uma mensagem sobre estar no estado HEAD desanexado, essa mensagem pode ser ignorada com segurança. Como esse artigo não requer nenhum commit, o estado HEAD desanexado é apropriado.
Testar seu aplicativo Quarkus localmente
As etapas nessa seção mostram como executar o aplicativo localmente.
O Quarkus dá suporte ao provisionamento automático de serviços não configurados no modo de desenvolvimento e teste. O Quarkus refere-se a essa capacidade como serviços de desenvolvimento. Digamos que você inclua um recurso do Quarkus, como conectar-se a um serviço de banco de dados. Você deseja testar o aplicativo, mas ainda não configurou totalmente a conexão com um banco de dados real. O Quarkus inicia automaticamente uma versão de stub em contêineres do serviço relevante e conecta seu aplicativo a ele. Para obter mais informações, confira Visão Geral dos Serviços de Desenvolvimento na documentação do Quarkus.
Verifique se o ambiente de contêiner está em execução e use o seguinte comando para entrar no modo de desenvolvimento do Quarkus:
quarkus dev
Em vez de quarkus dev
, você pode realizar a mesma coisa com o Maven usando mvn quarkus:dev
.
Talvez você precise responder se deseja enviar telemetria sobre a utilização do modo de desenvolvimento do Quarkus. Nesse caso, responda como quiser.
O modo de desenvolvimento do Quarkus permite recarregar ao vivo com compilação em segundo plano. Se você modificar qualquer aspecto do código-fonte do aplicativo e atualizar o navegador, poderá ver as alterações. Se houver algum problema com a compilação ou implantação, uma página de erro informará você. O modo de desenvolvimento do Quarkus escuta um depurador na porta 5005. Se você quiser esperar que o depurador seja anexado antes de executar, passe -Dsuspend
na linha de comando. Se você não quiser o depurador, poderá usar -Ddebug=false
.
A saída deve ser semelhante ao exemplo a seguir:
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
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>
Pressione w no terminal onde o modo de desenvolvimento do Quarkus está sendo executado. A tecla w abre seu navegador padrão para mostrar o aplicativo Todo
. Você também pode acessar a GUI do aplicativo diretamente no http://localhost:8080
.
Tente selecionar alguns itens de tarefas na lista de tarefas. A interface do usuário indica a seleção com um estilo de texto tachado. Você também pode adicionar um novo item todo à lista todo digitando Verificar aplicativos Todo e pressionando Enter, conforme mostrado na seguinte captura de tela:
Acesse a API RESTful (/api
) para obter todos os itens de tarefas armazenados no banco de dados PostgreSQL local:
curl --verbose http://localhost:8080/api | jq .
A saída deve ser semelhante ao exemplo a seguir:
* 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
}
]
Pressione q para sair do modo de desenvolvimento do Quarkus.
Crie os recursos do Azure para executar o aplicativo Quarkus
As etapas nessa seção mostram como criar os seguintes recursos do Azure para executar o aplicativo de exemplo do Quarkus:
- Banco de Dados do Azure para PostgreSQL Servidor Flexível
- Registro de Contêiner do Azure
- AKS (Serviço de Kubernetes do Azure)
Observação
Este artigo desabilita a autenticação postgreSQL para ilustrar as práticas recomendadas de segurança. O Microsoft Entra ID é usado para autenticar a conexão com o servidor. Se você precisar habilitar a autenticação do PostgreSQL, consulte Início Rápido: Use Java e JDBC com o Banco de Dados do Azure para PostgreSQL – Servidor Flexível e selecione a guia Senha.
Alguns desses recursos devem ter nomes exclusivos dentro do escopo da assinatura do Azure. Para garantir essa exclusividade, você pode usar o padrão de iniciais, sequência, data e sufixo. Para aplicar esse padrão, nomeie seus recursos listando suas iniciais, algum número de sequência, a data de hoje e algum tipo de sufixo específico do recurso - por exemplo, rg
para "grupo de recursos". As variáveis de ambiente a seguir usam esse padrão. Substitua os valores de espaço reservado UNIQUE_VALUE
e LOCATION
por seus próprios valores e execute os seguintes comandos em seu terminal:
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
Criar um servidor flexível do Banco de Dados do Azure para PostgreSQL
O Servidor Flexível do Banco de Dados do Azure para PostgreSQL é um serviço de banco de dados totalmente gerenciado projetado para fornecer controle e flexibilidade mais granulares nas funções de gerenciamento de banco de dados e definições de configuração. Esta seção mostra como criar uma instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando a CLI do Azure.
Primeiro, crie um grupo de recursos para conter o servidor de banco de dados e outros recursos usando o seguinte comando:
az group create \
--name $RESOURCE_GROUP_NAME \
--location $LOCATION
Em seguida, crie uma instância de servidor flexível do Banco de Dados do Azure para PostgreSQL usando o seguinte comando:
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
Leva alguns minutos para criar o servidor, o banco de dados, o usuário administrador e as regras de firewall. Se o comando for bem-sucedido, a saída será semelhante ao exemplo a seguir:
{
"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"
}
Testar o aplicativo localmente com o Servidor Flexível do Banco de Dados do Azure para PostgreSQL
Na seção anterior, você testou o aplicativo Quarkus localmente no modo de desenvolvimento com um banco de dados PostgreSQL provisionado como um contêiner do Docker. Agora, teste a conexão com a instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL localmente.
Primeiro, adicione o usuário conectado atual como Administrador do Microsoft Entra à instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando os seguintes comandos:
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)
A saída bem-sucedida é um objeto JSON, que inclui a propriedade "type": "Microsoft.DBforPostgreSQL/flexibleServers/administrators"
.
Em seguida, adicione o endereço IP local às regras de firewall da instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL seguindo estas etapas:
Obtenha o endereço IP local do computador em que você executa o aplicativo Quarkus localmente. Por exemplo, visite https://whatismyipaddress.com para obter seu endereço IP público v4.
Defina uma variável de ambiente com o endereço IP local que você obteve na etapa anterior.
export AZ_LOCAL_IP_ADDRESS=<your local IP address>
Execute o seguinte comando para adicionar o endereço IP local às regras de firewall da instância do Servidor Flexível do Banco de Dados do Azure para 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
Em seguida, defina as variáveis de ambiente a seguir no terminal anterior. Essas variáveis de ambiente são usadas para se conectar à instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL do aplicativo Quarkus em execução localmente:
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}
Observação
Os valores das variáveis de ambiente AZURE_POSTGRESQL_HOST
, AZURE_POSTGRESQL_PORT
, AZURE_POSTGRESQL_DATABASE
e AZURE_POSTGRESQL_USERNAME
são lidos pelas propriedades de configuração de banco de dados definidas no arquivo src/main/resources/application.properties introduzido na seção anterior. Esses valores são injetados automaticamente no aplicativo em runtime usando a extensão sem senha do Conector de Serviço quando você implanta o aplicativo Quarkus no cluster do AKS mais adiante neste artigo.
Agora, execute o aplicativo Quarkus localmente para testar a conexão com a instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL. Use o seguinte comando para iniciar o aplicativo no modo de produção:
quarkus build
java -jar target/quarkus-app/quarkus-run.jar
Observação
Se o aplicativo não iniciar com uma mensagem de erro semelhante a ERROR [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) Acquisition timeout while waiting for new connection
, provavelmente será devido à configuração de rede do computador local. Tente selecionar Adicionar o endereço IP do cliente atual no portal do Azure novamente. Para obter mais informações, consulte a seção Criar uma regra de firewall depois que o servidor for criado em Criar e gerenciar regras de firewall para o Banco de Dados do Azure para PostgreSQL – Servidor Flexível usando o portal do Azure. Em seguida, execute o aplicativo novamente.
Abra um novo navegador da Web para http://localhost:8080
para acessar o aplicativo Todo. Você deve ver o aplicativo Todo, semelhante ao que viu quando executou o aplicativo localmente no modo de desenvolvimento.
Cria uma instância do Registro de Contêiner do Azure
Como o Quarkus é uma tecnologia nativa de nuvem, ele tem suporte integrado para a criação de contêineres executados no Kubernetes. O Kubernetes é depende totalmente de ter um registro de contêiner de onde ele localiza as imagens de contêiner para executar. O AKS tem suporte interno para o Registro de Contêiner do Azure.
Use o comando az acr create para criar a instância do registro de contêiner. O exemplo a seguir cria uma instância de registro de contêiner nomeada com o valor da variável de ambiente ${REGISTRY_NAME}
:
az acr create \
--resource-group $RESOURCE_GROUP_NAME \
--location ${LOCATION} \
--name $REGISTRY_NAME \
--sku Basic
Após um curto período de tempo, você deverá ver a saída JSON que contém as linhas a seguir:
"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"resourceGroup": "<YOUR_RESOURCE_GROUP>",
Obtenha o servidor de logon da instância do Registro de Contêiner usando o seguinte comando:
export LOGIN_SERVER=$(az acr show \
--name $REGISTRY_NAME \
--query 'loginServer' \
--output tsv)
echo $LOGIN_SERVER
Conectar seu docker à instância do registro de contêiner
Entre na instância do registro de contêiner. Entrar permite que você envie uma imagem por push. Use o seguinte comando para entrar no Registro:
az acr login --name $REGISTRY_NAME
Se você entrou na instância do registro de contêiner com êxito, deverá ver Login Succeeded
no final da saída do comando.
Criar um cluster AKS
Use o comando az aks create para criar um cluster do AKS. O exemplo a seguir cria um cluster nomeado com o valor de sua variável de ambiente ${CLUSTER_NAME}
com um nó. O cluster está conectado à instância do registro de contêiner que você criou em uma etapa anterior. Esse comando leva vários minutos para ser concluído. O cluster é iniciado com a identidade gerenciada habilitada. Essa etapa é necessária para a conexão de banco de dados sem senha.
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--attach-acr $REGISTRY_NAME \
--node-count 1 \
--generate-ssh-keys \
--enable-managed-identity
Após alguns minutos, o comando é concluído e retorna informações formatadas em JSON sobre o cluster, incluindo a saída a seguir:
"nodeResourceGroup": "MC_<your resource_group_name>_<your cluster name>_<your region>",
"privateFqdn": null,
"provisioningState": "Succeeded",
"resourceGroup": "<your resource group name>",
Conecte-se ao cluster do AKS
Para gerenciar um cluster do Kubernetes, use o kubectl
, o cliente de linha de comando do Kubernetes. Para instalar o kubectl
localmente, use o comando az aks install-cli, conforme mostrado no exemplo a seguir:
az aks install-cli
Para obter mais informações sobre kubectl
, confira Ferramenta de linha de comando (kubectl) na documentação do Kubernetes.
Para configurar o kubectl
para se conectar ao seu cluster de Kubernetes, use o comando az aks get-credentials, conforme mostrado no exemplo a seguir. Este comando baixa as credenciais e configura a CLI do Kubernetes para usá-las.
az aks get-credentials \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--overwrite-existing \
--admin
A saída bem-sucedida inclui texto semelhante ao exemplo a seguir:
Merged "ejb010718aks-admin" as current context in /Users/edburns/.kube/config
Você pode achar útil criar um alias k
para kubectl
. Para fazer isso, use o seguinte comando:
alias k=kubectl
Para verificar a conexão com seu cluster, use o comando kubectl get
para retornar uma lista dos nós de cluster, conforme mostrado no exemplo a seguir:
kubectl get nodes
A saída de exemplo a seguir mostra o único nó criado nas etapas anteriores. Verifique se o status do nó é Pronto:
NAME STATUS ROLES AGE VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy Ready agent 76s v1.28.9
Crie um novo namespace no AKS
Use o comando a seguir para criar um novo namespace em seu serviço de Kubernetes para seu aplicativo Quarkus:
kubectl create namespace ${AKS_NS}
A saída deve ser semelhante ao exemplo a seguir:
namespace/<your namespace> created
Criar uma conexão de serviço no AKS com o Conector de Serviço
Nesta seção, você criará uma conexão de serviço entre o cluster do AKS e o Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando a ID de carga de trabalho do Microsoft Entra com o Service Connector. Essa conexão permite que o cluster do AKS acesse o Servidor Flexível do Banco de Dados do Azure para PostgreSQL sem usar a autenticação SQL.
Execute os seguintes comandos para criar uma conexão entre o cluster do AKS e o banco de dados PostgreSQL usando a ID de carga de trabalho do Microsoft Entra com o 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
A presença do seguinte JSON na saída do comando final nas etapas anteriores indica uma instalação bem-sucedida do conector de serviço:
"name": "akspostgresconn",
"provisioningState": "Succeeded",
Observação
É recomendável usar a ID de carga de trabalho do Microsoft Entra para acesso seguro ao Servidor Flexível do Banco de Dados do Azure para PostgreSQL sem usar a autenticação de nome de usuário/senha. Se você precisar usar a autenticação de nome de usuário/senha, ignore as etapas anteriores nesta seção e use o nome de usuário e a senha para se conectar ao banco de dados.
Criar a conta de serviço e o segredo pelo Conector de Serviço
Para se autenticar no Servidor Flexível do Banco de Dados do Azure para PostgreSQL, você precisa obter a conta de serviço e o segredo do Kubernetes criado pelo Service Connector. Siga as instruções na seção Atualizar seu contêiner do Tutorial: conectar um aplicativo AKS ao Banco de Dados SQL do Azure. Use a opção Criar diretamente uma implantação usando o trecho de código de exemplo YAML fornecido e use a seguinte etapa:
Nas seções realçadas no YAML de implantação do Kubernetes de exemplo, copie os valores de
serviceAccountName
esecretRef.name
, representados como<service-account-name>
e<secret-name>
no exemplo a seguir:serviceAccountName: <service-account-name> containers: - name: raw-linux envFrom: - secretRef: name: <secret-name>
Esses valores são usados na próxima seção para implantar o aplicativo Quarkus no cluster do AKS.
Personalize a configuração nativa de nuvem
Como uma tecnologia nativa de nuvem, o Quarkus oferece a capacidade de configurar recursos automaticamente para Kubernetes padrão, Red Hat OpenShift e o Knative. Para obter mais informações, consulte o guia do Quarkus Kubernetes, o guia do Quarkus OpenShift e o guia do Quarkus Knative. Os desenvolvedores podem implantar o aplicativo em um cluster de Kubernetes de destino aplicando os manifestos gerados.
Para gerar os recursos apropriados do Kubernetes, use o comando a seguir para adicionar as extensões quarkus-kubernetes
e container-image-jib
em seu terminal local:
quarkus ext add kubernetes container-image-jib
O Quarkus modifica o POM para garantir que essas extensões sejam listadas como <dependencies>
. Se for solicitado a instalar algo chamado JBang
, responda sim e permita que seja instalado.
A saída deve ser semelhante ao exemplo a seguir:
[SUCCESS] ✅ Extension io.quarkus:quarkus-kubernetes has been installed
[SUCCESS] ✅ Extension io.quarkus:quarkus-container-image-jib has been installed
Para verificar se as extensões foram adicionadas, você pode executar git diff
e examinar a saída.
Como uma tecnologia nativa de nuvem, o Quarkus dá suporte a noção de perfis de configuração. O Quarkus tem os seguintes três perfis integrados:
dev
- Ativado quando em modo de desenvolvimentotest
- Ativado ao executar testesprod
- O perfil padrão quando não estiver em execução no modo de desenvolvimento ou teste
O Quarkus dá suporte a qualquer número de perfis nomeados, conforme necessário.
As etapas restantes nesta seção orientam você a personalizar valores no arquivo src/main/resources/application.properties.
O prefixo prod.
indica que essas propriedades estão ativas durante a execução no perfil prod
. Para obter mais informações sobre perfis de configuração, confira a documentação do Quarkus.
Configuração do banco de dados
Examine as variáveis de configuração de banco de dados a seguir. As propriedades relacionadas à conexão de banco de dados %prod.quarkus.datasource.jdbc.url
e %prod.quarkus.datasource.username
leem os valores de leitura das variáveis de ambiente AZURE_POSTGRESQL_HOST
, AZURE_POSTGRESQL_PORT
, AZURE_POSTGRESQL_DATABASE
e AZURE_POSTGRESQL_USERNAME
, respectivamente. Essas variáveis de ambiente são mapeadas para valores secretos que armazenam as informações de conexão do banco de dados. Por motivos de segurança, eles são gerados automaticamente usando a extensão sem senha do Conector de Serviço, conforme mostrado em outro lugar neste artigo.
# 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
Configuração do Kubernetes
Examine as variáveis de configuração do Kubernetes a seguir. service-type
é definido como load-balancer
para acessar o aplicativo externamente. Substitua os valores de <service-account-name>
e <secret-name>
pelos valores dos valores reais copiados na seção anterior.
# 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
As outras configurações do Kubernetes especificam o mapeamento dos valores secretos para as variáveis de ambiente no aplicativo Quarkus. O segredo <secret-name>
contém as informações de conexão do banco de dados. As chaves AZURE_POSTGRESQL_CLIENTID
, AZURE_POSTGRESQL_HOST
, AZURE_POSTGRESQL_PORT
, AZURE_POSTGRESQL_DATABASE
e AZURE_POSTGRESQL_USERNAME
no mapa secreto para as variáveis de ambiente AZURE_CLIENT_ID
, AZURE_POSTGRESQL_HOST
, AZURE_POSTGRESQL_PORT
, AZURE_POSTGRESQL_DATABASE
e AZURE_POSTGRESQL_USERNAME
, respectivamente.
Para examinar os segredos diretamente com kubectl, use comandos semelhantes ao seguinte exemplo:
kubectl -n ${AKS_NS} get secret <secret-name> -o jsonpath="{.data.AZURE_POSTGRESQL_USERNAME}" | base64 --decode
Configuração de imagem de contêiner
Como uma tecnologia nativa de nuvem, o Quarkus dá suporte à geração de imagens de contêiner OCI compatíveis com o Docker. Substitua o valor de <LOGIN_SERVER_VALUE>
pelo valor real da variável de ambiente ${LOGIN_SERVER}
.
# Container Image Build
%prod.quarkus.container-image.build=true
%prod.quarkus.container-image.image=<LOGIN_SERVER_VALUE>/todo-quarkus-aks:1.0
Como uma verificação final, quando você conclui todas as substituições necessárias em application.properties, não deve haver ocorrências do caractere <
. Se houver, verifique se você concluiu todas as substituições necessárias.
Compilar a imagem de contêiner e efetuá-la por push para o registro de contêiner
Agora, use o comando a seguir para criar o próprio aplicativo. Esse comando usa as extensões do Kubernetes e Jib para criar a imagem de contêiner.
quarkus build --no-tests
A saída deve terminar com BUILD SUCCESS
. Os arquivos de manifesto do Kubernetes são gerados em target/kubernetes, conforme mostrado no exemplo a seguir:
tree target/kubernetes
target/kubernetes
├── kubernetes.json
└── kubernetes.yml
0 directories, 2 files
Você pode verificar se a imagem de contêiner é gerada também usando a CLI (linha de comando) docker
. A saída deve ser semelhante ao seguinte exemplo:
docker images | grep todo-quarkus-aks
<LOGIN_SERVER_VALUE>/todo-quarkus-aks 1.0 b13c389896b7 18 minutes ago 422MB
Envie por push as imagens de contêiner para o registro de contêiner usando o seguinte comando:
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
O resultado deverá ser semelhante ao seguinte exemplo:
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
Agora que você efetuou push do aplicativo para o registro de contêiner, você pode dizer ao AKS para executar o aplicativo.
Implante o aplicativo Quarkus no AKS
As etapas nesta seção mostram como executar o aplicativo de exemplo do Quarkus nos recursos do Azure criados.
Use o kubectl apply para implantar o aplicativo Quarkus no AKS
Implante os recursos do Kubernetes usando a linha de comando kubectl
, conforme mostrado no exemplo a seguir:
kubectl apply -f target/kubernetes/kubernetes.yml -n ${AKS_NS}
A saída deve ser semelhante ao exemplo a seguir:
service/quarkus-todo-demo-app-aks created
deployment.apps/quarkus-todo-demo-app-aks created
Verifique se o aplicativo está em execução usando o comando a seguir:
kubectl -n $AKS_NS get pods
Se o valor do campo STATUS
mostrar algo diferente de Running
, localize e resolva o problema antes de continuar. Pode ajudar a examinar os logs de pod usando o seguinte comando:
kubectl -n $AKS_NS logs $(kubectl -n $AKS_NS get pods | grep quarkus-todo-demo-app-aks | cut -d " " -f1)
Obtenha o EXTERNAL-IP
para acessar o aplicativo Todo usando o comando a seguir:
kubectl get svc -n ${AKS_NS}
A saída deve ser semelhante ao exemplo a seguir:
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
Você pode usar o comando a seguir para salvar o valor de uma variável de ambiente EXTERNAL-IP
como um URL totalmente qualificado:
export QUARKUS_URL=http://$(kubectl get svc -n ${AKS_NS} | grep quarkus-todo-demo-app-aks | cut -d " " -f10)
echo $QUARKUS_URL
Abra um novo navegador da Web com o valor de ${QUARKUS_URL}
. Em seguida, adicione um novo item de tarefa com o texto Deployed the Todo app to AKS
. Além disso, selecione o item Introduction to Quarkus Todo App
como completo.
Acesse a API RESTful (/api
) para obter todos os itens de tarefas armazenados no banco de dados PostgreSQL do Azure, conforme mostrado no exemplo a seguir:
curl --verbose ${QUARKUS_URL}/api | jq .
A saída deve ser semelhante ao exemplo a seguir:
* 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
}
]
Verifique se o banco de dados está atualizado
Execute o seguinte comando para verificar se o banco de dados agora está atualizado corretamente:
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;"
Se aparecer a pergunta sobre instalação de uma extensão, responda Y.
A saída deve ser semelhante ao exemplo a seguir e deve incluir os mesmos itens na GUI do aplicativo Todo e a saída do comando curl
anteriormente:
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
}
]
Quando terminar, exclua a regra de firewall que permite que seu endereço IP local acesse a instância do Servidor Flexível do Banco de Dados do Azure para PostgreSQL usando o seguinte comando:
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
Limpar os recursos
Para evitar cobranças do Azure, limpe recursos desnecessários. Quando o cluster não for mais necessário, use o comando az group delete para remover o grupo de recursos, o serviço de contêiner, o registro de contêiner e todos os recursos relacionados.
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
Talvez você também queira usar docker rmi
para excluir as imagens de contêiner postgres
e testcontainers
geradas pelo modo de desenvolvimento do Quarkus.
Próximas etapas
Azure Kubernetes Service