练习 - 设置 Azure DevOps 环境

已完成

在本部分中,你将配置 Azure DevOps 组织以继续学习本模块的其余部分,并创建 Azure Kubernetes 服务 (AKS) 环境以将应用程序部署到其中。

若要实现这些目标,你将:

  • 将用户添加到 Azure DevOps 组织。
  • 设置 Azure DevOps 项目。
  • 使用 Azure Boards 管理您的工作流。
  • 使用 Azure CLI 创建 Azure 资源。
  • 在 Azure Pipelines 中创建管道变量。
  • 创建一个服务连接来进行 Azure 身份验证。
  • 更新 Kubernetes 部署清单。

将用户添加到组织

若要完成本模块,需要 Azure 订阅 。 可以免费开始使用 Azure。

尽管使用 Azure DevOps 时不需要 Azure 订阅,但通过 Azure DevOps 部署到 Azure 资源时需要 Azure 订阅。 若要使该过程更加简单,请使用同一Microsoft帐户登录到 Azure 订阅和 Azure DevOps 组织。

如果使用不同的 Microsoft 帐户登录 Azure 和 Azure DevOps,仍然可以通过将用户添加到与 Azure 订阅关联的 Microsoft 帐户下的 DevOps 组织来继续操作。 有关更多详细信息,请参阅 将用户添加到组织或项目 。 添加用户时,选择 基本 访问级别。

使用基本访问级别添加用户后,注销 Azure DevOps 并使用与 Azure 订阅关联的Microsoft帐户重新登录。

获取 Azure DevOps 项目

在本部分中,你将运行一个模板,在 Azure DevOps 中创建项目。

运行模板

