البرنامج التعليمي: نشر تطبيق ويب 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 وإنشاء صورة الحاوية الخاصة به:

نظرة عامة

يستخدم هذا البرنامج التعليمي بنية أساسية كنهج تعليمة برمجية (IaC) لنشر الموارد إلى Azure. ستستخدم Bicep، وهي لغة تعريفية جديدة توفر نفس الإمكانات مثل قوالب Azure Resource Manager. ومع ذلك، يتضمن Bicep بناء جملة أكثر إيجازا وأسهل في الاستخدام.

ستقوم وحدات Bicep بنشر موارد Azure التالية ضمن نطاق الاشتراك المستهدف:

يستخدم هذا البرنامج التعليمي أفضل ممارسات الأمان التالية مع 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 login للاتصال باشتراك 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"
}

يمكنك أيضا رؤية حالة النشر في مجموعة الموارد:

لقطة شاشة لحالة النشر لمجموعة الموارد في مدخل Microsoft Azure.

إشعار

عندما تنشئ نظام مجموعة AKS، سيتم إنشاء مجموعة موارد ثانية تلقائياً لتخزين موارد AKS. لمزيد من المعلومات، راجع لماذا يتم إنشاء مجموعتين من الموارد باستخدام 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

  1. لإنشاء صورة حاوية من علامة التبويب Explorer في Visual Studio Code، انقر بزر الماوس الأيمن فوق Dockerfile، ثم حدد Build Image.

    لقطة شاشة لقائمة السياق في Visual Studio Code مع تحديد خيار Build Image.

  2. في المطالبة التي تطلب الاسم والإصدار لوضع علامة على الصورة، أدخل الاسم todo:latest.

  3. استخدم جزء Docker لدفع الصورة المضمنة إلى Azure Container Registry. ستجد الصورة المضمنة ضمن عقدة Images . افتح عقدة todo ، وانقر بزر الماوس الأيمن فوق الأحدث، ثم حدد Push.

    لقطة شاشة لقائمة السياق في Visual Studio Code مع تحديد خيار Push.

  4. في المطالبات، حدد اشتراك Azure ومورد Azure Container Registry وعلامات الصور. يجب أن يكون {acrname}.azurecr.io/todo:latestتنسيق علامة الصورة .

  5. انتظر حتى يدفع 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

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