教學課程:使用已啟用 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 中。 | |
請前往 https://shell.azure.com,或選取 [啟動 Cloud Shell] 按鈕,在瀏覽器中開啟 Cloud Shell。 | |
選取 Azure 入口網站右上方功能表列上的 [Cloud Shell] 按鈕。 |
若要使用 Azure Cloud Shell:
啟動 Cloud Shell。
選取程式碼區塊 (或命令區塊) 上的 [複製] 按鈕以複製程式碼或命令。
透過在 Windows 和 Linux 上選取 Ctrl+Shift+V;或在 macOS 上選取 Cmd+Shift+V,將程式碼或命令貼到 Cloud Shell 工作階段中。
選取 Enter 鍵執行程式碼或命令。
開始之前
本教學課程假設熟悉 Azure DevOps、Azure Repos 和 Pipelines,以及 Azure CLI。
完成上一個 教學課程 ,以瞭解如何為您的 CI/CD 環境部署 GitOps。
確認您有:
- 已啟用 Azure Arc 的 Kubernetes 叢集,名為 arc-cicd-cluster。
- 具有 AKS 整合或非 AKS 叢集驗證的已連線 Azure Container Registry (ACR)。
- Azure Repos 和 Azure Pipelines 的「建置 管理員」和「專案 管理員」許可權。
安裝下列已啟用 Azure Arc 的 Kubernetes CLI 擴充功能版本 >= 1.0.0:
az extension add --name connectedk8s az extension add --name k8s-configuration
若要將這些擴充功能更新為最新版本,請執行下列命令:
az extension update --name connectedk8s az extension update --name k8s-configuration
將應用程式和 GitOps 存放庫匯入 Azure Repos
將 應用程式存放庫 和 GitOps 存放庫 匯入 Azure Repos。 在本教學課程中,請使用下列範例存放庫:
- arc-cicd-demo-src 應用程式存放庫
- URL:https://github.com/Azure/arc-cicd-demo-src
- 包含您將使用 GitOps 部署的 Azure 投票應用程式範例。
- arc-cicd-demo-gitops GitOps 存放庫
- URL:https://github.com/Azure/arc-cicd-demo-gitops
- 作為您裝載 Azure 投票應用程式的叢集資源基底。
深入瞭解 如何匯入 Git 存放庫。
注意
針對應用程式和 GitOps 存放庫匯入和使用兩個不同的存放庫可以改善安全性和簡單性。 您可以個別調整應用程式和 GitOps 存放庫的許可權和可見性。 例如,叢集管理員可能找不到與叢集所需狀態相關的應用程式程式代碼變更。 相反地,應用程式開發人員不需要知道每個環境的特定參數-一組提供參數涵蓋範圍的測試值可能就已足夠。
連線 GitOps 存放庫
若要持續部署您的應用程式,請使用 GitOps 將應用程式存放庫連線到您的叢集。 您的 arc-cicd-demo-gitops GitOps 存放庫包含基本資源,可讓您的應用程式在 arc-cicd-cluster 叢集上啟動並執行。
初始 GitOps 存放庫只包含一個指令清單,該指令清單會建立對應至部署環境的開發和階段命名空間。
您建立的 GitOps 聯機會自動:
- 同步指令清單目錄中的指令清單。
- 更新叢集狀態。
CI/CD 工作流程會將額外的指令清單填入指令清單目錄,以部署應用程式。
在 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'
確定 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
。檢查 Azure 入口網站 中的部署狀態。
- 如果成功,您會看到 叢集中建立的
dev
和stage
命名空間。
- 如果成功,您會看到 叢集中建立的
匯入 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 服務連線開始:
- 在 Azure DevOps 中,從項目設定頁面開啟 [服務連線 ] 頁面。 在 TFS 中,從頂端功能表欄中的設定圖示開啟 [服務] 頁面。
- 選擇 [+ 新增服務連線 ],然後選取您需要的服務連線類型。
- 填入服務連線的參數。 在本教學課程中:
- 將服務連線 命名為arc-demo-acr。
- 選取 myResourceGroup 作為資源群組。
- 選取 [ 授與所有管線的訪問許可權]。
- 此選項會授權 YAML 管線檔案進行服務連線。
- 選擇 [ 確定 ] 以建立連線。
連線 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
命令建立映像提取秘密。 針對 dev
與 stage
命名空間重複 。
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 |
暫存環境變數群組
- 複製 az-vote-app-dev 變數群組。
- 將名稱變更為 az-vote-app-stage。
- 請確定對應變數的下列值:
變數 | 值 |
---|---|
ENVIRONMENT_NAME | 階段 |
TARGET_NAMESPACE | stage |
您現在已準備好部署至 dev
和 stage
環境。
為建置服務提供更多許可權
CD 管線會使用執行中組建的安全性令牌向 GitOps 存放庫進行驗證。 管線需要更多許可權,才能建立新的分支、推送變更,以及建立提取要求。
- 從 Azure DevOps 專案主頁面移至
Project settings
。 - 選取
Repositories
。 - 選取
<GitOps Repo Name>
。 - 選取
Security
。 <Project Name> Build Service (<Organization Name>)
針對 ,允許Contribute
、Contribute to pull requests
與Create branch
。
如需詳細資訊,請參閱
第一次部署開發環境
建立 CI 和 CD 管線之後,請執行 CI 管線以第一次部署應用程式。
CI 管線
在初始 CI 管線執行期間,您可能會在讀取服務連線名稱時收到資源授權錯誤。
- 確認要存取的變數AZURE_SUBSCRIPTION。
- 授權使用。
- 重新執行管線。
CI 管線:
- 確保應用程式變更會通過部署的所有自動化質量檢查。
- 執行任何無法在PR管線中完成的額外驗證。
- 針對 GitOps,管線也會發佈 CD 管線將部署的認可成品。
- 確認 Docker 映射已變更,並推送新的映像。
CD 管線
在初始 CD 管線執行期間,系統會要求您提供 GitOps 存放庫的管線存取權。 當系統提示您管線需要存取資源的許可權時,請選取 [檢視]。 然後,選取 [允許] 以授與許可權,以針對管線目前和未來的執行使用 GitOps 存放庫。
成功的 CI 管線執行會觸發 CD 管線來完成部署程式。 您將以累加方式部署到每個環境。
提示
如果 CD 管線未自動觸發:
- 確認名稱符合 中的分支觸發程式
.pipelines/az-vote-cd-pipeline.yaml
- 此屬性應該是
arc-cicd-demo-src CI
。
- 此屬性應該是
- 重新執行 CI 管線。
產生 GitOps 存放庫的範本和指令清單變更之後,CD 管線將會建立認可、推送,以及建立 PR 以供核准。
開啟工作輸出中
Create PR
提供的PR連結。確認 GitOps 存放庫的變更。 您應該會看到:
- 高階 Helm 樣本變更。
- 低階 Kubernetes 指令清單,顯示所需狀態的基礎變更。 Flux 會部署這些指令清單。
如果一切看起來都不錯,請核准並完成PR。
幾分鐘后,Flux 會挑選變更並啟動部署。
使用
kubectl
將埠轉送至本機,並確定應用程式使用下列專案正常運作:kubectl port-forward -n dev svc/azure-vote-front 8080:80
在瀏覽器中
http://localhost:8080/
檢視 Azure 投票應用程式。投票給我的最愛,並準備好對應用程式進行一些變更。
設定環境核准
在應用程式部署時,您不僅可以變更程式碼或範本,還可以不小心將叢集置於不良狀態。
如果開發環境在部署后顯示中斷,請使用環境核准,使其無法進入較新的環境。
- 在您的 Azure DevOps 專案中,移至需要保護的環境。
- 流覽至 [核准] 和 [檢查資源]。
- 選取 建立。
- 提供核准者和選擇性訊息。
- 再次選取 [建立 ] 以完成新增手動核准檢查。
如需詳細資訊,請參閱 定義核准和檢查 教學課程。
下次 CD 管線執行時,管線會在 GitOps PR 建立之後暫停。 確認變更已正確同步,並傳遞基本功能。 核准管線中的檢查,讓變更流程流向下一個環境。
變更應用程式
使用此代表叢集狀態的範本和指令清單的基準集,您將對應用程式進行小變更。
在 arc-cicd-demo-src 存放庫中,編輯
azure-vote/src/azure-vote-front/config_file.cfg
檔案。由於「貓與狗」沒有得到足夠的選票,請將它變更為“Tabs vs Spaces”,以推動投票計數。
認可新分支中的變更、推送變更,然後建立提取要求。
- 這是將啟動 CI/CD 生命週期的一般開發人員流程。
PR 驗證管線
PR 管線是針對錯誤變更的第一道防線。 一般應用程式程式代碼質量檢查包括Linting和靜態分析。 從 GitOps 的觀點來看,您也必須確保所產生基礎結構部署的相同品質。
應用程式的 Dockerfile 和 Helm 圖表可以使用與應用程式類似的 Linting。
Linting 範圍期間發現的錯誤範圍從:
- 格式不正確的 YAML 檔案,至
- 最佳做法建議,例如設定應用程式的CPU和記憶體限制。
注意
若要在實際應用程式中從 Helm Linting 取得最佳涵蓋範圍,您必須替代與實際環境中所使用的值相當類似的值。
在管線執行期間發現的錯誤會出現在執行的測試結果區段中。 在這裡,您可以:
- 追蹤錯誤類型的實用統計數據。
- 尋找其偵測到的第一個認可。
- 堆疊追蹤樣式連結至造成錯誤的程式代碼區段。
一旦管線執行完成,您就可以確保應用程式程式碼的品質,以及將部署它的範本。 您現在可以核准並完成PR。 CI 會在觸發CD管線之前再次執行,重新產生範本和指令清單。
提示
在真實環境中,別忘了設定分支原則,以確保PR通過您的質量檢查。 如需詳細資訊,請參閱 設定分支原則 一文。
CD 程式核准
成功的 CI 管線執行會觸發 CD 管線來完成部署程式。 與第一次CD管線類似,您將以累加方式部署到每個環境。 這次,管線會要求您核准每個部署環境。
- 核准部署至
dev
環境。 - 產生 GitOps 存放庫的範本和指令清單變更之後,CD 管線將會建立認可、推送,以及建立 PR 以供核准。
- 開啟工作中提供的PR連結。
- 確認 GitOps 存放庫的變更。 您應該會看到:
- 高階 Helm 樣本變更。
- 低階 Kubernetes 指令清單,顯示所需狀態的基礎變更。
- 如果一切看起來都不錯,請核准並完成PR。
- 等待部署完成。
- 作為基本煙霧測試,流覽至應用程式頁面並確認投票應用程式現在會顯示Tabs與Spaces。
- 使用
kubectl
將埠轉送至本機,並確定應用程式使用下列專案正常運作:kubectl port-forward -n dev svc/azure-vote-front 8080:80
- 在瀏覽器中 http://localhost:8080/ 檢視 Azure 投票應用程式,並確認投票選項已變更為 Tabs 與 Spaces。
- 使用
- 針對
stage
環境重複步驟 1-7。
您的部署現已完成。 這會結束 CI/CD 工作流程。
清除資源
如果您不打算繼續使用此應用程式,請使用下列步驟刪除任何資源:
刪除 Azure Arc GitOps 組態連線:
az k8s-configuration delete \ --name cluster-config \ --cluster-name arc-cicd-cluster \ --resource-group myResourceGroup \ --cluster-type connectedClusters
dev
移除命名空間:kubectl delete namespace dev
stage
移除命名空間:kubectl delete namespace stage
下一步
在本教學課程中,您已設定完整的 CI/CD 工作流程,以透過部署從應用程式開發實作 DevOps。 應用程式變更會自動觸發驗證和部署,並透過手動核准進行閘道。
請前進到我們的概念性文章,以深入瞭解已啟用 Azure Arc 的 Kubernetes 的 GitOps 和設定。