練習 - 設定您的 Azure DevOps 環境

已完成

在本節中,您會將 Azure DevOps 組織設定為繼續進行本課程模組的其餘部分,並建立 Azure Kubernetes Service (AKS) 環境以部署您的應用程式。

若要達成這些目標,您將:

  • 將使用者新增至您的 Azure DevOps 組織。
  • 設定您的 Azure DevOps 專案。
  • 使用 Azure Boards 管理您的工作流程。
  • 使用 Azure CLI 建立 Azure 資源。
  • 在 Azure Pipelines 中建立管線變數。
  • 建立服務連線以進行與 Azure 的驗證。
  • 更新 Kubernetes 部署指令清單。

將使用者新增至您的組織

若要完成本課程模組,則需要 Azure 訂用帳戶 。 您可以免費開始使用 Azure。

雖然不需要使用 Azure DevOps,但 Azure 訂用帳戶必須透過 Azure DevOps 部署至 Azure 資源。 若要讓過程更簡單,請使用相同的 Microsoft 帳戶來登入您的 Azure 訂用帳戶和 Azure DevOps 組織。

如果您使用不同的Microsoft帳戶登入 Azure 和 Azure DevOps,您仍然可以在與 Azure 訂用帳戶相關聯的Microsoft帳戶下,將使用者新增至您的 DevOps 組織。 如需詳細資訊,請參閱 將使用者新增至您的組織或專案 。 新增使用者時,請選取 [基本 存取層級]。

使用基本存取層級新增用戶之後,請註銷 Azure DevOps,並使用與 Azure 訂用帳戶相關聯的Microsoft帳戶重新登入。

取得 Azure DevOps 專案

在本節中,您會執行範本,以在 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 的螢幕擷取畫面,其中顯示 [執行] 資料行中的卡片。

建立 Azure Kubernetes Service 環境

在此步驟中,您會建立必要的 Azure Kubernetes Service 資源,以部署網站的新容器版本。

在本課程模組中,您會使用 Azure CLI 來建立在 Azure Kubernetes Service 上部署和執行應用程式所需的資源。 您可以從終端機或透過 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 資源,包括 App Service 實例,都會與區域相關聯。

若要簡化命令的執行,請從設定預設區域開始。 設定預設區域之後,除非明確指定不同的區域,否則後續命令預設會使用該區域。

  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 Container Registry 和 Azure Kubernetes Service 實例建立全域唯一的名稱。 請注意,這些命令會使用雙引號,指示Bash使用內嵌語法插補變數。

    registryName="tailspinspacegame${resourceSuffix}"
    aksName="tailspinspacegame-${resourceSuffix}"
    
  3. 建立另一個Bash變數來儲存資源群組的名稱。

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

    az aks get-versions
    

    記下最新版本。

建立 Azure 資源

備註

在本教學課程中,預設網路設定會用於學習目的。 這些設定可讓您的網站從因特網存取。 不過,在實務上,您可以選擇設定 Azure 虛擬網路,將您的網站放在無法路由傳送的網路中,且只能由您和您的小組存取。 稍後,您可以重新設定網路,讓使用者可以使用網站。

  1. 執行下列命令,以使用您稍早定義的名稱來建立資源群組:

    az group create --name $rgName
    
  2. az acr create執行 命令,以使用您稍早定義的名稱來建立 Azure Container Registry:

    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 實例設定的服務主體識別碼:

    clientId=$(az aks show \
      --resource-group $rgName \
      --name $aksName \
      --query "identityProfile.kubeletidentity.clientId" \
      --output tsv)
    
  5. 建立變數以儲存 Azure Container Registry 的標識符:

    acrId=$(az acr show \
      --name $registryName \
      --resource-group $rgName \
      --query "id" \
      --output tsv)
    
  6. az acr list執行 命令以擷取 Azure Container Registry (ACR) 實例的登入伺服器 URL:

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

    請務必記下容器登錄的登入伺服器。 您稍後在設定管線時需要此資訊。 以下為範例:

    LoginServer                      
    --------------------------------
    tailspinspacegame4692.azurecr.io
    
  7. az role assignment create執行 命令以建立角色指派,以授權 AKS 叢集連線到 Azure Container Registry:

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

這很重要

此課程模組中的 清除 Azure DevOps 環境 單元包含清除的重要步驟。 建議您執行這些步驟,以避免用盡免費組建分鐘數。 即使您未完成本課程模組,也請務必遵循清除步驟。

建立變數群組

在本節中,您會將變數新增至管線,以儲存 Azure Container Registry 的名稱。 建議您將 Azure Container Registry 實例的名稱定義為管線組態中的變數,而不是使用硬式編碼。 這可讓您的設定更容易重複使用,而且如果您的實例名稱變更,您可以輕鬆地更新變數並觸發管線,而不需要修改您的組態。

  1. 登入您的 Azure DevOps 組織,然後流覽至您的專案。

  2. 選取 管線,然後從左側瀏覽窗格中選取 程式庫

    Azure Pipelines 的螢幕截圖,顯示「Library」的功能表選項。

  3. 選取 [變數群組],然後選取 [+ 變數群組 ] 以新增變數群組。

  4. 屬性區段中,輸入變數組名 Release

  5. 在 [ 變數] 區段下,選取 [ 新增]。

  6. 輸入 RegistryName 作為變數名稱,然後針對值輸入 Azure Container Registry 的登入伺服器,例如 tailspinspacegame4692.azurecr.io

  7. 在頁面頂端,選取 [ 儲存 ] 以儲存管線變數。 這是變數群組可能外觀的範例

    Azure Pipeline 的螢幕快照,其中顯示變數群組。群組包含一個變數。

建立服務連線

下一個步驟是建立服務連線,以允許 Azure Pipelines 存取您的 Azure Container Registry 和 Azure Kubernetes Service 實例。 藉由建立這些服務連線,Azure Pipelines 可以推送您的容器,並指示 AKS 叢集將其提取至 ,以更新已部署的服務。

這很重要

請確定您已使用相同的Microsoft帳戶登入 Azure 入口網站和 Azure DevOps。

建立 Docker 登錄服務連線

  1. 登入您的 Azure DevOps 組織,然後流覽至您的專案。

  2. 從頁面的下角選取 [項目設定 ]。

  3. 選取 [管線] 區段底下的 [服務連線]

  4. 選取 [新增服務連線],然後選取 [Docker 登錄],然後選取 [ 下一步]。

  5. 在頁面頂端附近,選取 Azure Container Registry,然後選取 服務主體 作為驗證類型。

  6. 為每個設定輸入下列值。

    設定 價值觀
    訂閱 您的 Azure 訂用帳戶
    Azure 容器註冊表 選取您稍早建立的項目
    服務連線名稱 「容器登錄連線」
  7. 請確定已選取 [ 授與所有管線的訪問許可權 ] 複選框。

  8. 完成時,請選取 [ 儲存 ]。

建立ARM服務連線

現在您將建立 Azure Resource Manager 服務連線,以向 AKS 叢集進行驗證。 我們使用 ARM 服務連線,而不是 Kubernetes,因為自從 Kubernetes 1.24 版本起,預設不再建立長效令牌。 如需詳細資訊,請參閱此 DevOps 部落格文章: 使用 Kubernetes 工作的 AKS 客戶服務連線指引

  1. 選取 [新增服務連線],選取 [Azure Resource Manager],然後選取 [ 下一步]。

  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. 以編輯模式開啟 指令清單/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 分支。