פרוס באופן ידני את היישום המקורי בענן שלך ב- Azure Kubernetes Service

הושלם

כדי שתוכל להפוך את פריסות אתר האינטרנט לאוטומטיות, עליך לפרוס את היישום eShop הקיים באופן ידני בשירות Azure Kubernetes (AKS). עליך ליצור את משאבי Azure ולפרוס את היישום ב- AKS באמצעות פקודות CLI של Azure וקבצי Script של Bash. לבסוף, עליך ליצור מנהל שירות של Azure Active Directory (Azure AD) כדי לאפשר לפעולות GitHub לפרוס ב- AKS וב- Azure Container Registry.

הפקודות יוצרות את המשאבים הבאים כדי לפרוס גירסה מעודכנת של היישום eShop.

  • הקצה רישום של Azure Container Registry (ACR) ולאחר מכן דחוף תמונות לרישום.
  • הקצה משאבים לאשכול AKS ולאחר מכן פרוס את הגורמים המכילים באשכול.
  • בדוק את הפריסה.
  • צור מנהלים של שירות כדי לאפשר לפעולות GitHub לפרוס ב- 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

כדי להשתמש ב- Visual Studio Code, מזלג את מאגר https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops לחשבון GitHub שלך ושכפל אותו באופן מקומי. Then:

  1. התקן את כל דרישות המערכת כדי להפעיל את הגורם המכיל של Dev ב- Visual Studio Code.
  2. ודא ש- Docker פועל.
  3. בחלון Visual Studio Code חדש, פתח את התיקיה של המאגר המשוכפל
  4. הקש Ctrl+Shift+P כדי לפתוח את לוח הפקודות.
  5. חיפוש: >גורמים מכילים של פיתוח: בנה מחדש ופתח מחדש ב- Container
  6. Visual Studio Code יוצר את הגורם המכיל של הפיתוח באופן מקומי.

בניית קונטיינרים

  1. בחלונית המסוף, הפעל את הפקודה CLI זו של dotnet:

    dotnet publish /p:PublishProfile=DefaultContainer 
    

יצירת המשאבים של Azure

  1. בחלונית המסוף, היכנס ל- Azure באמצעות הפקודה CLI זו של Azure:

    az login --use-device-code
    
  2. הצג את מנוי Azure שנבחר.

    az account show -o table
    

    אם נבחר מנוי שגוי, השתמש בפקודה חשבון az כדי לבחור את המנוי הנכון.

  3. הפעל את הפקודה הבאה של ממשק שורת הפקודה של Azure כדי לקבל רשימה של אזורי 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
    

    הפקודות הקודמות יוצרות משתני סביבה שבהם תשתמש בפקודות ה- CLI הבאות של Azure. עליך לשנות את המיקום לאזור Azure הקרוב אליך כגון eastus. אם אתה מעוניין בשם אחר עבור קבוצת המשאבים, אשכול AKS או ACR, שנה ערכים אלה. כדי להציג את המאגרים החדשים שלך בפורטל Azure, הקצה את עצמך כמנהל מערכת של אוטומציית תאימות היישומים של בפקד Access (IAM) רישום הגורם המכיל.

  5. הפעל פקודות CLI אלה של Azure:

    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 החדש שלך. העתק את כתובת האתר המלאה של 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 מחילה את היישום 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 יכולות לפרסם תמונות של גורמים מכילים ברישום של Azure Container. לכן, לרץ 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 לבניית תמונת הגורם המכיל.