نشر تطبيق السحابة الأصلي يدويا إلى Azure Kubernetes Service

مكتمل

قبل أن تتمكن من أتمتة عمليات نشر موقع الويب الخاص بك، تحتاج إلى نشر تطبيق eShop الحالي يدويا إلى خدمة Azure Kubernetes (AKS). يمكنك إنشاء موارد Azure ونشر التطبيق إلى AKS باستخدام أوامر Azure CLI والبرامج النصية bash. وأخيرا، يمكنك إنشاء كيان خدمة Azure Active Directory (Azure AD) للسماح ل GitHub Actions بالنشر إلى AKS وAzure Container Registry.

تنشئ الأوامر الموارد التالية لنشر إصدار محدث من تطبيق eShop.

  • توفير Azure Container Registry (ACR) ثم دفع الصور إلى السجل.
  • توفير نظام مجموعة AKS، ثم نشر الحاويات في نظام المجموعة.
  • اختبار التوزيع.
  • إنشاء كيانات الخدمة للسماح ل GitHub Actions بالنشر في AKS وAzure Container Registry.

Important

تأكد من إكمال المتطلبات الأساسية قبل البدء.

فتح بيئة التطوير

يمكنك اختيار استخدام مساحة التعليمات البرمجية GitHub التي تستضيف التمرين، أو إكمال التمرين محليا في Visual Studio Code.

إعداد GitHub Codespaces

نسخ مستودع https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops إلى حساب GitHub الخاص بك. ثم على نسختك الجديدة:

  1. حدد الرمز.
  2. حدد علامة التبويب Codespaces .
  3. حدد أيقونة + لإنشاء مساحة التعليمات البرمجية الخاصة بك.

يستغرق GitHub عدة دقائق لإنشاء وتكوين مساحة التعليمات البرمجية. عند اكتمال العملية، سترى ملفات التعليمات البرمجية للتمرين.

اختياري: إعداد Visual Studio Code

لاستخدام Visual Studio Code، قم بنسخ مستودع https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops إلى حساب GitHub الخاص بك واستنساخه محليا. Then:

  1. قم بتثبيت أي متطلبات نظام لتشغيل Dev Container في Visual Studio Code.
  2. تأكد من تشغيل Docker.
  3. في نافذة Visual Studio Code جديدة، افتح مجلد المستودع المستنسخ
  4. اضغط على Ctrl+Shift+P لفتح لوحة الأوامر.
  5. البحث: >حاويات التطوير: إعادة البناء وإعادة الفتح في الحاوية
  6. ينشئ Visual Studio Code حاوية التطوير محليا.

بناء الحاويات

  1. في جزء المحطة الطرفية، قم بتشغيل أمر dotnet CLI هذا:

    dotnet publish /p:PublishProfile=DefaultContainer 
    

