使用 Azure Pipelines 建置並部署至 Azure Kubernetes Service

Azure DevOps Services

使用 Azure Pipelines 自動部署至 Azure Kubernetes Service (AKS)。 Azure Pipelines 可讓您使用 Azure DevOps 建置、測試及部署持續整合 (CI) 與持續傳遞 (CD)。

在本文中,您將了解如何建立持續建置和部署應用程式的管線。 每當您在包含 Dockerfile 的存放庫中變更程式碼時,系統都會將映像推送至您的 Azure Container Registry,並接著將資訊清單部署至您的 AKS 叢集。

必要條件

取得程式碼

派生下列存放庫,其中包含範例應用程式和 Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

建立 Azure 資源

登入 Azure 入口網站,然後選取右上角的 [Cloud Shell] 按鈕。 使用 Azure CLI 或 PowerShell 來建立 AKS 叢集。

建立容器登錄

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

登入 Azure Pipelines

登入 Azure Pipelines。 登入之後,您的瀏覽器會前往 https://dev.azure.com/my-organization-name 並顯示您的 Azure DevOps 儀表板。

在您選取的組織內,建立一個「專案」。 如果您的組織中沒有任何專案,您會看到 [建立專案開始使用] 畫面。 否則,請選取儀表板右上角的 [建立專案] 按鈕。

建立管線

連線並選取您的存放庫

  1. 登入您的 Azure DevOps 組織並前往您的專案。

  2. 前往 [管線],然後選取 [新增管線]

  3. 執行精靈的步驟,首先選取 [GitHub] 作為您的原始程式碼位置。

  4. 系統可能會將您重新導向至 GitHub 以進行登入。 若是如此,請輸入 GitHub 認證。

  5. 當您看到存放庫清單時,請選取您的存放庫。

  6. 系統可能會將您重新導向至 GitHub,以安裝 Azure Pipelines 應用程式。 如果發生此情況,請選取 [核准並安裝]

  7. 選取 [部署至 Azure Kubernetes Service]

  8. 如果出現提示,請選取您用來建立登錄和叢集的訂閱。

  9. 選取 myapp 叢集。

  10. 針對 [命名空間],選取 [現有],然後選取 [預設]

  11. 選取您的容器登錄名稱。

  12. 您可以將映像名稱保留設定為預設值。

  13. 將服務連接埠設定為 8080。

  14. 設定 [啟用提取要求的檢閱應用程式] 核取方塊,以在後續步驟中自動產生的管線 YAML 中包含檢閱應用程式 (部分機器翻譯) 相關設定。

  15. 選取 [驗證及設定]

    當 Azure Pipelines 建立您的管線時,該程序會:

    • 建立「Docker 登錄服務連線」,以讓您的管線將映像推送至您的容器登錄。

    • 建立一個「環境」及該環境中的 Kubernetes 資源。 針對已啟用 RBAC 的叢集,建立的 Kubernetes 資源會在叢集中隱含建立 ServiceAccount 和 RoleBinding 物件,讓建立的 ServiceAccount 無法在選擇的命名空間之外執行作業。

    • 產生 azure-pipelines.yml 檔案,以定義您的管線。

    • 產生 Kubernetes 資訊清單檔。 系統會根據您所做的選擇,將 deployment.ymlservice.yml 範本序列化來產生這些檔案。 當您準備好時,請選取 [儲存並執行]

  16. 選取儲存並執行

  17. 您可以將 [認可訊息] 變更為像是「將管線新增至我們的存放庫」的內容。 當您準備好時,請選取 [儲存並執行] 將新管線認可至您的存放庫,然後開始第一次執行您的新管線!

查看您的應用程式部署

當管線執行時,請監看您的建置階段,然後是您的部署階段,從藍色 (執行中) 移至綠色 (已完成)。 您可以選取要監看管線運作的階段和作業。

注意

如果您使用 Microsoft 裝載的代理程式,則必須將 Microsoft 裝載代理程式的 IP 範圍新增至您的防火牆。 從每週 JSON 檔案取得每週 IP 範圍清單,此檔案會在每週三發佈。 新的 IP 範圍會在隔週一生效。 如需詳細資訊,請參閱 Microsoft 裝載的代理程式。 若要尋找您 Azure DevOps 組織所需的 IP 範圍,請了解如何識別 Microsoft 裝載代理程式可能的 IP 範圍

