練習 - 建立 GitHub 動作以部署到 AKS

已完成

在此練習中,您將完成下列工作:

  • 增強現有的 GitHub 動作,以包含部署作業。
  • 確認是否將變更部署至 Azure Kubernetes Service (AKS) 叢集。
  • 復原部署。

更新產品服務的 Kubernetes 資訊清單

若要部署新版本的 eShop 產品服務,請編輯 product.yml 檔案,以指向您在上一個單元中使用的 Azure Container Registry (ACR)。

  1. 在派生的存放庫中,選取 [code tab],然後選取 product.yml 檔案。

  2. 若要編輯檔案,請選取編輯圖示 (鉛筆)。

  3. 編輯這一行:

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

    [replace with your ACR name] 取代為您的 ACR 名稱,例如 acseshop186748394

  4. 在右上方,選取 [認可變更...],然後在對話方塊中選取 [認可變更]

建立部署動作

YAML 程式碼會新增 GitHub 步驟:

此步驟具有部署新映像的一個步驟。 以下是 ubuntu-latest 執行器中的步驟:

  1. 簽出此檔案所在的存放庫。
  2. [Azure 登入] 會使用服務主體認證登入 Azure。
  3. [為非互動式登入設定 kubelogin] 會設定 Azure 驗證的 kubeconfig 檔案。
  4. [取得 K8s 內容] 集合內容會設定執行器 .kube/config 檔案中的 Azure Kubernetes Service (AKS) 認證。
  5. [部署應用程式] 會使用上一個步驟中建置的映像,以及您稍早編輯的 Kubernetes 資訊清單檔,將應用程式部署至 AKS。

完成下列步驟以建立部署優惠券服務的 GitHub 動作:

  1. 在派生的存放庫中,在 [code tab] 上選取 [.github/workflows] 分頁。

  2. 選取 azure-kubernetes-service.yml

  3. 若要編輯檔案,請選取編輯圖示 (鉛筆)。

  4. 在檔案底部,將下列 YAML 程式碼貼到編輯器中:

    
      deploy:
        permissions:
          actions: read
          contents: read
          id-token: write
        runs-on: ubuntu-latest
        needs: [buildImage]
        steps:
          # Checks out the repository this file is in
          - uses: actions/checkout@v3
    
          # Logs in with your Azure credentials
          - name: Azure login
            uses: azure/login@v1.4.6
            with:
              creds: '${{ secrets.AZURE_CREDENTIALS }}'
    
          # Use kubelogin to configure your kubeconfig for Azure auth
          - name: Set up kubelogin for non-interactive login
            uses: azure/use-kubelogin@v1
            with:
              kubelogin-version: 'v0.0.25'
    
          # Retrieves your Azure Kubernetes Service cluster's kubeconfig file
          - name: Get K8s context
            uses: azure/aks-set-context@v3
            with:
              resource-group: ${{ env.RESOURCE_GROUP }}
              cluster-name: ${{ env.CLUSTER_NAME }}
              admin: 'false'
              use-kubelogin: 'true'
    
          # Deploys application based on given manifest file
          - name: Deploys application
            uses: Azure/k8s-deploy@v4
            with:
              action: deploy
              manifests: ${{ env.DEPLOYMENT_MANIFEST_PATH }}
              images: |
                ${{ env.AZURE_CONTAINER_REGISTRY }}.azurecr.io/${{ env.CONTAINER_NAME }}:${{ github.sha }}
              pull-images: false
    
    
  5. 在右上方,選取 [認可變更...],然後在對話方塊中選取 [認可變更]

觸發部署

正在更新 azure-kubernetes-service.yml 檔案,認可變更會自動觸發另一個部署。 現在,請參閱程式碼變更如何觸發另一個部署。

您有行銷小組想要新增至目錄的新產品。

  1. 在派生的存放庫中,在 [code tab] 上選取 [Products] 資料夾。

  2. 選取 [Data] 資料夾。

  3. 選取 ProductDataContext.c 檔案。

  4. 若要編輯檔案,請選取編輯圖示 (鉛筆)。

  5. 在檔案底部,將新產品新增至 [產品] 陣列:

    new Product {  Name = "Camping Tent 2", Description = "This updated tent is improved and cheaper, perfect for your next trip.", Price = 79.99m, ImageUrl = "product9.png" },
    
  6. 在右上方,選取 [認可變更...],然後在對話方塊中選取 [認可變更]

監視部署

  1. 若要監視部署的進度,請選取 [Actions] 索引標籤。

  2. 選取針對 Build and deploy an app to AKS 工作流程列出的最新工作流程回合。 執行的名稱是您在上一個步驟中使用的認可訊息。

  3. 選取 [deploy] 工作,以查看此工作流程執行的詳細資料。

    Screenshot that shows the deploy job selected with a list of all the steps.

  4. 在終端中,執行下列命令以監視 AKS 叢集中的優惠券服務 Pod。 --selector 旗標只會篩選清單,只列出優惠券服務的 Pod,而 --watch 旗標會指示 kubectl 監看變更。

    kubectl get pods --selector=app=productservice --watch
    

    在部署期間,會出現下列輸出的變化:

    NAME                             READY   STATUS    RESTARTS   AGE
    productservice-7979d4c47-xlcrr   1/1     Running   0          17m
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     Pending   0          0s
    productservice-ff98b6d8d-7wmsh   0/1     ContainerCreating   0          0s
    productservice-ff98b6d8d-7wmsh   1/1     Running             0          4s
    productservice-7979d4c47-xlcrr   1/1     Terminating         0          19m
    

    在上述輸出中,可以看到新的 [productservice] Pod 已建立。 新的 pod 就緒時,舊的 pod 便會終止。 此程序會讓轉換至新版本的作業盡可能順暢。

驗證應用程式

完成下列步驟,以確認應用程式仍可運作:

  • 在終端中執行此命令,以檢視已部署的 eShop:

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

    上述命令會傳回 Web 應用程式的外部 IP 位址。 按住 CTRL,然後選取連結以在新分頁中開啟應用程式。

前往產品頁面,以檢視頁面底部所列的新帳篷。

復原部署

對於生產問題,常見的緩和措施是還原到已知良好的部署。 Kubernetes 會維護部署歷程記錄,您可用來復原至舊版應用程式。

在終端中,執行此命令以移除您剛才新增至網站的新帳篷:

kubectl rollout undo deployment/productservice

您應該會看到此主控台訊息:

deployment.apps/productservice rolled back

重新整理瀏覽器中的產品頁面,應該不會再列出新帳篷。

注意

在實際情節中,您會將組建的成品部署到多個環境。 例如,您可能有開發、測試與預備環境。 您可以透過合併 PR 之類的事件,來觸發部署工作流程。 您可以新增品質或核准閘道 (例如專案關係人的 PR 核准),以避免非預期的生產環境部署。

檢定您的知識

1.

何處是儲存 GitHub Actions 敏感性資訊的最佳位置 (例如認證)?

2.

建立 Azure Active Directory 服務主體以供 GitHub Actions 使用的目的為何?

3.

在升級部署期間,AKS 為何會在舊容器仍在執行時就建立新的容器?