在 Azure Kubernetes Service 叢集上使用 Quarkus 部署 Java 應用程式
本文說明如何使用簡單的 CRUD 應用程式,快速在 Azure Kubernetes Service (AKS) 上部署 Red Hat Quarkus。 該應用程式是具有 JavaScript 前端和 REST 端點的「待辦事項清單」。 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器提供應用程式的持續性層。 本文說明如何在本地測試應用程式,並將其部署至 AKS。
必要條件
- 如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶。
- 使用已安裝類似 Unix 的作業系統 (例如 Ubuntu、macOS 或 Windows 子系統 Linux 版) 準備本機電腦。
- 安裝 Java SE 實作第 17 版或更新版本 - 例如,Microsoft OpenJDK 的組建。
- 安裝 Maven 3.9.8 版或更高版本。
- 安裝適用於作業系統的 Docker
- 安裝 jq。
- 安裝 cURL。
- 安裝 Quarkus CLI 3.12.1 版或更新版本。
- 適用於 Unix 的 Azure CLI 環境。 本文只需要 Azure CLI 的 Bash 變體。
- 本文需要使用至少 Azure CLI 2.61.0 版。
建立應用程式專案
使用下列命令複製本文的範例 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
您可以使用 mvn quarkus:dev
(而不是 quarkus dev
) 完成與 Maven 相同的動作。
系統可能會詢問您是否要傳送 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>
在 Quarkus 開發模式執行所在的終端上按下 w。 w 鍵會開啟預設網頁瀏覽器以顯示 Todo
應用程式。 您也可以直接在 http://localhost:8080
存取應用程式 GUI。
請嘗試在待辦事項清單中選取一些待辦事項項目。 UI 會指出具有刪除線文字樣式的選取範圍。 您也可以輸入 Verify Todo 應用程式 並按 Enter,將新的待辦事項專案新增至待辦事項清單,如下列螢幕快照所示:
存取 RESTful API (/api
) 以取得儲存在本地 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 範例應用程式:
- 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器
- Azure Container Registry
- Azure Kubernetes Service (AKS)
注意
本文會停用 PostgreSQL 驗證,以說明安全性最佳做法。 Microsoft Entra 識別碼可用來驗證伺服器的連線。 如果您需要啟用 PostgreSQL 驗證,請參閱快速入門:使用 Java 和 JDBC 搭配 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器,然後選取 [密碼] 索引卷標。
其中有些資源在 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
建立適用於 PostgreSQL 的 Azure 資料庫彈性伺服器
適用於 PostgreSQL 的 Azure 資料庫彈性伺服器是完全受控的資料庫服務,其設計目的是要在資料庫管理功能和設定方面提供更細微的控制和彈性。 這一節顯示如何使用 Azure CLI 建立適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體。
首先,使用下列命令建立資源群組,以包含資料庫伺服器和其他資源:
az group create \
--name $RESOURCE_GROUP_NAME \
--location $LOCATION
接下來,使用下列命令建立適用於 PostgreSQL 的 Azure 資料庫彈性伺服器執行個體:
az postgres flexible-server create \
--name $DB_SERVER_NAME \
--database-name $DB_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--location $LOCATION \
--public-access 0.0.0.0 \
--sku-name Standard_B1ms \
--tier Burstable \
--active-directory-auth Enabled \
--yes
建立伺服器、資料庫、系統管理員使用者和防火牆規則需要幾分鐘的時間。 如果該命令成功,輸出會類似下列範例:
{
"connectionString": "postgresql://REDACTED@ejb011212qdb.postgres.database.azure.com/demodb?sslmode=require",
"databaseName": "demodb",
"firewallName": "AllowAllAzureServicesAndResourcesWithinAzureIps_2024-12-12_14-30-22",
"host": "ejb011212qdb.postgres.database.azure.com",
"id": "/subscriptions/c7844e91-b11d-4a7f-ac6f-996308fbcdb9/resourceGroups/ejb011211sfi/providers/Microsoft.DBforPostgreSQL/flexibleServers/ejb011212qdb",
"location": "East US 2",
"password": "REDACTED",
"resourceGroup": "ejb011211sfi",
"skuname": "Standard_B1ms",
"username": "sorrycamel2",
"version": "16"
}
使用 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器在本機測試應用程式
在上一節中,您已在開發模式中測試 Quarkus 應用程式,並將 PostgreSQL 資料庫布建為 Docker 容器。 現在,在本機測試 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例的連線。
首先,使用下列命令,將目前登入的使用者新增為 Microsoft Entra Admin 至 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例:
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 位址新增至 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例防火牆規則:
取得您本機執行 Quarkus 應用程式的機器本機 IP 位址。 例如,請造訪 https://whatismyipaddress.com 以取得您的公用IP v4位址。
使用您在上一個步驟中取得的本機 IP 位址來定義環境變數。
export AZ_LOCAL_IP_ADDRESS=<your local IP address>
執行下列命令,將本機IP位址新增至 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器實例防火牆規則:
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
然後,在上一個終端機中設定下列環境變數。 這些環境變數可用來從本機執行的 Quarkus 應用程式連線到 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例:
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 叢集時,這些值會在運行時間使用 Service Connector 無密碼擴充功能自動插入應用程式。
現在,在本機執行 Quarkus 應用程式,以測試 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例的連線。 使用下列命令以生產模式啟動應用程式:
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
的錯誤訊息啟動,很可能是因為本機計算機的網路設定。 再次嘗試從 Azure 入口網站 選取 [新增目前的用戶端 IP 位址]。 如需詳細資訊,請參閱使用 Azure 入口網站 建立和管理 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器的防火牆規則一節。 然後,再次執行應用程式。
開啟新的網頁瀏覽器以 http://localhost:8080
存取 Todo 應用程式。 您應該會看到 Todo 應用程式,看起來與您在本機開發模式中執行應用程式時所看到的類似。
建立 Azure Container Registry 執行個體
由於 Quarkus 是雲端原生技術,因此對於建立在 Kube 中執行的容器提供內建支援。 Kube 完全相依於容器登錄,這會從中尋找要執行的容器映像。 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>",
使用下列命令取得 Container Registry 實例的登入伺服器:
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
的詳細資訊,請參閱 Kube 文件中的命令行工具 (kubectl)。
若要設定 kubectl
以連線到 Kubernetes 叢集,請使用 az aks get-credentials 命令,如下列範例所示。 此命令會下載憑證並設定 Kubernetes CLI 以供使用。
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 中建立新的命名空間
使用下列命令,在 Quarkus 應用程式的 Kube 服務中建立新的命名空間:
kubectl create namespace ${AKS_NS}
輸出看起來會如下列範例所示:
namespace/<your namespace> created
使用服務連接器在 AKS 中建立服務連線
在本節中,您會使用 service Connector Microsoft Entra 工作負載 ID,在 AKS 叢集與 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器之間建立服務連線。 此連線可讓 AKS 叢集存取 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器,而不需使用 SQL 驗證。
執行下列命令,以使用 service Connector Microsoft Entra 工作負載 ID 建立 AKS 叢集與 PostgreSQL 資料庫之間的連線:
# 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 工作負載 ID 來保護 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器的存取,而不需使用使用者名稱/密碼驗證。 如果您需要使用使用者名稱/密碼驗證,請忽略本節中的先前步驟,並使用使用者名稱和密碼聯機到資料庫。
取得服務連接器所建立的服務帳戶和秘密
若要向 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器進行驗證,您需要取得 Service Connector 所建立的服務帳戶和 Kubernetes 秘密。 請遵循教學課程:將 AKS 應用程式連線至 Azure SQL 資料庫 中更新容器一節中的指示。 使用提供的 YAML 範例代碼段直接建立部署選項,並使用下列步驟:
從範例 Kubernetes 部署 YAML 中的醒目提示區段,複製 和 的值
serviceAccountName
,如下列範例中的 和secretRef.name
<secret-name>
表示<service-account-name>
:serviceAccountName: <service-account-name> containers: - name: raw-linux envFrom: - secretRef: name: <secret-name>
下一節會使用這些值,將Quarkus應用程式部署至AKS叢集。
自訂雲端原生設定
Quarkus 是雲端原生技術,可讓您自動設定標準 Kube、Red Hat OpenShift 和 Knative 的資源。 如需詳細資訊,請參閱 Quarkus Kubernetes 指南、Quarkus OpenShift 指南和 Quarkus Knative 指南。 開發人員可以套用產生的資訊清單,將應用程式部署至目標 Kube 叢集。
若要產生適當的 Kube 資源,請使用下列命令在本地終端中新增 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
讀取值。 這些環境變數會對應至儲存資料庫連接資訊的秘密值。 基於安全性考慮,它們會使用Service Connector 無密碼擴充功能自動產生,如本文其他地方所示。
# 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
以在外部存取應用程式。 將和 <secret-name>
的值<service-account-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 是雲端原生技術,支持產生與 Docker 相容的 OCI 容器映射。 將的值 <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 中的所有必要替代時,字元不得出現<
。 如果有的話,請仔細檢查您已完成所有必要的替代專案。
建置容器映像並將它推送至容器登錄
現在,使用下列命令建置應用程式本身。 此命令會使用 Kube 和 Jib 延伸模組來建置容器映像。
quarkus build --no-tests
輸出應該以 BUILD SUCCESS
結尾。 Kube 資訊清單檔案會在 target/kubernetes 中產生,如下列範例所示:
tree target/kubernetes
target/kubernetes
├── kubernetes.json
└── kubernetes.yml
0 directories, 2 files
您可以確認容器映像是否也使用 docker
命令列 (CLI) 產生。 輸出會看似像以下範例:
docker images | grep todo-quarkus-aks
<LOGIN_SERVER_VALUE>/todo-quarkus-aks 1.0 b13c389896b7 18 minutes ago 422MB
使用下列命令將容器映像推送至容器登入:
export TODO_QUARKUS_TAG=$(docker images | grep todo-quarkus-aks | head -n1 | cut -d " " -f1)
echo ${TODO_QUARKUS_TAG}
docker push ${TODO_QUARKUS_TAG}:1.0
輸出應類似下列範例:
The push refers to repository [<LOGIN_SERVER_VALUE>/todo-quarkus-aks]
dfd615499b3a: Pushed
56f5cf1aa271: Pushed
4218d39b228e: Pushed
b0538737ed64: Pushed
d13845d85ee5: Pushed
60609ec85f86: Pushed
1.0: digest: sha256:0ffd70d6d5bb3a4621c030df0d22cf1aa13990ca1880664d08967bd5bab1f2b6 size: 1995
既然您已將應用程式推送至容器登錄,您可以告訴 AKS 執行應用程式。
將 Quarkus 應用程式部署至 AKS
本節中的步驟說明如何在您所建立的 Azure 資源上執行 Quarkus 範例應用程式。
使用 kubectl apply 將 Quarkus 應用程式部署至 AKS
在命令行上使用 kubectl
部署 Kube 資源,如下列範例所示:
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
以存取待辦事項應用程式:
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}
的值。 然後,使用文字 Deployed the Todo app to AKS
新增待辦事項項目。 此外,請選取 Introduction to Quarkus Todo App
項目以便完成。
存取 RESTful API (/api
) 以取得儲存在 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。
輸出看起來應該類似下列範例,而且應該在先前的 curl
Todo 應用程式 GUI 和命令輸出中包含相同的專案:
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 位址存取 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器實例的防火牆規則:
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 開發模式產生。