管線執行完成之後,請探索發生什麼事,然後查看您已部署的應用程式。 從管線摘要:

  1. 選取 環境 索引標籤。

  2. 選取 [檢視環境]

  3. 針對您部署的目的地命名空間,選取您應用程式的執行個體。 如果您使用預設值,則其為預設命名空間中的 myapp 應用程式。

  4. 選取 [服務] 索引標籤。

  5. 選取外部 IP 位址並將其複製到您的剪貼簿。

  6. 開啟新的瀏覽器索引標籤或視窗,然後輸入 [IP 位址]<>:8080。

如果您正在建置我們的範例應用程式,則 Hello world 會出現在您的瀏覽器中。

管線如何建置

當您完成選取選項,然後繼續驗證並設定管線時,Azure Pipelines 會使用 [部署至 Azure Kubernetes Service] 範本為您建立管線。

建置階段會使用 Docker 工作來建置映像,並將其推送至 Azure Container Registry。

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

部署作業會使用 Kubernetes 資訊清單工作來建立 Kubernetes 叢集節點所需的 imagePullSecret,以從 Azure Container Registry 資源提取。 然後,Kubernetes 資訊清單工作會使用資訊清單檔來部署至 Kubernetes 叢集。 當您使用部署至 Azure Kubernetes Service 範本時,已產生資訊清單檔 service.ymldeployment.yml

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

清除資源

每當您完成所建立的資源時,都可以使用下列命令來刪除這些資源:

az group delete --name myapp-rg

出現提示時,請輸入 y

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

使用 Azure Pipelines 自動部署至 Azure Kubernetes Service (AKS)。 Azure Pipelines 可讓您使用 Azure DevOps 建置、測試及部署持續整合 (CI) 與持續傳遞 (CD)。

在本文中,您將了解如何建立持續建置和部署應用程式的管線。 每當您在包含 Dockerfile 的存放庫中變更程式碼時,系統都會將映像推送至您的 Azure Container Registry,並接著將資訊清單部署至您的 AKS 叢集。

必要條件

取得程式碼

派生下列存放庫,其中包含範例應用程式和 Dockerfile:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

建立 Azure 資源

登入 Azure 入口網站,然後選取右上角的 [Cloud Shell] 按鈕。 使用 Azure CLI 或 PowerShell 來建立 AKS 叢集。

建立容器登錄

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys 

設定驗證

當您搭配 Azure Container Service (AKS) 使用 Azure Kubernetes Registry (ACR) 時,您必須建立驗證機制。 這可以透過兩種方式來達成:

  1. 將 AKS 存取權授與 ACR。 請參閱從 Azure Kubernetes Service 對 Azure Container Registry 進行驗證

  2. 使用 Kubernetes 映像提取祕密。 您可以使用 Kubernetes 部署工作來建立映像提取祕密。

建立發行管線

