共用方式為


教學課程:使用已啟用 Azure Arc 的 Kubernetes 叢集利用 GitOps 實作 CI/CD

重要

本教學課程使用 GitOps 搭配 Flux v1。 已啟用 Azure Arc 的 Kubernetes 和 Azure Kubernetes Service (AKS) 叢集現在可以使用GitOps 搭配 Flux v2;移至使用 GitOps 搭配 Flux v2 的教學課程。 建議您盡快移轉至 Flux v2

在 2024 年 1 月 1 日之前建立的 Flux v1 型叢集設定資源支援,將於 2025 年 5 月 24 日結束。 從 2024 年 1 月 1 日起,您將無法建立新的 Flux v1 型叢集設定資源。

在本教學課程中,您將使用 GitOps 搭配已啟用 Azure Arc 的 Kubernetes 叢集來設定 CI/CD 解決方案。 使用範例 Azure 投票應用程式,您將:

  • 建立已啟用 Azure Arc 的 Kubernetes 叢集。
  • 將您的應用程式和 GitOps 存放庫連線至 Azure Repos。
  • 匯入 CI/CD 管線。
  • 將您的 Azure Container Registry (ACR) 連線至 Azure DevOps 和 Kubernetes。
  • 建立環境變數群組。
  • 部署 devstage 環境。
  • 測試應用程式環境。

如尚未擁有 Azure 訂用帳戶,請在開始之前先建立免費帳戶

Azure Cloud Shell

Azure Cloud Shell 是裝載於 Azure 中的互動式殼層環境,可在瀏覽器中使用。 您可以使用 Bash 或 PowerShell 搭配 Cloud Shell,與 Azure 服務共同使用。 您可以使用 Cloud Shell 預先安裝的命令,執行本文提到的程式碼,而不必在本機環境上安裝任何工具。

要啟動 Azure Cloud Shell:

選項 範例/連結
選取程式碼或命令區塊右上角的 [試試看]。 選取 [試試看] 並不會自動將程式碼或命令複製到 Cloud Shell 中。 Azure Cloud Shell 的「試試看」範例螢幕擷取畫面。
請前往 https://shell.azure.com,或選取 [啟動 Cloud Shell] 按鈕,在瀏覽器中開啟 Cloud Shell。 啟動 Azure Cloud Shell 的按鈕。
選取 Azure 入口網站右上方功能表列上的 [Cloud Shell] 按鈕。 顯示 Azure 入口網站中 Cloud Shell 按鈕的螢幕擷取畫面

若要使用 Azure Cloud Shell:

  1. 啟動 Cloud Shell。

  2. 選取程式碼區塊 (或命令區塊) 上的 [複製] 按鈕以複製程式碼或命令。

  3. 透過在 Windows 和 Linux 上選取 Ctrl+Shift+V;或在 macOS 上選取 Cmd+Shift+V,將程式碼或命令貼到 Cloud Shell 工作階段中。

  4. 選取 Enter 鍵執行程式碼或命令。

開始之前

本教學課程假設您熟悉 Azure DevOps、Azure Repos 和 Pipelines,以及 Azure CLI。

將應用程式和 GitOps 存放庫匯入 Azure Repos

應用程式存放庫GitOps 存放庫匯入 Azure Repos。 針對本教學課程,請使用下列範例存放庫:

深入了解匯入 Git 存放庫

注意

針對應用程式和 GitOps 存放庫匯入和使用兩個不同的存放庫,可以改善安全性和簡單性。 可以個別調整應用程式和 GitOps 存放庫的權限和可見性。 例如,叢集管理員可能找不到應用程式程式碼中與叢集所需狀態相關的變更。 相反地,應用程式開發人員不需要知道每個環境的特定參數 - 一組提供參數涵蓋範圍的測試值可能就已足夠。

連線 GitOps 存放庫

若要持續部署您的應用程式,請使用 GitOps 將應用程式存放庫連線到您的叢集。 您的 arc-cicd-demo-gitops GitOps 存放庫包含基本資源,以讓您的應用程式在 arc-cicd-cluster 叢集上啟動並執行。

初始 GitOps 存放庫只包含一個資訊清單,其會建立與部署環境對應的開發暫存命名空間。

您建立的 GitOps 連線會自動:

  • 同步資訊清單目錄中的資訊清單。
  • 更新叢集狀態。

