练习 - 创建 GitHub 操作以部署到 AKS

已完成

在本练习中,你将完成以下任务:

  • 增强现有的 GitHub 操作以包含部署作业。
  • 验证更改是否部署到 Azure Kubernetes 服务 (AKS) 群集。
  • 回滚部署。

更新产品服务的 Kubernetes 清单

要部署新版本的 eShop 产品服务,需要编辑 product.yml 文件,以指向你在上一单元中使用的 Azure 容器注册表 (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 服务 (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. 在文件底部,将新产品添加到 products 数组中:

    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.

创建用于 GitHub Actions 的 Azure Active Directory 服务主体的目的是什么?

3.

在升级部署期间,为什么 AKS 会在旧容器仍在运行的同时创建新容器?