البرنامج التعليمي: نشر تطبيق ويب ASP.NET باستخدام Azure Cosmos DB ل NoSQL والهوية المدارة وAKS عبر Bicep
ينطبق على: NoSQL
في هذا البرنامج التعليمي، يمكنك نشر مرجع ASP.NET تطبيق ويب على مجموعة Azure Kubernetes Service (AKS) التي تتصل ب Azure Cosmos DB ل NoSQL.
Azure Cosmos DB هو نظام أساسي قاعدة بيانات موزعة مدارة بالكامل لتطوير التطبيقات الحديثة مع NoSQL أو قواعد البيانات الارتباطية.
AKS هي خدمة Kubernetes مدارة تساعدك على نشر المجموعات وإدارتها بسرعة.
هام
- تتطلب هذه المقالة أحدث إصدار من Azure CLI. لمزيد من المعلومات، اطلع على تثبيت Azure CLI. إذا كنت تستخدم Azure Cloud Shell، فإن أحدث إصدار مثبت بالفعل.
- تتطلب هذه المقالة أيضا أحدث إصدار من Bicep CLI داخل Azure CLI. لمزيد من المعلومات، راجع تثبيت أدوات Bicep.
- إذا كنت تقوم بتشغيل الأوامر في هذا البرنامج التعليمي محليا بدلا من Azure Cloud Shell، فتأكد من استخدام حساب مسؤول.
المتطلبات الأساسية
الأدوات التالية مطلوبة لتجميع تطبيق الويب ASP.NET وإنشاء صورة الحاوية الخاصة به:
- Docker Desktop
- Visual Studio Code
- ملحق #C لـ Visual Studio Code
- ملحق #C لـ Visual Studio Code
- ملحق حساب Azure ل Visual Studio Code
نظرة عامة
يستخدم هذا البرنامج التعليمي بنية أساسية كنهج تعليمة برمجية (IaC) لنشر الموارد إلى Azure. يمكنك استخدام Bicep، وهي لغة تعريفية جديدة توفر نفس الإمكانات مثل قوالب Azure Resource Manager. ومع ذلك، يتضمن Bicep بناء جملة أكثر إيجازا وأسهل في الاستخدام.
تنشر وحدات Bicep موارد Azure التالية ضمن نطاق الاشتراك المستهدف:
- مجموعة موارد لتنظيم الموارد
- هوية مدارة للمصادقة
- سجل حاوية لتخزين صور الحاوية
- نظام مجموعة AKS
- شبكة ظاهرية لتكوين AKS
- حساب Azure Cosmos DB ل NoSQL، جنبا إلى جنب مع قاعدة بيانات وحاوية ودور SQL
- مخزن مفاتيح لتخزين المفاتيح الآمنة
- (اختياري) مساحة عمل Log Analytics
يستخدم هذا البرنامج التعليمي أفضل الممارسات التالية لأمان Azure Cosmos DB:
- تنفيذ التحكم في الوصول باستخدام التحكم في الوصول استنادا إلى الدور (RBAC) والهوية المدارة. تلغي هذه الميزات حاجة المطورين إلى إدارة البيانات السرية وبيانات الاعتماد والشهادات والمفاتيح للاتصال الآمن بين الخدمات.
- تقييد وصول Azure Cosmos DB إلى الشبكة الفرعية AKS عن طريق تكوين نقطة نهاية خدمة شبكة ظاهرية.
- تعيين
disableLocalAuth = true
فيdatabaseAccount
المورد لفرض التحكم في الوصول استنادا إلى الدور كطريقة المصادقة الوحيدة.
تلميح
تستخدم الخطوات الواردة في هذا البرنامج التعليمي Azure Cosmos DB ل NoSQL. ومع ذلك، يمكنك تطبيق نفس المفاهيم على Azure Cosmos DB ل MongoDB.
تنزيل وحدات Bicep النمطية
قم بتنزيل أو استنساخ وحدات Bicep النمطية من مجلد Bicep لمستودع GitHub azure-samples/cosmos-aks-samples :
git clone https://github.com/Azure-Samples/cosmos-aks-samples.git
cd Bicep/
تسجيل الدخول إلى اشتراك Azure
استخدم az sign in للاتصال باشتراك Azure الافتراضي:
az login
اختياريا، استخدم az account set مع اسم أو معرف اشتراك معين لتعيين الاشتراك النشط إذا كان لديك اشتراكات متعددة:
az account set \
--subscription <subscription-id>
تهيئة معلمات التوزيع
إنشاء ملف param.json باستخدام JSON في المثال التالي. {resource group name}
{Azure Cosmos DB account name}
استبدل العناصر النائبة و و {Azure Container Registry instance name}
بقيمك الخاصة.
هام
يجب أن تتوافق جميع أسماء الموارد التي تستخدمها في التعليمات البرمجية التالية مع قواعد وقيود التسمية لموارد Azure. تأكد أيضا من استبدال قيم العنصر النائب باستمرار ومطابقة القيم في param.json.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"rgName": {
"value": "{resource group name}"
},
"cosmosName" :{
"value": "{Azure Cosmos DB account name}"
},
"acrName" :{
"value": "{Azure Container Registry instance name}"
}
}
}
إنشاء توزيع Bicep
تعيين متغيرات shell باستخدام الأوامر التالية. استبدل العناصر النائبة {deployment name}
و {location}
بقيمك الخاصة.
deploymentName='{deployment name}' # Name of the deployment
location='{location}' # Location for deploying the resources
ضمن مجلد Bicep، استخدم az deployment sub create لنشر القالب إلى نطاق الاشتراك الحالي:
az deployment sub create \
--name $deploymentName \
--location $location \
--template-file main.bicep \
--parameters @param.json
أثناء النشر، تقوم وحدة التحكم لإخراج رسالة تشير إلى أن النشر لا يزال قيد التشغيل:
/ Running ..
قد يستغرق النشر من 20 إلى 30 دقيقة. بعد اكتمال التوفير، ستقوم وحدة التحكم بإخراج JSON مع Succeeded
كحالة التوفير:
}
],
"provisioningState": "Succeeded",
"templateHash": "0000000000000000",
"templateLink": null,
"timestamp": "2022-01-01T00:00:00.000000+00:00",
"validatedResources": null
},
"tags": null,
"type": "Microsoft.Resources/deployments"
}
يمكنك أيضا رؤية حالة النشر في مجموعة الموارد:
إشعار
عندما تنشئ نظام مجموعة AKS، سيتم إنشاء مجموعة موارد ثانية تلقائياً لتخزين موارد AKS. لمزيد من المعلومات، راجع لماذا يتم إنشاء مجموعتين من الموارد باستخدام AKS؟.
ربط Azure Container Registry مع AKS
استخدم الأوامر التالية لربط مثيل Azure Container Registry ب AKS. استبدل العناصر النائبة {Azure Container Registry instance name}
و {resource group name}
بقيمك الخاصة.
acrName='{Azure Container Registry instance name}'
rgName='{resource group name}'
aksName=$rgName'aks'
قم بتشغيل az aks update
لإرفاق مورد Azure Container Registry الحالي بمجموعة AKS:
az aks update \
--resource-group $rgName \
--name $aksName \
--attach-acr $acrName
الاتصال بنظام مجموعة AKS
لإدارة نظام مجموعة Kubernetes، استخدم سطر أوامر العميل Kubernetes، kubectl. kubectl
والذي سيكون مثبتًا بالفعل في حال كنت تستخدم Azure Cloud Shell. لتثبيت kubectl
محليا، استخدم az aks install-cli
:
az aks install-cli
لتكوين kubectl
الاتصال بمجموعة Kubernetes الخاصة بك، استخدم az aks get-credentials
. هذا الأمر يقوم بتحميل بيانات الاعتماد وضبط Kubernetes CLI لاستخدامها.
az aks get-credentials \
--resource-group $rgName \
--name $aksName
توصيل جرابات AKS ب Azure Key Vault
تستخدم الهويات المدارة بواسطة Microsoft Entra pod أوليات AKS لربط الهويات المدارة لموارد Azure والهويات في Microsoft Entra ID مع pods. يمكنك استخدام هذه الهويات لمنح حق الوصول إلى موفر Azure Key Vault لبرنامج تشغيل واجهة تخزين حاوية مخزن الأسرار (CSI).
استخدم الأمر التالي للعثور على قيم معرف المستأجر (homeTenantId
):
az account show
استخدم قالب YAML التالي لإنشاء ملف secretproviderclass.yml . استبدل العناصر النائبة {Tenant Id}
و {resource group name}
بقيمك الخاصة. تأكد أيضا من أن قيمة ل {resource group name}
تطابق القيمة في param.json.
# This is a SecretProviderClass example that uses aad-pod-identity to access the key vault
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-kvname-podid
spec:
provider: azure
parameters:
usePodIdentity: "true"
keyvaultName: "{resource group name}kv" # Replace resource group name. Bicep generates the key vault name.
tenantId: "{Tenant Id}" # The tenant ID of your account. Use the 'homeTenantId' attribute value from the 'az account show' command output.
تطبيق SecretProviderClass على نظام مجموعة AKS
استخدم kubectl apply لتثبيت Secrets Store CSI Driver باستخدام YAML:
kubectl apply \
--filename secretproviderclass.yml
إنشاء تطبيق ويب ASP.NET
قم بتنزيل أو استنساخ التعليمات البرمجية المصدر لتطبيق الويب من مجلد التطبيق لمستودع GitHub azure-samples/cosmos-aks-samples :
git clone https://github.com/Azure-Samples/cosmos-aks-samples.git
cd Application/
افتح مجلد التطبيق في Visual Studio Code. قم بتشغيل التطبيق باستخدام إما المفتاح F5 أو الأمر Debug: Start Debugging .
دفع صورة حاوية Docker إلى Azure Container Registry
لإنشاء صورة حاوية من علامة التبويب Explorer في Visual Studio Code، انقر بزر الماوس الأيمن فوق Dockerfile، ثم حدد Build Image.
في المطالبة التي تطلب الاسم والإصدار لوضع علامة على الصورة، أدخل الاسم todo:latest.
استخدم جزء Docker لدفع الصورة المضمنة إلى Azure Container Registry. يمكنك العثور على الصورة المضمنة ضمن عقدة Images . افتح عقدة todo ، وانقر بزر الماوس الأيمن فوق الأحدث، ثم حدد Push.
في المطالبات، حدد اشتراك Azure ومورد Azure Container Registry وعلامات الصور. يجب أن يكون
{acrname}.azurecr.io/todo:latest
تنسيق علامة الصورة .انتظر حتى يدفع Visual Studio Code صورة الحاوية إلى Azure Container Registry.
إعداد YAML للتوزيع
استخدم قالب YAML التالي لإنشاء ملف akstododeploy.yml . {ACR name}
{Version}
{Image name}
استبدل العناصر النائبة و و بالقيم {resource group name}
الخاصة بك.
apiVersion: apps/v1
kind: Deployment
metadata:
name: todo
labels:
aadpodidbinding: "cosmostodo-apppodidentity"
app: todo
spec:
replicas: 2
selector:
matchLabels:
app: todo
template:
metadata:
labels:
app: todo
aadpodidbinding: "cosmostodo-apppodidentity"
spec:
containers:
- name: mycontainer
image: "{ACR name}/{Image name}:{Version}" # Update per your environment; for example, myacrname.azurecr.io/todo:latest. Do not add https:// in ACR Name.
ports:
- containerPort: 80
env:
- name: KeyVaultName
value: "{resource group name}kv" # Replace resource group name. Key Vault name is generated by Bicep.
nodeSelector:
kubernetes.io/os: linux
volumes:
- name: secrets-store01-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-kvname-podid"
---
kind: Service
apiVersion: v1
metadata:
name: todo
spec:
selector:
app: todo
aadpodidbinding: "cosmostodo-apppodidentity"
type: LoadBalancer
ports:
- protocol: TCP
port: 80
targetPort: 80
تطبيق YAML للتوزيع
استخدم kubectl apply
مرة أخرى لنشر جرابات التطبيق وكشف القرون عبر موازن التحميل:
kubectl apply \
--filename akstododeploy.yml \
--namespace 'my-app'
اختبر التطبيق
عند تشغيل التطبيق، تعرض خدمة Kubernetes الواجهة الأمامية للتطبيق إلى الإنترنت. قد تستغرق هذه العملية بضع دقائق حتى تكتمل.
استخدم kubectl get لعرض IP الخارجي الذي يعرضه موازن التحميل:
kubectl get services \
--namespace "my-app"
للوصول إلى التطبيق، افتح عنوان IP الذي تلقيته كإخراج في مستعرض.
تفريغ مجموعة الموارد
لتجنب رسوم Azure، قم بتنظيف الموارد غير الضرورية عندما لم تعد بحاجة إلى نظام المجموعة. استخدم az group delete وaz deployment sub delete لحذف مجموعة الموارد ونشر الاشتراك، على التوالي:
az group delete \
--resource-group $rgName
--yes
az deployment sub delete \
--name $deploymentName
المحتوى ذو الصلة
- الاستعلام عن Azure Cosmos DB ل NoSQL.
- ترقية نظام المجموعة الخاص بك.
- تحجيم نظام المجموعة الخاص بك.
- تمكين النشر المستمر.