إنشاء موارد Azure

  1. في جزء المحطة الطرفية، سجل الدخول إلى Azure باستخدام أمر Azure CLI هذا:

    az login --use-device-code
    
  2. عرض اشتراك Azure المحدد.

    az account show -o table
    

    إذا تم تحديد الاشتراك الخطأ، فاستخدم الأمر az account set لتحديد الاشتراك الصحيح.

  3. قم بتشغيل أمر Azure CLI التالي للحصول على قائمة بمناطق Azure والاسم المقترن به:

    az account list-locations -o table
    

    حدد موقع أقرب منطقة إليك واستخدمها في الخطوة التالية عن طريق استبدال [Closest Azure region]

  4. قم بتشغيل عبارات bash هذه:

    export LOCATION=[Closest Azure region]
    export RESOURCE_GROUP=rg-eshop
    export CLUSTER_NAME=aks-eshop
    export ACR_NAME=acseshop$SRANDOM
    

    تنشئ الأوامر السابقة متغيرات البيئة التي ستستخدمها في أوامر Azure CLI التالية. تحتاج إلى تغيير الموقع إلى منطقة Azure قريبة منك مثل eastus. إذا كنت ترغب في اسم مختلف لمجموعة الموارد أو نظام مجموعة AKS أو ACR، فقم بتغيير هذه القيم. لعرض المستودعات الجديدة في مدخل Microsoft Azure، قم بتعيين نفسك كمسؤول أتمتة توافق التطبيقات في التحكم في الوصول (IAM) لسجل الحاوية.

  5. قم بتشغيل أوامر Azure CLI هذه:

    az group create --name $RESOURCE_GROUP --location $LOCATION
    az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic
    az acr login --name $ACR_NAME
    

    إذا تلقيت خطأ في المصادقة عند az acr login --name $ACR_Name تشغيله، فأنت بحاجة إلى تشغيل مستخدم المسؤول في سجل الحاوية الذي تم إنشاؤه حديثا في Azure ضمن الإعدادات - مفاتيح الوصول. يطالبك Azure بإدخال بيانات الاعتماد هذه للمتابعة. قد تحتاج أيضا إلى المصادقة مرة أخرى باستخدام az login --use-device-code.

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

      ...
      },
      "status": null,
      "systemData": {
        "createdAt": "2023-10-19T09:11:51.389157+00:00",
        "createdBy": "",
        "createdByType": "User",
        "lastModifiedAt": "2023-10-19T09:11:51.389157+00:00",
        "lastModifiedBy": "",
        "lastModifiedByType": "User"
      },
      "tags": {},
      "type": "Microsoft.ContainerRegistry/registries",
      "zoneRedundancy": "Disabled"
    }
    Login Succeeded
    
  6. لوضع علامة على الصور ودفعها إلى ACR الذي أنشأته، قم بتشغيل هذه الأوامر:

    docker tag store $ACR_NAME.azurecr.io/storeimage:v1
    docker tag products $ACR_NAME.azurecr.io/productservice:v1
    
    docker push $ACR_NAME.azurecr.io/storeimage:v1
    docker push $ACR_NAME.azurecr.io/productservice:v1
    

    يمكنك التحقق من اكتمال دفع الصور بنجاح باستخدام هذا الأمر:

    az acr repository list --name $ACR_NAME --output table
    
  7. أنشئ AKS وقم بتوصيله ب ACR باستخدام هذه الأوامر:

    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --node-count 1 --generate-ssh-keys --node-vm-size Standard_B2s --network-plugin azure --attach-acr $ACR_NAME
    
    az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
    

    تنشئ الأوامر نظام مجموعة AKS عقدة واحدة، وتوصيلها ب ACR، ثم قم بتوصيل الجهاز المحلي الخاص بك بمجموعة AKS. قد تستغرق الأوامر بضع دقائق لإكمالها.

  8. تحقق من أن AKS الجديدة يمكنها سحب الصور من ACR باستخدام هذا الأمر:

    az aks check-acr --acr $ACR_NAME.azurecr.io --name $CLUSTER_NAME --resource-group $RESOURCE_GROUP
    

    يجب أن تشاهد إخراجا مشابها للرسائل التالية:

    [2023-10-19T13:33:09Z] Loading azure.json file from /etc/kubernetes/azure.json
    [2023-10-19T13:33:09Z] Checking managed identity...
    [2023-10-19T13:33:09Z] Cluster cloud name: AzurePublicCloud
    [2023-10-19T13:33:09Z] Kubelet managed identity client ID: 00001111-aaaa-2222-bbbb-3333cccc4444
    [2023-10-19T13:33:09Z] Validating managed identity existance: SUCCEEDED
    [2023-10-19T13:33:09Z] Validating image pull permission: SUCCEEDED
    [2023-10-19T13:33:09Z] 
    Your cluster can pull images from acseshop1251599299.azurecr.io!
    

    يمكنك الآن تشغيل أوامر kubectl مقابل نظام مجموعة AKS الجديد. انسخ عنوان URL الكامل ل ACR من الإخراج ؛ على سبيل المثال، يوجد أعلى عنوان URL acseshop1251599299.

  9. تحقق من حالة نظام مجموعة AKS:

    kubectl get nodes -A
    

    يجب أن تشاهد إخراجا مشابها للرسائل التالية:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-37200563-vmss000000   Ready    agent   3h44m   v1.26.6
    

تكوين بيان توزيع Kubernetes

الآن توجد صور eShop في ACR يمكنك تحديث بيان توزيع AKS لاستخدام هذه الصور الجديدة.

  1. في Visual Studio Code أو Codespaces، من لوحة EXPLORER، حدد الملف deployment.yml في جذر المشروع.

  2. استبدل في السطر 17:

    - image: [replace with your ACR name].azurecr.io/storeimage:v1
    

    الصق اسم ACR المنسخ من الخطوة السابقة - يجب أن يبدو السطر مشابها ل yaml التالي:

    - image: acseshop1251599299.azurecr.io/storeimage:v1
    
  3. كرر هذه الخطوات للسطر 65:

    - image: [replace with your ACR name].azurecr.io/productservice:v1
    

    احفظ الملف باستخدام CTRL+S.

  4. في جزء المحطة الطرفية، انشر وحدة تحكم دخول NGINX باستخدام أمر kubernetes التالي:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.3/deploy/static/provider/cloud/deploy.yaml
    

    kubectl يضيف الأمر الخدمات والمكونات للسماح بالدخول إلى نظام مجموعة AKS. تحقق من أن الدخول جاهز للتشغيل باستخدام أمر kubernetes التالي:

    kubectl get services --namespace ingress-nginx 
    

    يجب أن تشاهد إخراجا مشابها للرسائل التالية:

    NAME                                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)                      AGE
    ingress-nginx-controller             LoadBalancer   10.0.135.51    20.26.154.64   80:32115/TCP,443:32254/TCP   58s
    ingress-nginx-controller-admission   ClusterIP      10.0.137.137   <none>         443/TCP                      58s
    
  5. نشر تطبيق eShop باستخدام هذا الأمر:

    kubectl apply -f deployment.yml
    

    يقوم الأمر kubectl apply بنشر تطبيق eShop وتطبيق ويب Blazor الأمامي وخدمة منتج REST API الخلفية وقاعدة دخول لتوجيه نسبة استخدام الشبكة إلى الخدمات الصحيحة إلى نظام مجموعة AKS. أعد تشغيل هذا الأمر إذا تلقيت أي خطأ في عمليات النشر.

    يجب أن تشاهد إخراجا مشابها للرسائل التالية:

    deployment.apps/storeimage created
    service/eshop-website created
    deployment.apps/productservice created
    service/eshop-backend created
    ingress.networking.k8s.io/eshop-ingress created
    
  6. تحقق من نشر خدمتين مصغرتين باستخدام هذا الأمر:

    kubectl get pods -A
    

    يجب أن تشاهد إخراجا مشابها للرسائل التالية:

    NAMESPACE       NAME                                        READY   STATUS      RESTARTS   AGE
    default         productservice-7569b8c64-vfbfz              1/1     Running     0          3m56s
    default         storeimage-6c7c999d7c-zsnxd                 1/1     Running     0          3m56s
    ingress-nginx   ingress-nginx-admission-create-szb8l        0/1     Completed   0          4m4s
    ingress-nginx   ingress-nginx-admission-patch-czdbv         0/1     Completed   0          4m4s
    ingress-nginx   ingress-nginx-controller-58bf5bf7dc-nwtsr   1/1     Running     0          4m4s
    
  7. عرض eShop المنشور باستخدام هذا الأمر:

    echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    

    يقوم الأمر بإرجاع عنوان IP الخارجي لتطبيق الويب. اضغط مع الاستمرار على CTRL وانقر فوق الارتباط لفتح التطبيق في علامة تبويب جديدة.

    لقطة شاشة للصفحة الرئيسية لتطبيق الويب eShop.