CI/CD 工作流程會將額外的資訊清單填入資訊清單目錄,以部署應用程式。

  1. 建立新的 GitOps 連線,連至 Azure Repos 中您新匯入的 arc-cicd-demo-gitops 存放庫。

    az k8s-configuration create \
       --name cluster-config \
       --cluster-name arc-cicd-cluster \
       --resource-group myResourceGroup \
       --operator-instance-name cluster-config \
       --operator-namespace cluster-config \
       --repository-url https://dev.azure.com/<Your organization>/<Your project>/_git/arc-cicd-demo-gitops \
       --https-user <Azure Repos username> \
       --https-key <Azure Repos PAT token> \
       --scope cluster \
       --cluster-type connectedClusters \
       --operator-params='--git-readonly --git-path=arc-cicd-cluster/manifests'
    
  2. 確保 Flux 使用 arc-cicd-cluster/manifests 目錄作為基礎路徑。 使用下列運算子參數定義路徑:

    --git-path=arc-cicd-cluster/manifests

    注意

    如果您使用 HTTPS 連接字串且發生連線問題,請確保您省略 URL 中的使用者名稱前置詞。 例如,必須移除 https://alice@dev.azure.com/contoso/project/_git/arc-cicd-demo-gitops 中的 alice@--https-user 可改為指定使用者,例如 --https-user alice

  3. 在 Azure 入口網站中檢查部署狀態。

    • 如果成功,您會看到叢集中同時建立 devstage 命名空間。

匯入 CI/CD 管線

既然您已同步 GitOps 連線,您必須匯入建立資訊清單的 CI/CD 管線。

應用程式存放庫包含一個 .pipeline 資料夾,其中包含您將用於 PR、CI 和 CD 的管線。 匯入並重新命名範例存放庫中提供的三個管線:

管線檔案名稱 描述
.pipelines/az-vote-pr-pipeline.yaml 應用程式 PR 管線,名為 arc-cicd-demo-src PR
.pipelines/az-vote-ci-pipeline.yaml 應用程式 CI 管線,名為 arc-cicd-demo-src CI
.pipelines/az-vote-cd-pipeline.yaml 應用程式 CD 管線,名為 arc-cicd-demo-src CD

連線您的 ACR

您的管線和叢集將使用 ACR 來儲存和擷取 Docker 映像。

將 ACR 連線至 Azure DevOps

在 CI 程序期間,您會將應用程式容器部署至登錄。 從建立 Azure 服務連線開始:

  1. 在 Azure DevOps 中,從專案設定頁面開啟 [服務連線] 頁面。 在 TFS 中,從頂端功能表列中的 [設定] 圖示開啟 [服務] 頁面。
  2. 選擇 [+ 新增服務連線],並選取您需要的服務連線類型。
  3. 填入服務連線的參數。 在此教學課程中:
    • 將服務連線命名為 arc-demo-acr
    • 選取 myResourceGroup 作為資源群組。
  4. 選取 [授與所有管線的存取權限]
    • 此選項會授權 YAML 管線檔案進行服務連線。
  5. 選擇 [確定] 以建立連線。

將 ACR 連線至 Kubernetes

讓您的 Kubernetes 叢集能夠從 ACR 提取映像。 如果是私人,則需要驗證。

將 ACR 連線到現有的 AKS 叢集

使用下列命令,將現有的 ACR 與現有的 AKS 叢集整合:

az aks update -n arc-cicd-cluster -g myResourceGroup --attach-acr arc-demo-acr

建立映像提取密碼

若要將非 AKS 和本機叢集連線到您的 ACR,請建立映像提取祕密。 Kubernetes 使用映像提取祕密,來儲存驗證登錄所需的資訊。

使用下列 kubectl 命令建立映像提取祕密。 針對 devstage 命名空間重複相同步驟。

kubectl create secret docker-registry <secret-name> \
    --namespace <namespace> \
    --docker-server=<container-registry-name>.azurecr.io \
    --docker-username=<service-principal-ID> \
    --docker-password=<service-principal-password>

若要避免必須為每個 Pod 設定 imagePullSecret,請考慮將 imagePullSecret 新增至 devstage 命名空間中的服務帳戶。 如需詳細資訊,請參閱 Kubernetes 教學課程

建立環境變數群組

應用程式存放庫變數群組

建立變數群組,名為 az-vote-app-dev。 設定下列值:

變數
AZ_ACR_NAME (您的 ACR 執行個體,例如,azurearctest.azurecr.io)
AZURE_SUBSCRIPTION (您的 Azure 服務連線,其應該是來自本教學課程稍早的 arc-demo-acr)
AZURE_VOTE_IMAGE_REPO Azure 投票應用程式存放庫的完整路徑,例如 azurearctest.azurecr.io/azvote
ENVIRONMENT_NAME 開發
MANIFESTS_BRANCH master
MANIFESTS_FOLDER azure-vote-manifests
MANIFESTS_REPO arc-cicd-demo-gitops
ORGANIZATION_NAME Azure DevOps 組織的名稱
PROJECT_NAME Azure DevOps 中 GitOps 專案的名稱
REPO_URL GitOps 存放庫的完整 URL
SRC_FOLDER azure-vote
TARGET_CLUSTER arc-cicd-cluster
TARGET_NAMESPACE dev

暫存環境變數群組

  1. 複製 az-vote-app-dev 變數群組。
  2. 將名稱變更為 az-vote-app-stage
  3. 確保對應變數的下列值:
變數
ENVIRONMENT_NAME 階段
TARGET_NAMESPACE stage

您現在已準備好部署至 devstage 環境。

為組建服務提供更多權限

CD 管線會使用執行中組建的安全性權杖向 GitOps 存放庫進行驗證。 需要更多權限,管線才能建立新的分支、推送變更,以及建立提取要求。

  1. 從 Azure DevOps 專案主頁面移至 Project settings
  2. 選取 Repositories
  3. 選取 <GitOps Repo Name>
  4. 選取 Security
  5. 針對 <Project Name> Build Service (<Organization Name>),允許 ContributeContribute to pull requestsCreate branch

如需詳細資訊,請參閱

第一次部署開發環境

建立 CI 和 CD 管線之後,請執行 CI 管線以第一次部署應用程式。

CI 管線

在初始 CI 管線執行期間,您可能會在讀取服務連線名稱時收到資源授權錯誤。

  1. 驗證要存取的變數為 AZURE_SUBSCRIPTION。
  2. 授權使用。
  3. 重新執行管線。

CI 管線:

  • 確保應用程式變更會通過部署的所有自動化品質檢查。
  • 執行無法在 PR 管線中完成的任何額外驗證。
    • 針對 GitOps,管線也會發佈 CD 管線將部署的認可成品。
  • 驗證 Docker 映像已變更,並推送新的映像。

CD 管線

在初始 CD 管線執行期間,會要求您提供 GitOps 存放庫的管線存取權。 提示您管線需要存取資源的權限時,選取 [檢視]。 然後,選取 [允許] 以授與權限,以針對管線目前和未來的執行使用 GitOps 存放庫。

成功的 CI 管線執行會觸發 CD 管線來完成部署程序。 您將以遞增方式部署到每個環境。

提示

如果 CD 管線未自動觸發:

  1. 確認名稱符合 .pipelines/az-vote-cd-pipeline.yaml 中的分支觸發程序
    • 此屬性應該是 arc-cicd-demo-src CI
  2. 重新執行 CI 管線。

對 GitOps 存放庫的範本和資訊清單變更產生之後,CD 管線將會建立認可、推送它,並建立提取要求供核准。

  1. 開啟 Create PR 工作輸出中提供的提取要求連結。

  2. 驗證對 GitOps 存放庫的變更。 您應該會看到:

    • 高階 Helm 範本變更。
    • 低階 Kubernetes 資訊清單,顯示所需狀態的基礎變更。 Flux 會部署這些資訊清單。
  3. 如果一切看起來都順利,請核准並完成 PR。

  4. 幾分鐘後,Flux 會選取變更並開始部署。

  5. 使用 kubectl 將連接埠轉送至本機,並使用下列命令確定應用程式正常運作:

    kubectl port-forward -n dev svc/azure-vote-front 8080:80

  6. 在瀏覽器中於 http://localhost:8080/ 檢視 Azure 投票應用程式。

  7. 為您的喜好投票,並準備好對應用程式進行一些變更。

設定環境核准

在應用程式部署時,您不僅會對程式碼或範本進行變更,還可能不慎讓叢集處於錯誤狀態。

如果開發環境在部署後顯示中斷,請使用環境核准,使其無法進入較新的環境。

  1. 在您的 Azure DevOps 專案中,移至需要保護的環境。
  2. 瀏覽至 [核准和檢查] 以取得資源。
  3. 選取 建立
  4. 提供核准者和選用的訊息。
  5. 再次選取 [建立] 以完成新增手動核准檢查。