运行一个模板来设置 Azure DevOps 组织。

  1. 在 Visual Studio 或所选的 IDE 中获取并运行 ADOGenerator 项目

  2. 当系统提示 输入模板列表中的模板编号时,输入 40,用于 使用 Azure Pipelines 自动执行多容器部署到 Azure Kubernetes 服务,然后按 Enter

  3. 选择身份验证方法。 可以 设置和使用个人访问令牌(PAT) 或使用设备登录。

    注释

    如果设置了 PAT,请确保授权必要的范围。 对于本模块,可以使用 完全访问权限,但在实际情况下,应确保仅授予必要的范围。

  4. 输入 Azure DevOps 组织名称,然后按 Enter

  5. 如果出现提示,请输入 Azure DevOps PAT,然后按 Enter

  6. 输入项目名称(如 Space Game - web - Kubernetes),然后按 Enter

  7. 创建项目后,在浏览器中(at https://dev.azure.com/<your-organization-name>/)转到 Azure DevOps 组织并选择该项目。

为存储库创建分支

如果尚未创建,请创建 mslearn-tailspin-spacegame-web-kubernetes 存储库的分支

  1. 在 GitHub 上,转到 mslearn-tailspin-spacegame-web-kubernetes 存储库。

  2. 选择屏幕右上角的 Fork

  3. 选择 GitHub 帐户作为“所有者”,然后选择“创建分支”。

重要

本模块中的“ 清理 Azure DevOps 环境 ”单元包括清理的关键步骤。 建议执行这些步骤,以避免耗尽免费生成分钟数。 即使未完成本模块,也请务必执行清理步骤。

设置项目的可见性

最初,GitHub 上 Space Game 存储库的分支设置为“公共”,而 Azure DevOps 模板创建的项目设置为“专用”。 GitHub 上的公共存储库可供任何人访问,而专用存储库仅供你和你选择与之共享的人员访问。 同样,在 Azure DevOps 上,公共项目为未经身份验证的用户提供只读访问权限,而专用项目要求授予用户访问权限并经过身份验证才能访问服务。

目前,出于本模块的目的,无需修改这些设置中的任何一个。 但是,对于个人项目,必须确定要授予其他人的可见性和访问权限。 例如,如果你的项目是开源的,你可能会选择将 GitHub 存储库和 Azure DevOps 项目都设为“公共”。 而如果你的项目是专有的,那么你通常会将 GitHub 存储库和 Azure DevOps 项目都设为“专用”。

稍后,你会发现以下资源有助于确定哪个选项最适合你的项目:

将工作项移动到“正在执行”状态

在此步骤中,你将 Azure Boards 上的工作项分配给自己,并将其移动到正在执行状态。 在实际方案中,你和你的团队将在每个冲刺或工作迭代开始时创建工作项。

分配工作项为您提供一个可供参考的清单,帮助您开展工作,并让其他团队成员了解您的进度和剩余工作。 它还有助于强制实施正在进行的工作(WIP)限制,以防止团队同时承担太多工作。

  1. 导航到 Azure DevOps 中的 Boards ,然后从菜单中选择 Boards

    Azure DevOps 的屏幕截图,其中显示了 Boards 菜单的位置。

  2. 选择卡片底部的向下箭头,将“创建使用 Kubernetes 编排的网站的多容器版本”工作项分配给你自己。

    Azure Boards 的屏幕截图,其中显示了向下箭头的位置。

  3. 将工作项从“待处理”列拖放到“正在执行”列。 完成该任务后,将任务移到本模块末尾的 “完成 ”列。

    Azure Boards 的屏幕截图,其中显示了“Doing”列中的卡片。

创建 Azure Kubernetes 服务环境

在此步骤中,你将创建必要的 Azure Kubernetes 服务资源来部署网站的新容器版本。

在上一模块中, 使用 Azure Pipelines 创建发布管道,使用 Azure 门户创建 Azure 资源。 虽然门户可用于浏览 Azure 功能和执行基本任务,但创建 Azure Kubernetes 服务等组件可能非常耗时。

在本模块中,你将使用 Azure CLI 创建在 Azure Kubernetes 服务上部署和运行应用程序所需的资源。 可以从终端或通过 Visual Studio Code 访问 Azure CLI。 但是,在本模块中,你将从 Azure Cloud Shell 访问 Azure CLI。 Cloud Shell 是托管在云端的基于浏览器的 shell 使用体验,它预配置了 Azure CLI,便于与您的 Azure 订阅一起使用。

重要

若要完成本模块中的练习,需要自己的 Azure 订阅。

启动 Cloud Shell

  1. 导航到 Azure 门户 并登录。

  2. 从菜单中选择“Cloud Shell”选项,然后在出现提示时选择“Bash”体验。

    Azure 门户的屏幕截图,其中显示了 Cloud Shell 菜单项的位置。

注释

Cloud Shell 要求使用 Azure 存储资源来保存在 Cloud Shell 中创建的任何文件。 首次打开 Cloud Shell 时,系统将提示你创建资源组、存储帐户和 Azure 文件共享。 此设置会自动用于所有未来的 Cloud Shell 会话。

选择 Azure 区域

区域是指位于地理区域中的一个或多个 Azure 数据中心。 美国东部、美国西部和北欧等区域是此类区域的示例。 每个 Azure 资源(包括应用服务实例)都与一个区域相关联。

若要简化命令的执行,请首先设置默认区域。 设置默认区域后,除非显式指定其他区域,否则后续命令默认使用该区域。

  1. 在 Cloud Shell 中运行以下命令,列出 Azure 订阅中可用的区域:

    az account list-locations \
      --query "[].{Name: name, DisplayName: displayName}" \
      --output table
    
  2. 选择输出中在地理位置上与你相近的“名称”列中的一个区域。 例如,可以选择 eastasiawestus2

  3. 运行以下命令以设置默认区域。 将 REGION 替换为前面选择的区域的名称。

    az configure --defaults ___location=<REGION>
    

    本示例设置为 westus2 默认区域。

    az configure --defaults ___location=westus2
    

创建 Bash 变量

使用 Bash 变量可以使设置过程更加方便且减少出错的可能性。 此方法通过将共享文本字符串定义为可在脚本中使用的变量来帮助避免意外拼写错误。

  1. 在 Cloud Shell 中,生成一个随机数,以简化在下一步为某些服务创建全局唯一名称。

    resourceSuffix=$RANDOM
    
  2. 为 Azure 容器注册表和 Azure Kubernetes 服务实例创建全局唯一的名称。 请注意,这些命令使用双引号,指示 Bash 使用内联语法内插变量。

    registryName="tailspinspacegame${resourceSuffix}"
    aksName="tailspinspacegame-${resourceSuffix}"
    
  3. 创建另一个 Bash 变量来存储资源组的名称。

    rgName='tailspin-space-game-rg'
    
  4. 查找最新的 AKS 版本。

    az aks get-versions
    

    记下最新版本。

创建 Azure 资源

注释

在本教程中,默认网络设置用于学习目的。 通过这些设置,可从 Internet 访问您的网站。 但是,在实践中,可以选择配置一个 Azure 虚拟网络,该虚拟网络将网站置于不可 Internet 路由的网络中,并且只能由你和你的团队访问。 稍后,可以重新配置网络,使网站可供用户使用。

  1. 运行以下命令,创建一个资源组,其中包含前面定义的名称:

    az group create --name $rgName
    
  2. az acr create运行以下命令,使用前面定义的名称创建 Azure 容器注册表:

    az acr create \
      --name $registryName \
      --resource-group $rgName \
      --sku Standard
    
  3. az aks create运行命令,创建具有前面定义的名称的 AKS 实例。 将 <latest-AKS-version> 替换为前面记下的版本。

    az aks create \
      --name $aksName \
      --resource-group $rgName \
      --enable-addons monitoring \
      --kubernetes-version <latest-AKS-version> \
      --generate-ssh-keys
    

    注释

    AKS 部署完成可能需要 10-15 分钟。

  4. 创建一个变量,用于存储为 AKS 实例配置的服务主体的 ID:

    clientId=$(az aks show \
      --resource-group $rgName \
      --name $aksName \
      --query "identityProfile.kubeletidentity.clientId" \
      --output tsv)
    
  5. 创建一个变量来存储 Azure 容器注册表的 ID:

    acrId=$(az acr show \
      --name $registryName \
      --resource-group $rgName \
      --query "id" \
      --output tsv)
    
  6. az acr list运行以下命令,检索 Azure 容器注册表(ACR)实例的登录服务器 URL:

    az acr list \
     --resource-group $rgName \
     --query "[].{loginServer: loginServer}" \
     --output table
    

    请务必记下容器注册表的登录服务器。 稍后在配置管道时需要此信息。 下面是一个示例:

    LoginServer                      
    --------------------------------
    tailspinspacegame4692.azurecr.io
    
  7. az role assignment create运行以下命令以创建角色分配,以授权 AKS 群集连接到 Azure 容器注册表:

    az role assignment create \
      --assignee $clientId \
      --role AcrPull \
      --scope $acrId
    

重要

本模块中的“ 清理 Azure DevOps 环境 ”单元包括清理的关键步骤。 建议执行这些步骤以避免用完免费构建分钟数。 即使未完成本模块,也请务必执行清理步骤。

创建变量组

在本部分中,你将向管道添加一个变量,用于存储 Azure 容器注册表的名称。 建议在管道配置中将 Azure 容器注册表实例的名称定义为变量,而不是对其进行硬编码。 这使得配置更易于重用,如果实例名称发生更改,可以轻松更新变量并触发管道,而无需修改配置。

  1. 登录到 Azure DevOps 组织,然后导航到项目。

  2. 选择 管道,然后从左侧导航窗格中选择 资源库

    Azure Pipelines 的屏幕截图,其中显示了“库”菜单选项。

  3. 选择 “变量组”,然后选择“ + 变量”组 以添加新变量组。

  4. “属性” 部分中,将变量组名称输入为 Release

  5. 在“ 变量 ”部分下,选择“ 添加”。

  6. 输入变量名称的 RegistryName ,对于值,请输入 Azure 容器注册表的登录服务器,例如 tailspinspacegame4692.azurecr.io

  7. 在页面顶部,选择“ 保存” 以保存管道变量。 这是变量组可能的外观示例

    Azure 管道中显示变量组的屏幕截图。该组包含一个变量。

创建服务连接

下一步是创建允许 Azure Pipelines 访问 Azure 容器注册表和 Azure Kubernetes 服务实例的服务连接。 通过创建这些服务连接,Azure Pipelines 可以推送容器,并指示 AKS 群集将其拉入以更新已部署的服务。

重要

请确保使用同一Microsoft帐户登录到 Azure 门户和 Azure DevOps。

创建 Docker 注册表服务连接

  1. 登录到 Azure DevOps 组织,然后导航到项目。

  2. 从页面底部角选择 “项目”设置

  3. 选择“管道”部分下的“服务连接”。

  4. 选择 “新建服务连接”,然后选择“ Docker 注册表”,然后选择“ 下一步”。

  5. 在页面顶部附近,选择 Azure 容器注册表,然后选择 服务主体 作为身份验证类型。

  6. 为每个设置输入以下值:

    设置 价值
    订阅 你的 Azure 订阅
    Azure 容器注册表 选择之前创建的注册表
    服务连接名称 容器注册表连接
  7. 确保选中“ 授予对所有管道的访问权限” 复选框。

  8. 完成时选择“保存”。

创建 ARM 服务连接

现在,你将创建一个 Azure 资源管理器服务连接,以便通过 AKS 群集进行身份验证。 我们使用 ARM 服务连接而不是 Kubernetes,因为自 Kubernetes 1.24 以来,默认情况下不再创建长期令牌。 有关更多详细信息,请查看此 DevOps 博客文章: 使用 Kubernetes 任务的 AKS 客户的服务连接指南

  1. 选择 “新建服务连接”,选择 “Azure 资源管理器”,然后选择“ 下一步”。

  2. 选择 “服务主体”(自动),然后选择“ 下一步”。

  3. 选择 订阅 作为范围级别。

  4. 为每个设置输入以下值。

    设置 价值
    订阅 你的 Azure 订阅
    资源组 选择之前创建的注册表
    服务连接名称 Kubernetes 群集连接
  5. 确保选中“ 授予对所有管道的访问权限” 复选框。

  6. 完成时选择“保存”。

创建管道环境

  1. 选择 “管道”,然后选择“ 环境”。

    Azure Pipelines 的屏幕截图,其中显示了“环境”菜单选项。

  2. 选择“ 创建环境 ”以创建新环境。

  3. “名称” 字段中,输入 Dev

  4. “资源”部分选择“无”,然后选择“创建”以创建管道环境。

更新 Kubernetes 部署清单

在本部分中,你将更新 Kubernetes 清单 deployment.yml 以指向之前创建的容器注册表。

  1. 请前往您的 GitHub 账户,并选择为此模块派生的存储库:mslearn-tailspin-spacegame-web-kubernetes

  2. 在编辑模式下打开 manifests/deployment.yml 文件。

    GitHub 的屏幕截图,其中显示了编辑模式图标的位置。

  3. 更改容器映像引用以使用 ACR 登录服务器。 以下清单使用 tailspinspacegame2439.azurecr.io 作为示例。

    apiVersion : apps/v1
    kind: Deployment
    metadata:
      name: web
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: web
      template:
        metadata:
          labels:
            app: web
        spec:
          containers:
            - name: web
              image: tailspinspacegame4692.azurecr.io/web
              ports:
              - containerPort: 80
    
    apiVersion : apps/v1
    kind: Deployment
    metadata:
      name: leaderboard
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: leaderboard
      template:
        metadata:
          labels:
            app: leaderboard
        spec:
          containers:
            - name: leaderboard
              image: tailspinspacegame4692.azurecr.io/leaderboard
              ports:
              - containerPort: 80
    
  4. 提交对 main 分支的更改。