مشاركة عبر


نشر تطبيق Java باستخدام Quarkus على نظام مجموعة Azure Kubernetes Service

توضح هذه المقالة كيفية نشر Red Hat Quarkus بسرعة على خدمة Azure Kubernetes (AKS) باستخدام تطبيق CRUD بسيط. التطبيق هو "قائمة المهام" مع واجهة JavaScript الأمامية ونقطة نهاية REST. توفر قاعدة بيانات Azure لخادم PostgreSQL المرن طبقة الثبات للتطبيق. توضح لك المقالة كيفية اختبار تطبيقك محليا ونشره في AKS.

المتطلبات الأساسية

  • إذا لم يكن لديك حساب Azure، فأنشئ حساباً مجانياً قبل أن تبدأ.
  • قم بإعداد جهاز محلي مع تثبيت نظام تشغيل يشبه Unix - على سبيل المثال، Ubuntu أو macOS أو نظام Windows الفرعي لـ Linux.
  • تثبيت إصدار تنفيذ Java SE 17 أو أحدث - على سبيل المثال، إصدار Microsoft من OpenJDK.
  • تثبيت Maven، الإصدار 3.9.8 أو أعلى.
  • قم بتثبيت Docker لنظام التشغيل الخاص بك.
  • تثبيت jq.
  • تثبيت cURL.
  • قم بتثبيت Quarkus CLI، الإصدار 3.12.1 أو أعلى.
  • Azure CLI للبيئات التي تشبه Unix. تتطلب هذه المقالة متغير Bash فقط من Azure CLI.
    • يجب على المطور تثبيت 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 جديد إلى قائمة المهام بكتابة Verify Todo apps والضغط على Enter، كما هو موضح في لقطة الشاشة التالية:

لقطة شاشة لتطبيق عينة Todo مع إضافة عناصر جديدة.