用來設定 CI 的建置管線已建置 Docker 映像,並將其推送至 Azure Container Registry。 它也會將 Helm 圖表封裝並發佈為成品。 在發行管線中,我們會將容器映像當做 Helm 應用程式部署至 AKS 叢集。

  1. Azure Pipelines 中,開啟您的組建摘要。

  2. 在組建摘要中,選擇發行圖示以開始新的發行管線。

    如果您先前已建立使用這些組建成品的發行管線,則系統會提示您改為建立新版本。 在此情況下,請前往 [發行] 頁面,然後選擇 + 圖示以從該處開始新的發行管線。

  3. 選取 [空白作業] 範本。

  4. 開啟 [工作] 頁面,然後選取 [代理程式作業]

  5. 選擇 + 以新增工作並新增 [Helm 工具安裝程式] 工作。 這可確保執行後續工作的代理程式上已安裝 Helm 和 Kubectl。

  6. 再次選擇 + 並新增 [封裝和部署 Helm 圖表] 工作。 將此工作設定如下:

    • 連線類型:選取 [Azure Resource Manager] 以使用 Azure 服務連線連線來連線到 AKS 叢集。 或者,如果您想要使用 kubeconfig 或服務帳戶來連線到任何 Kubernetes 叢集,您可以選取 [Kubernetes 服務連線]。 在此情況下,您必須建立並選取 Kubernetes 服務連線 (而不是 Azure 訂閱) 來進行下列設定。

    • Azure 訂閱:從 [可用的 Azure 服務連線] 下方的清單中選取連線,或對您的 Azure 訂閱建立權限更具限制性的連線。 如果您在輸入旁看到 [授權] 按鈕,請使用它來授權 Azure 訂閱的連線。 如果您在訂閱清單中未看到所需的 Azure 訂閱,請參閱建立 Azure 服務連線以手動設定連線。

    • 資源群組:輸入或選取包含您 AKS 叢集的資源群組。

    • Kubernetes 叢集:輸入或選取您建立的 AKS 叢集。

    • 命令:選取 init 作為 Helm 命令。 這會將 Tiller 安裝到執行中的 Kubernetes 叢集。 它也會設定任何必要的本機設定。 勾選 [使用 Canary 映像版本] 來安裝最新發行前版本的 Tiller。 如果已預先安裝 Tiller,您也可以選擇勾選 [升級 Tiller] 來升級 Tiller。 如果啟用這些選項,工作就會執行 helm init --canary-image --upgrade

  7. 在 [代理程式作業] 中選擇 +,並新增另一個 [封裝和部署 Helm 圖表] 工作。 將此工作設定如下:

    • Kubernetes 叢集:輸入或選取您建立的 AKS 叢集。

    • 命名空間:輸入您想要部署應用程式的 Kubernetes 叢集命名空間。 Kubernetes 支援由相同實體叢集支援的多個虛擬叢集。 這些虛擬叢集稱為「命名空間」。 您可以使用命名空間,在相同的叢集中建立不同的環境,例如開發、測試和預備。

    • 命令:選取 upgrade 作為 Helm 命令。 您可以使用此工作執行任何 Helm 命令,並以引數的形式傳入命令選項。 當您選取 upgrade 時,工作會顯示一些其他欄位:

      • 圖表類型:選取 [檔案路徑]。 或者,如果您想要指定 URL 或圖表名稱,您可以指定 [圖表名稱]。 例如,如果圖表名稱為 stable/mysql,則工作會執行 helm upgrade stable/mysql

      • 圖表路徑:這可以是已封裝圖表的路徑或未封裝圖表目錄的路徑。 在此範例中,您將使用 CI 組建發佈圖表,因此請使用檔案選擇器選取檔案套件,或輸入 $(System.DefaultWorkingDirectory)/**/*.tgz

      • 發行名稱:輸入您的發行名稱;例如,azuredevops

      • 重新建立 Pod:如果在發行期間發生設定變更,而且您想要以新設定取代執行中的 Pod,請勾選此核取方塊。

      • 重設值:如果您想要圖表的內建值覆寫工作提供的所有值,請勾選此核取方塊。

      • 強制結束:如果因為發生衝突而想要升級並復原,以刪除、重新建立資源並重新安裝完整版本,請勾選此核取方塊。 這在套用修補程式可能失敗的情況下會很有用 (例如因為叢集 IP 位址固定而無法套用至服務)。

      • 引數:輸入 Helm 命令引數及其值;在此範例中為 --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId) 如需我們使用這些引數的原因說明,請參閱本節

      • 啟用 TLS:勾選此核取方塊,以啟用 Helm 與 Tiller 之間的強式 TLS 型連線。

      • CA 憑證:指定要上傳並用來為 Tiller 和 Helm 用戶端發行憑證的 CA 憑證。

      • 憑證:指定 Tiller 憑證或 Helm 用戶端憑證

      • 金鑰:指定 Tiller 金鑰或 Helm 用戶端金鑰

  8. 在管線的 [變數] 頁面中,新增名為 imageRepoName 的變數,並將值設定為您的 Helm 映像存放庫名稱。 一般而言,這會採用 example.azurecr.io/coderepository 格式

  9. 儲存發行管線。

Helm 升級工作中所使用的引數

在建置管線中,容器映像會加上 $(Build.BuildId) 標記,然後被推送至 Azure Container Registry。 在 Helm 圖表中,您可以參數化容器映像詳細資料 (例如名稱和標記),因為相同的圖表可用來部署至不同的環境。 這些值也可以在 values.yaml 檔案中指定,或由使用者提供的值檔案覆寫,再接著於 Helm 安裝或升級期間由 --set 參數覆寫。

在此範例中,我們會傳遞下列引數:

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

$(imageRepoName) 的值是在 [變數] 頁面 (或您 YAML 檔案的 variables 區段) 中設定。 或者,您可以將其直接取代為 --set 引數值或 values.yaml 檔案中的映像存放庫名稱。 例如:

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

另一個替代方案是設定工作的 [設定值] 選項,以將引數值指定為逗號分隔索引鍵/值組。

建立發行以部署您的應用程式

您現在已準備好建立發行,這表示您可以使用特定組建所產生的成品來開始執行發行管線的程序。 這會導致部署組建:

  1. 選擇 [+ 發行],然後選取 [建立發行]

  2. 在 [建立新發行] 面板中,確認已選取您想要使用的成品版本,然後選擇 [建立]

  3. 在資訊列訊息中選擇發行連結。 例如:「已建立發行 Release-1」。

  4. 在管線檢視中,選擇管線階段中的狀態連結,以查看記錄和代理程式輸出。