练习 - 创建 GitHub 操作以部署到 AKS
在本练习中,你将完成以下任务:
- 增强现有的 GitHub 操作以包含部署作业。
- 验证更改是否部署到 Azure Kubernetes 服务 (AKS) 群集。
- 回滚部署。
更新产品服务的 Kubernetes 清单
要部署新版本的 eShop 产品服务,需要编辑 product.yml 文件,以指向你在上一单元中使用的 Azure 容器注册表 (ACR)。
在创建分支的存储库中,选择 code tab,然后选择 product.yml 文件。
选择编辑图标(铅笔)来编辑文件。
编辑行:
containers: - image: [replace with your ACR name].azurecr.io/productservice:latest
将
[replace with your ACR name]
替换为你的 ACR 的名称,例如 acseshop186748394。在右上角,选择“提交更改...”,然后在对话框中,选择“提交更改”。
创建部署操作
YAML 代码会添加一个 GitHub 步骤,该步骤:
有一个部署新映像的步骤。 下面是 ubuntu-latest
运行器中的步骤:
- 签出此文件所在的存储库。
- Azure 登录:使用服务主体凭据登录 Azure。
- 为非交互式登录设置 kubelogin:为 Azure 身份验证配置 kubeconfig 文件。
- 获取 K8s 上下文:集上下文会设置运行器的 .kube/config 文件中的 Azure Kubernetes 服务 (AKS) 凭据。
- 部署应用程序:使用上一步中生成的映像和你之前编辑的 Kubernetes 清单文件,将应用程序部署到 AKS。
完成以下步骤,以创建可部署优惠券服务的 GitHub 操作:
在分叉的存储库中,在“code tab”上选择“.github/workflows”选项卡。
选择 azure-kubernetes-service.yml。
选择编辑图标(铅笔)来编辑文件。
在文件的底部,将以下 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
在右上角,选择“提交更改...”,然后在对话框中,选择“提交更改”。
触发部署
更新 azure-kubernetes-service.yml 文件并提交更改后,会自动触发另一个部署。 接下来了解如何通过更改代码来触发另一个部署。
你有一个新产品,你的营销团队想要将其添加到目录中。
在分叉的存储库中,在“code tab”上选择“Products”文件夹。
选择 Data 文件夹。
选择 ProductDataContext.c 文件。
选择编辑图标(铅笔)来编辑文件。
在文件底部,将新产品添加到 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" },
在右上角,选择“提交更改...”,然后在对话框中,选择“提交更改”。
监视部署
若要监视部署进度,请选择 Actions 选项卡。
选择为 Build and deploy an app to AKS 工作流列出的最新工作流运行。 运行的名称是在上一步中使用的提交消息。
选择 deploy 作业以查看此工作流运行的详细信息。
在终端,运行以下命令,监视 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 审批),以防止意外部署到生产中。