إنشاء كيان خدمة للنشر من GitHub

يمكن ل GitHub Actions نشر صور الحاوية إلى Azure Container Registry. لذلك يجب أن يكون لدى مشغل GitHub أذونات للاتصال ب Azure. تنشئ الخطوات التالية كيان خدمة Azure AD للعمل كهوية GitHub Actions داخل Azure.

  1. لحفظ معرف الاشتراك في متغير بيئة، قم بتشغيل الأمر التالي في المحطة الطرفية:

    export SUBS=$(az account show --query 'id' --output tsv)
    
  2. لإنشاء كيان خدمة Azure AD للسماح بالوصول من GitHub، قم بتشغيل الأمر التالي:

    az ad sp create-for-rbac --name "eShop" --role contributor --scopes /subscriptions/$SUBS/resourceGroups/$RESOURCE_GROUP --json-auth
    

    يظهر تباين الإخراج التالي:

    Creating 'Contributor' role assignment under scope '/subscriptions/ffffffff-aaaa-bbbb-6666-777777777777'
    
    The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli
     {
      "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "clientSecret": "abc1A~abc123ABC123abc123ABC123abc123ABC1",
      "subscriptionId": "00000000-0000-0000-0000-000000000000",
      "tenantId": "00000000-0000-0000-0000-000000000000",
      "activeDirectoryEndpointUrl": "https://login.microsoftonline.com",
      "resourceManagerEndpointUrl": "https://management.azure.com/",
      "activeDirectoryGraphResourceId": "https://graph.windows.net/",
      "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/",
      "galleryEndpointUrl": "https://gallery.azure.com/",
      "managementEndpointUrl": "https://management.core.windows.net/"
    }
    
  3. انسخ إخراج JSON والأقواس لاستخدامه في الخطوة التالية.

إنشاء أسرار GitHub

يستخدم مشغل GitHub Actions بيانات الاعتماد للتفاعل مع Container Registry وAKS. كيان الخدمة وبيانات الاعتماد الخاصة بسجل الحاوية هي معلومات حساسة. من الأفضل تخزين المعلومات الحساسة كأسرار مشفرة في مكان آمن. يوفر GitHub موقعا مضمنا لتخزين الأسرار والمتغيرات الأخرى.

أكمل الخطوات التالية لتخزين المعلومات الحساسة بشكل آمن كمتغيرات بيئة في المستودع الخاص بك. يجب على مسؤولي المستودع إدارة الأسرار التي يمكن لمشغل GitHub Actions الوصول إليها.

  1. في مستودع GitHub المتشعب، انتقل إلى Settings>Secrets and variables>Actions.

  2. في صفحة Actions secrets and variables، حدد New repository secret.

  3. في New secret الصفحة ، ضمن Name، أدخل AZURE_CREDENTIALS ، وضمن Secret، أدخل إخراج JSON الذي نسخته من المحطة الطرفية.

    يجب أن تبدو الإعدادات مشابهة للقطة الشاشة التالية:

    لقطة شاشة لصفحة البيانات السرية الجديدة لتعيين أسرار متغير البيئة في GitHub.

  4. حدد Add secret.

ستستخدم سر GitHub هذا في القسم التالي لإنشاء إجراء GitHub لإنشاء صورة الحاوية.