الوصول إلى واجهة برمجة تطبيقات RESTful (/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:

  • الخادم المرن من Azure Database for PostgreSQL
  • Azure Container Registry
  • خدمة Azure Kubernetes ‏(AKS)

إشعار

تعطل هذه المقالة مصادقة PostgreSQL لتوضيح أفضل ممارسات الأمان. يتم استخدام معرف Microsoft Entra لمصادقة الاتصال بالخادم. إذا كنت بحاجة إلى تمكين مصادقة PostgreSQL، فشاهد التشغيل السريع: استخدام Java وJDBC مع قاعدة بيانات Azure ل PostgreSQL - الخادم المرن وحدد علامة التبويب كلمة المرور .

يجب أن يكون لبعض هذه الموارد أسماء فريدة ضمن نطاق اشتراك Azure. لضمان هذا التفرد، يمكنك استخدام الأحرف الأولى، التسلسل، التاريخ، نمط اللاحقة . لتطبيق هذا النمط، قم بتسمية الموارد الخاصة بك عن طريق سرد الأحرف الأولى من اسمك، وبعض أرقام التسلسل، وتاريخ اليوم، ونوع من اللاحقة الخاصة بالموارد - على سبيل المثال، rg ل "مجموعة الموارد". تستخدم متغيرات البيئة التالية هذا النمط. استبدل قيم UNIQUE_VALUE العنصر النائب و LOCATION بالقيم الخاصة بك ثم قم بتشغيل الأوامر التالية في المحطة الطرفية الخاصة بك:

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

إنشاء قاعدة بيانات Azure لخادم PostgreSQL المرن

قاعدة بيانات Azure لـ PostgreSQL - الخادم المرن عبارة عن خدمة قاعدة بيانات مُدارة بالكامل ومصممة لتوفير المزيد من التحكم الدقيق والمرونة في وظائف إدارة قاعدة البيانات وإعدادات التكوين. يوضح لك هذا القسم كيفية إنشاء قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن باستخدام Azure CLI.

أولا، قم بإنشاء مجموعة موارد لاحتواء خادم قاعدة البيانات والموارد الأخرى باستخدام الأمر التالي:

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

بعد ذلك، قم بإنشاء مثيل خادم مرن لقاعدة بيانات Azure ل PostgreSQL باستخدام الأمر التالي:

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

يستغرق إنشاء الخادم وقاعدة البيانات والمستخدم المسؤول وقواعد جدار الحماية بضع دقائق. إذا نجح الأمر، يبدو الإخراج مشابها للمثال التالي:

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

اختبار التطبيق محليا باستخدام قاعدة بيانات Azure لخادم PostgreSQL المرن

في القسم السابق، قمت باختبار تطبيق Quarkus محليا في وضع التطوير مع قاعدة بيانات PostgreSQL المقدمة كحاوية Docker. الآن، اختبر الاتصال بقاعدة بيانات Azure لمثيل خادم PostgreSQL المرن محليا.

أولا، أضف المستخدم الحالي الذي سجل الدخول كمسؤول Microsoft Entra إلى قاعدة بيانات Azure لمثيل خادم PostgreSQL المرن باستخدام الأوامر التالية:

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

الإخراج الناجح هو كائن JSON بما في ذلك الخاصية "type": "Microsoft.DBforPostgreSQL/flexibleServers/administrators".

بعد ذلك، أضف عنوان IP المحلي إلى قواعد جدار حماية مثيل Azure Database for PostgreSQL Flexible Server باتباع الخطوات التالية:

  1. احصل على عنوان IP المحلي لجهازك حيث تقوم بتشغيل تطبيق Quarkus محليا. على سبيل المثال، تفضل بزيارة https://whatismyipaddress.com للحصول على عنوان IP v4 العام.

  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 Database for PostgreSQL Flexible Server من تطبيق 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 المقدم في القسم السابق. يتم إدخال هذه القيم تلقائيا في التطبيق في وقت التشغيل باستخدام ملحق Service Connector بدون كلمة مرور عند نشر تطبيق 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 للعميل الحالي من مدخل Microsoft Azure مرة أخرى. لمزيد من المعلومات، راجع القسم إنشاء قاعدة جدار حماية بعد إنشاء الخادم في إنشاء قواعد جدار الحماية وإدارتها لقاعدة بيانات Azure ل PostgreSQL - الخادم المرن باستخدام مدخل Microsoft Azure. ثم قم بتشغيل التطبيق مرة أخرى.

افتح مستعرض ويب جديد للوصول http://localhost:8080 إلى تطبيق Todo. يجب أن تشاهد تطبيق Todo، يبدو مشابها لما رأيته عند تشغيل التطبيق محليا في وضع التطوير.

إنشاء مثيل Azure Container Registry

نظرا لأن 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>",

احصل على خادم تسجيل الدخول لمثيل 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، راجع أداة سطر الأوامر (kubectl) في وثائق Kubernetes.

للتكوين 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

يوضح إخراج المثال التالي العقدة المفردة التي تم إنشاؤها في الخطوات السابقة. تأكد من أن حالة العقدة جاهزة:

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 باستخدام Service Connector

في هذا القسم، يمكنك إنشاء اتصال خدمة بين نظام مجموعة AKS وقاعدة بيانات Azure لخادم PostgreSQL المرن باستخدام هوية حمل عمل Microsoft Entra مع موصل الخدمة. يسمح هذا الاتصال لمجموعة AKS بالوصول إلى قاعدة بيانات Azure لخادم PostgreSQL المرن دون استخدام مصادقة SQL.

قم بتشغيل الأوامر التالية لإنشاء اتصال بين نظام مجموعة AKS وقاعدة بيانات PostgreSQL باستخدام هوية حمل عمل Microsoft Entra مع موصل الخدمة:

# Register the Service Connector and Kubernetes Configuration resource providers
az provider register --namespace Microsoft.ServiceLinker --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait

# Install the Service Connector passwordless extension
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true

# Retrieve the AKS cluster and Azure SQL Server resource IDs
export AKS_CLUSTER_RESOURCE_ID=$(az aks show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --query id \
    --output tsv)
export AZURE_POSTGRESQL_RESOURCE_ID=$(az postgres flexible-server show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DB_SERVER_NAME \
    --query id \
    --output tsv)

# Create a user-assigned managed identity used for workload identity
export USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami
az identity create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME}

# Retrieve the user-assigned managed identity resource ID
export UAMI_RESOURCE_ID=$(az identity show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME} \
    --query id \
    --output tsv)

# Create a service connection between your AKS cluster and your PostgreSQL database using Microsoft Entra Workload ID
az aks connection create postgres-flexible \
    --connection akspostgresconn \
    --kube-namespace $AKS_NS \
    --source-id $AKS_CLUSTER_RESOURCE_ID \
    --target-id $AZURE_POSTGRESQL_RESOURCE_ID/databases/$DB_NAME \
    --workload-identity $UAMI_RESOURCE_ID

يشير وجود JSON التالي في الإخراج من الأمر النهائي في الخطوات السابقة إلى تثبيت ناجح لموصل الخدمة:

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

إشعار

نوصي باستخدام هوية حمل عمل Microsoft Entra للوصول الآمن إلى قاعدة بيانات Azure لخادم PostgreSQL المرن دون استخدام مصادقة اسم المستخدم/كلمة المرور. إذا كنت بحاجة إلى استخدام مصادقة اسم المستخدم/كلمة المرور، فتجاهل الخطوات السابقة في هذا القسم واستخدم اسم المستخدم وكلمة المرور للاتصال بقاعدة البيانات.

الحصول على حساب الخدمة والبيانات السرية التي تم إنشاؤها بواسطة Service Connector

