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

重要

本教學課程使用 GitOps 搭配 Flux v1。 具有 Flux v2 的 GitOps 現在適用於已啟用 Azure Arc 的 Kubernetes 和 Azure Kubernetes Service (AKS) 叢集; 移至使用 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。
  • 建立環境變數群組。
  • dev部署和 stage 環境。
  • 測試應用程式環境。

如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶

Azure Cloud Shell

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

要啟動 Azure Cloud Shell:

選項 範例/連結
選取程式碼或命令區塊右上角的 [試試看]。 選取 [試試看] 並不會自動將程式碼或命令複製到 Cloud Shell 中。 Screenshot that shows an example of Try It for Azure Cloud Shell.
請前往 https://shell.azure.com,或選取 [啟動 Cloud Shell] 按鈕,在瀏覽器中開啟 Cloud Shell。 Button to launch Azure Cloud Shell.
選取 Azure 入口網站右上方功能表列上的 [Cloud Shell] 按鈕。 Screenshot that shows the Cloud Shell button in the Azure portal

若要使用 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. 在 Azure Repos 中,建立新匯入 arc-cicd-demo-gitops 存放庫的新 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 名為 arc-cicd-demo-src PR 的應用程式 PR 管線
.pipelines/az-vote-ci-pipeline.yaml 應用程式 CI 管線,名為 arc-cicd-demo-src CI
.pipelines/az-vote-cd-pipeline.yaml 名為 arc-cicd-demo-src CD 的應用程式 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 新增至 和 stage 命名空間中的dev服務帳戶。 如需詳細資訊, 請參閱 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 管線將會建立認可、推送,以及建立 PR 以供核准。

  1. 開啟工作輸出中 Create PR 提供的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 驗證管線

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

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

Linting 範圍期間發現的錯誤範圍從:

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

注意

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

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

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

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

提示

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

CD 程式核准

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

  1. 核准部署至 dev 環境。
  2. 產生 GitOps 存放庫的範本和指令清單變更之後,CD 管線將會建立認可、推送,以及建立 PR 以供核准。
  3. 開啟工作中提供的PR連結。
  4. 確認 GitOps 存放庫的變更。 您應該會看到:
    • 高階 Helm 樣本變更。
    • 低階 Kubernetes 指令清單,顯示所需狀態的基礎變更。
  5. 如果一切看起來都不錯,請核准並完成PR。
  6. 等待部署完成。
  7. 作為基本煙霧測試,流覽至應用程式頁面並確認投票應用程式現在會顯示Tabs與Spaces。
    • 使用 kubectl 將埠轉送至本機,並確定應用程式使用下列專案正常運作: kubectl port-forward -n dev svc/azure-vote-front 8080:80
    • 在瀏覽器中 http://localhost:8080/ 檢視 Azure 投票應用程式,並確認投票選項已變更為 Tabs 與 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 和設定。