برنامج تعليمي: توزيع تطبيق Dapr إلى Azure Container Apps باستخدام Azure CLI
يساعد Dapr (وقت تشغيل التطبيق الموزع) المطورين على بناء خدمات مصغرة مرنة وموثوقة. في هذا البرنامج التعليمي، يتم توزيع نموذج تطبيق Dapr إلى Azure Container Apps.
ستتعلم كيفية:
- إنشاء بيئة Container Apps لتوزيع تطبيقات الحاوية
- إنشاء مخزن حالة Azure Blob Storage لتطبيق الحاوية
- توزيع تطبيقين ينتجان الرسائل ويستهلكانها ويستمران في تخزين الحالة
- التحقق من التفاعل بين الخدمة المصغرة.
باستخدام Azure Container Apps، يمكنك الحصول على إصدار مدار بالكامل من واجهات برمجة تطبيقات Dapr عند إنشاء خدمات مصغرة. عند استخدام Dapr في تطبيقات حاويات Azure، يمكنك تمكين sidecars من التشغيل بجوار الخدمات الصغيرة التي توفر مجموعة غنية من القدرات. تتضمن واجهات برمجة تطبيقات Dapr المتوفرة مكالمات الخدمة إلى الخدمة و Pub/Sub و Event Bindings و State Stores و Actors.
في هذا البرنامج التعليمي، يمكنك توزيع نفس التطبيقات من التشغيل السريع لـ Dapr مرحبًا بالعالم.
يتكون التطبيق من :
- تطبيق حاوية العميل (Python) لإنشاء الرسائل.
- تطبيق حاوية خدمة (عقدة) لاستهلاك تلك الرسائل واستمرارها في مخزن الحالة
يوضح الرسم التخطيطي للبنية التالية المكونات التي تشكل هذا البرنامج التعليمي:
الإعداد
لتسجيل الدخول إلى Azure من CLI، قم بتشغيل الأمر التالي واتبع المطالبات لإكمال عملية المصادقة.
az login
للتأكد من تشغيل أحدث إصدار من CLI، قم بتشغيل أمر الترقية.
az upgrade
بعد ذلك، قم بتثبيت أو تحديث ملحق Azure Container Apps ل CLI.
إذا تلقيت أخطاء حول المعلمات المفقودة عند تشغيل az containerapp
الأوامر في Azure CLI أو cmdlets من Az.App
الوحدة النمطية في Azure PowerShell، فتأكد من تثبيت أحدث إصدار من ملحق Azure Container Apps.
az extension add --name containerapp --upgrade
إشعار
بدءا من مايو 2024، لم تعد ملحقات Azure CLI تمكن ميزات المعاينة بشكل افتراضي. للوصول إلى ميزات معاينة تطبيقات الحاوية، قم بتثبيت ملحق Container Apps باستخدام --allow-preview true
.
az extension add --name containerapp --upgrade --allow-preview true
الآن بعد تثبيت الملحق أو الوحدة النمطية Microsoft.App
الحالية، قم بتسجيل مساحات الأسماء و Microsoft.OperationalInsights
.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
تعيين متغيرات البيئة
تعيين متغيرات البيئة التالية. استبدل <العناصر النائبة> بالقيم الخاصة بك:
RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"
إنشاء مجموعة موارد Azure
إنشاء مجموعة موارد لتنظيم الخدمات المتعلقة بنشر تطبيق الحاوية.
az group create \
--name $RESOURCE_GROUP \
--location "$LOCATION"
إنشاء بيئة
يمكن لبيئة Azure Container Apps إنشاء حدود آمنة حول مجموعة من تطبيقات الحاويات. يتم توزيع Container Apps المنتشرة في نفس البيئة في نفس الشبكة الظاهرية وكتابة سجلات إلى نفس مساحة عمل Log Analytics.
لإنشاء البيئة، قم بتشغيل الأمر التالي:
az containerapp env create \
--name $CONTAINERAPPS_ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location "$LOCATION"
قم بإعداد حالة التخزين
2. قم بإنشاء حساب تخزين Azure Blob
مع نشر البيئة، فإن الخطوة التالية هي نشر حساب Azure Blob Storage الذي تستخدمه إحدى الخدمات المصغرة لتخزين البيانات. قبل نشر الخدمة، تحتاج إلى اختيار اسم لحساب التخزين. يجب أن تكون أسماء حسابات التخزين فريدة داخل Azure ذات طول من 3 إلى 24 حرفاً ويجب أن تحتوي على أرقام وأحرف صغيرة فقط.
STORAGE_ACCOUNT_NAME="<storage account name>"
استخدم الأمر التالي لإنشاء حساب Azure Storage.
az storage account create \
--name $STORAGE_ACCOUNT_NAME \
--resource-group $RESOURCE_GROUP \
--location "$LOCATION" \
--sku Standard_RAGRS \
--kind StorageV2
تكوين هوية معينة من قبل المستخدم لتطبيق العقدة
بينما تدعم Container Apps كلا من الهوية المدارة المعينة من قبل المستخدم والمخصصة من قبل النظام، توفر الهوية المعينة من قبل المستخدم تطبيق العقدة الذي يدعم Dapr أذونات للوصول إلى حساب تخزين blob.
- قم بإنشاء هوية معينة من قِبل المستخدم .
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json
استرداد خصائص principalId
و id
وتخزينها في المتغيرات.
PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
Storage Blob Data Contributor
تعيين الدور إلى الهوية المعينة من قبل المستخدم
استرداد معرف الاشتراك لاشتراكك الحالي.
SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"
تكوين مكون مخزن الحالة
هناك طرق متعددة للمصادقة على الموارد الخارجية عبر Dapr. لا يستخدم هذا المثال Dapr Secrets API في وقت التشغيل، ولكنه يستخدم مخزن حالة يستند إلى Azure. لذلك، يمكنك التخلي عن إنشاء مكون مخزن سري وتوفير الوصول المباشر بدلا من ذلك من تطبيق العقدة إلى مخزن الكائن الثنائي كبير الحجم باستخدام الهوية المدارة. إذا كنت ترغب في استخدام مخزن حالة غير Azure أو Dapr Secrets API في وقت التشغيل، يمكنك إنشاء مكون مخزن سري. سيقوم هذا المكون بتحميل أسرار وقت التشغيل حتى تتمكن من الرجوع إليها في وقت التشغيل.
افتح محرر نص وأنشئ ملف تكوين باسم statestore.yaml بالخصائص التي قمت بتكوينها من الخطوات السابقة. يساعد هذا الملف في تمكين تطبيق Dapr من الوصول إلى مخزن الحالة. يوضح المثال التالي كيف يجب أن يبدو ملف statestore.yaml عند تكوينه لحساب Azure Blob Storage الخاص بك:
# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
- name: accountName
value: "<STORAGE_ACCOUNT_NAME>"
- name: containerName
value: mycontainer
- name: azureClientId
value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
- nodeapp
لاستخدام هذا الملف، قم بتحديث العناصر النائبة:
- استبدل
<STORAGE_ACCOUNT_NAME>
بقيمة المتغيرSTORAGE_ACCOUNT_NAME
الذي قمت بتعريفه. للحصول على قيمته، قم بتشغيل الأمر التالي:
echo $STORAGE_ACCOUNT_NAME
- استبدل
<MANAGED_IDENTITY_CLIENT_ID>
بقيمة المتغيرCLIENT_ID
الذي قمت بتعريفه. للحصول على قيمته، قم بتشغيل الأمر التالي:
echo $CLIENT_ID
انتقل إلى الدليل الذي قمت بتخزين ملف yaml للمكون فيه وقم بتشغيل الأمر التالي لتكوين مكون Dapr في بيئة Container Apps. لمزيد من المعلومات حول تكوين مكونات Dapr، راجع تكوين مكونات Dapr.
az containerapp env dapr-component set \
--name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
--dapr-component-name statestore \
--yaml statestore.yaml
توزيع تطبيق الخدمة (خادم ويب HTTP)
az containerapp create \
--name nodeapp \
--resource-group $RESOURCE_GROUP \
--user-assigned $IDENTITY_ID \
--environment $CONTAINERAPPS_ENVIRONMENT \
--image dapriosamples/hello-k8s-node:latest \
--min-replicas 1 \
--max-replicas 1 \
--enable-dapr \
--dapr-app-id nodeapp \
--dapr-app-port 3000 \
--env-vars 'APP_PORT=3000'
إذا كنت تستخدم Azure Container Registry، فضمن العلامة --registry-server <REGISTRY_NAME>.azurecr.io
في الأمر .
بشكل افتراضي، يتم سحب الصورة من Docker Hub.
توزيع تطبيق العميل (عميل بدون أجهزة ملحقة)
قم بتشغيل الأمر التالي لتوزيع تطبيق حاوية العميل.
az containerapp create \
--name pythonapp \
--resource-group $RESOURCE_GROUP \
--environment $CONTAINERAPPS_ENVIRONMENT \
--image dapriosamples/hello-k8s-python:latest \
--min-replicas 1 \
--max-replicas 1 \
--enable-dapr \
--dapr-app-id pythonapp
إذا كنت تستخدم Azure Container Registry، فضمن العلامة --registry-server <REGISTRY_NAME>.azurecr.io
في الأمر .
تحقق من النتائج
تأكيد استمرار الحالة الناجحة
يمكنك التأكد من أن الخدمات تعمل بشكل صحيح عن طريق عرض البيانات في حساب تخزين Azure الخاص بك.
افتح مدخل Microsoft Azure في المستعرض وانتقل إلى حساب التخزين الخاص بك.
حدد قائمة الحاويات على الجانب الأيسر.
حدد الحاويات.
تحقق من أنه يمكنك مشاهدة الملف المسمى
order
في الحاوية.حدد الملف.
قم بتحديد علامة التبويب تحرير .
حدد الزر تحديث لمراقبة كيفية تحديث البيانات تلقائيا.
عرض السجلات
يتم تخزين السجلات من تطبيقات الحاوية ContainerAppConsoleLogs_CL
في الجدول المخصص في مساحة عمل Log Analytics. يمكنك عرض السجلات من خلال مدخل Microsoft Azure أو عبر CLI. قد يكون هناك تأخير صغير في البداية حتى يظهر الجدول في مساحة العمل.
استخدم أمر CLI التالي لعرض السجلات باستخدام سطر الأوامر.
LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`
az monitor log-analytics query \
--workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
--analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
--out table
يوضح الإخراج التالي نوع الاستجابة المتوقعة من الأمر CLI.
ContainerAppName_s Log_s TableName TimeGenerated
-------------------- ------------------------------- ------------- ------------------------
nodeapp Got a new order! Order ID: 61 PrimaryResult 2021-10-22T21:31:46.184Z
nodeapp Successfully persisted state. PrimaryResult 2021-10-22T21:31:46.184Z
nodeapp Got a new order! Order ID: 62 PrimaryResult 2021-10-22T22:01:57.174Z
nodeapp Successfully persisted state. PrimaryResult 2021-10-22T22:01:57.174Z
nodeapp Got a new order! Order ID: 63 PrimaryResult 2021-10-22T22:45:44.618Z
تنظيف الموارد
تهانينا! لقد أكملت هذا البرنامج التعليمي. إذا كنت ترغب في حذف الموارد التي تم إنشاؤها كجزء من هذه المعاينة، فقم بتشغيل الأمر التالي.
تنبيه
يحذف هذا الأمر مجموعة الموارد المحددة وجميع الموارد المضمنة فيها. إذا كانت هناك موارد خارج نطاق هذا البرنامج التعليمي موجودة في مجموعة الموارد المحددة، فسيتم حذفها أيضاً.
az group delete --resource-group $RESOURCE_GROUP
إشعار
نظرا لأن pythonapp
إجراء المكالمات باستمرار nodeapp
مع الرسائل التي تستمر في مخزن الحالة الذي تم تكوينه، فمن المهم إكمال خطوات التنظيف هذه لتجنب العمليات الجارية القابلة للفوترة.
تلميح
هل تواجه مشكلات؟ اسمحوا لنا أن نعرف على GitHub عن طريق فتح مشكلة في Azure Container Apps repo.