للمصادقة على قاعدة بيانات Azure لخادم PostgreSQL المرن، تحتاج إلى الحصول على حساب الخدمة وسر Kubernetes الذي تم إنشاؤه بواسطة Service Connector. اتبع الإرشادات الواردة في قسم تحديث الحاوية من البرنامج التعليمي: توصيل تطبيق AKS بقاعدة بيانات Azure SQL. خذ الخيار إنشاء نشر مباشرة باستخدام نموذج مقتطف التعليمات البرمجية YAML المتوفر واستخدام الخطوة التالية:

  • من الأقسام المميزة في نموذج توزيع Kubernetes YAML، انسخ قيم serviceAccountName و secretRef.name، ممثلة ك <service-account-name> وفي <secret-name> المثال التالي:

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

    يتم استخدام هذه القيم في القسم التالي لنشر تطبيق Quarkus إلى نظام مجموعة AKS.

تخصيص التكوين الأصلي للسحابة

باعتبارها تقنية سحابية أصلية، توفر Quarkus القدرة على تكوين الموارد تلقائيا ل Kubernetes القياسية وRed Hat OpenShift وKnative. لمزيد من المعلومات، راجع دليل Quarkus Kubernetes ودليل Quarkus OpenShift ودليل Quarkus Knative. يمكن للمطورين نشر التطبيق إلى مجموعة Kubernetes الهدف عن طريق تطبيق البيانات التي تم إنشاؤها.

لإنشاء موارد Kubernetes المناسبة، استخدم الأمر التالي لإضافة الملحقات quarkus-kubernetes و container-image-jib في المحطة الطرفية المحلية:

quarkus ext add kubernetes container-image-jib

يقوم Quarkus بتعديل POM لضمان إدراج هذه الملحقات ك <dependencies>. إذا طلب منك تثبيت شيء يسمى JBang، فأجب بنعم واسمح بتثبيته.

يجب أن يبدو الإخراج مثل المثال التالي:

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

للتحقق من إضافة الملحقات، يمكنك تشغيل git diff وفحص الإخراج.

باعتبارها تقنية سحابية أصلية، يدعم Quarkus فكرة ملفات تعريف التكوين. يحتوي Quarkus على ملفات التعريف الثلاثة المضمنة التالية:

  • dev - يتم تنشيطه عندما يكون في وضع التطوير
  • test - تم تنشيطه عند تشغيل الاختبارات
  • prod - ملف التعريف الافتراضي عند عدم التشغيل في وضع التطوير أو الاختبار

يدعم Quarkus أي عدد من ملفات التعريف المسماة، حسب الحاجة.

توجهك الخطوات المتبقية في هذا القسم إلى تخصيص القيم في ملف src/main/resources/application.properties .

تشير البادئة prod. إلى أن هذه الخصائص نشطة عند التشغيل في prod ملف التعريف. لمزيد من المعلومات حول ملفات تعريف التكوين، راجع وثائق Quarkus.

تكوين قاعدة البيانات

فحص متغيرات تكوين قاعدة البيانات التالية. خصائص %prod.quarkus.datasource.jdbc.url اتصال قاعدة البيانات ذات الصلة وقراءة %prod.quarkus.datasource.username القيم من متغيرات AZURE_POSTGRESQL_HOSTالبيئة و AZURE_POSTGRESQL_PORTAZURE_POSTGRESQL_DATABASEو و على AZURE_POSTGRESQL_USERNAMEالتوالي. تعين متغيرات البيئة هذه إلى قيم سرية تخزن معلومات اتصال قاعدة البيانات. لأسباب أمنية، يتم إنشاؤها تلقائيا باستخدام ملحق 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 للوصول إلى التطبيق خارجيا. استبدل قيم <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_HOSTAZURE_POSTGRESQL_PORTAZURE_POSTGRESQL_DATABASEو و AZURE_POSTGRESQL_USERNAME في الخريطة السرية إلى AZURE_CLIENT_IDAZURE_POSTGRESQL_HOSTAZURE_POSTGRESQL_PORTAZURE_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

يمكنك التحقق مما إذا كان يتم إنشاء صورة الحاوية أيضا باستخدام docker سطر الأوامر (CLI). يبدو الإخراج مشابهاً للمثال التالي:

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

ادفع صور الحاوية إلى سجل الحاوية باستخدام الأمر التالي:

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

يجب أن يبدو المخرج مشابهًا للمثال التالي:

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

الآن بعد أن دفعت التطبيق إلى سجل الحاوية، يمكنك إخبار AKS بتشغيل التطبيق.

نشر تطبيق Quarkus إلى AKS

توضح لك الخطوات الواردة في هذا القسم كيفية تشغيل نموذج تطبيق Quarkus على موارد Azure التي قمت بإنشائها.

استخدام kubectl 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، فاستكشف المشكلة وحلها قبل المتابعة. قد يساعد على فحص سجلات الجراب باستخدام الأمر التالي:

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.

الوصول إلى واجهة برمجة تطبيقات RESTful (/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.

يجب أن يبدو الإخراج مشابها للمثال التالي، ويجب أن يتضمن نفس العناصر في واجهة المستخدم الرسومية لتطبيق 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 Database for PostgreSQL Flexible Server باستخدام الأمر التالي:

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.

الخطوات التالية