如需詳細資訊,請參閱定義核准和檢查教學課程。

下次 CD 管線執行時,管線會在 GitOps PR 建立之後暫停。 驗證變更已正確同步,並傳遞基本功能。 核准管線的檢查,讓變更流程流向下一個環境。

進行應用程式變更

使用代表叢集上狀態的範本和資訊清單的這組基準,您將對應用程式進行少量變更。

  1. arc-cicd-demo-src 存放庫中,編輯 azure-vote/src/azure-vote-front/config_file.cfg 檔案。

  2. 由於「貓與狗」沒有得到足夠的選票,請將它變更為 "Tabs vs Spaces",以提高投票計數。

  3. 認可新分支中的變更、推送它,然後建立提取要求。

    • 這是將啟動 CI/CD 生命週期的一般開發人員流程。

提取要求驗證管線

PR 管線是針對錯誤變更的第一道防線。 一般應用程式程式碼品質檢查包括 Linting 分析和靜態分析。 從 GitOps 的觀點來看,您也必須確保所產生要部署的基礎結構有相同品質。

應用程式的 Dockerfile 和 Helm 圖表可以以與應用程式類似的方式使用 Linting 分析。

Lint 分析期間發現的錯誤範圍從:

  • 格式不正確的 YAML 檔案,至
  • 最佳做法建議,例如設定應用程式的 CPU 和儲存體限制。

注意

若要在實際應用程式中從 Helm Linting 分析獲得最佳涵蓋範圍,您將必須替代與實際環境中所使用的值相當類似的值。

在管線執行期間發現的錯誤會出現在執行的測試結果區段中。 在這裡,您可以:

  • 追蹤錯誤類型的實用統計資料。
  • 尋找其偵測到的第一個認可。
  • 堆疊追蹤樣式連結至造成錯誤的程式碼區段。

一旦管線執行完成,您就可以確保應用程式程式碼的品質,以及將部署它的範本。 您現在可以核准並完成提取要求。 CI 會在觸發 CD 管線之前再次執行,重新產生範本和資訊清單。

提示

在真實環境中,別忘了設定分支原則,以確保提取要求通過您的品質檢查。 如需詳細資訊,請參閱設定分支原則一文。

CD 程序核准

成功的 CI 管線執行會觸發 CD 管線來完成部署程序。 與第一次執行 CD 管線類似,您將以遞增方式部署到每個環境。 這次,管線會要求您核准每個部署環境。

  1. 核准部署至 dev 環境。
  2. 對 GitOps 存放庫的範本和資訊清單變更產生之後,CD 管線將會建立認可、推送它,並建立提取要求供核准。
  3. 開啟工作中提供的提取要求連結。
  4. 驗證對 GitOps 存放庫的變更。 您應該會看到:
    • 高階 Helm 範本變更。
    • 低階 Kubernetes 資訊清單,顯示所需狀態的基礎變更。
  5. 如果一切看起來都順利,請核准並完成 PR。
  6. 等待部署完成。
  7. 作為基本煙霧測試,瀏覽至應用程式頁面並驗證投票應用程式現在會顯示 Tabs vs Spaces。
    • 使用 kubectl 將連接埠轉送至本機,並使用下列命令確定應用程式正常運作:kubectl port-forward -n dev svc/azure-vote-front 8080:80
    • 在瀏覽器中於 http://localhost:8080/ 檢視 Azure 投票應用程式,並驗證投票選項已變更為 Tabs vs Spaces。
  8. 針對 stage 環境重複步驟 1-7。

您的部署現在已完成。 這會結束 CI/CD 工作流程。

清除資源

如果您不打算繼續使用此應用程式,請使用下列步驟刪除任何資源:

  1. 刪除 Azure Arc GitOps 設定連線:

    az k8s-configuration delete \
    --name cluster-config \
    --cluster-name arc-cicd-cluster \
    --resource-group myResourceGroup \
    --cluster-type connectedClusters
    
  2. 移除 dev 命名空間:

    • kubectl delete namespace dev
  3. 移除 stage 命名空間:

    • kubectl delete namespace stage

下一步

在本教學課程中,您已設定完整的 CI/CD 工作流程,其會透過部署從應用程式開發實作 DevOps。 對應用程式的變更會自動觸發驗證和部署,並透過手動核准守護。

請前進到我們的概念性文章,以深入了解使用已啟用 Azure Arc 的 Kubernetes 的 GitOps 和設定。