這項參考架構提供方法和初始基礎架構,讓您使用 Google Kubernetes Engine、Cloud Build、Skaffold、kustomize
、Config Sync、Policy Controller、Artifact Registry 和 Cloud Deploy 等工具,建構現代化的持續整合/持續推送軟體更新 (CI/CD) 系統。
本文件是系列文章之一:
- 使用 GKE 進行現代化的持續整合/持續推送軟體更新:軟體推送架構
- 使用 GKE 進行現代化的持續整合/持續推送軟體更新:建構持續整合/持續推送軟體更新系統 (本文件)
- 使用 GKE 進行現代化的持續整合/持續推送軟體更新:套用開發人員工作流程
本文的目標讀者是企業架構師和應用程式開發人員,以及 IT 安全、開發運作和網站穩定性工程團隊。建議您具備自動部署工具和程序的相關經驗,有助於瞭解本文概念。
CI/CD 工作流程
如要建構新型持續整合/持續推送軟體更新系統,首先必須選擇執行系統主要功能的工具和服務。這個參考架構著重於實作 CI/CD 系統的核心功能,如下圖所示:
這個參考實作項目會為每個元件使用下列工具:
- 原始碼管理:GitHub
- 儲存應用程式和設定程式碼。
- 可供您查看變更。
- 應用程式設定管理:
kustomize
- 定義應用程式的預期設定。
- 可重複使用及擴充設定基本類型或藍圖。
- 持續整合:Cloud Build
- 測試及驗證原始碼。
- 建構部署環境使用的構件。
- 持續推送軟體更新:Cloud Deploy
- 定義程式碼在各環境的推出程序。
- 提供失敗變更的回復功能。
- 基礎架構設定:Config Sync
- 以一致的方式套用叢集和政策設定。
- 強制執行政策:Policy Controller
- 提供機制,讓您根據機構政策,定義允許在特定環境中執行的項目。
- 容器自動化調度管理:Google Kubernetes Engine
- 執行在 CI 期間建構的構件。
- 為工作負載提供擴縮、健康狀態檢查和推出方法。
- 容器構件:Artifact Registry
- 儲存 CI 期間建構的構件 (容器映像檔)。
架構
本節說明您使用這個參考架構實作的 CI/CD 元件:基礎架構、管道、程式碼存放區和登陸區。
如要一般討論 CI/CD 系統的這些層面,請參閱「Anthos 的新型持續整合/持續推送軟體更新:軟體推送架構」。
參考架構變體
參考架構有兩種部署模型:
- 多專案變體,更像是實際工作環境部署,且隔離界線更明確
- 單一專案變體,適用於示範
多專案參考架構
multi-project
版本的參考架構會模擬類似於實際運作的情境。在這些情境中,不同角色會建立基礎架構、CI/CD 管道和應用程式,並設有適當的隔離界線。這些角色或團隊只能存取必要資源。
詳情請參閱「使用 GKE 打造現代化 CI/CD:軟體交付架構」。
如要進一步瞭解如何安裝及套用這個版本的參考架構,請參閱軟體交付藍圖
單一專案參考架構
single-project
版本的參考架構示範如何在單一 Google Cloud 專案中設定整個軟體交付平台。如果使用者沒有進階 IAM 角色,只要擁有專案的擁有者角色,就能透過這個版本安裝及試用參照架構。本文將說明參考架構的單一專案版本。
平台基礎架構
這個參考架構的基礎架構包含 Kubernetes 叢集,可支援開發、預先發布和實際工作應用程式環境。下圖顯示叢集的邏輯配置:
程式碼存放區
使用這個參考架構,為運算子、開發人員、平台和安全工程師設定存放區。
下圖顯示不同程式碼存放區的參考架構實作方式,以及作業、開發和安全團隊如何與存放區互動:
在這個工作流程中,運算子可以在運算子存放區中管理 CI/CD 和應用程式設定的最佳做法。開發人員在開發存放區中導入應用程式時,系統會自動提供最佳做法、應用程式的商業邏輯,以及應用程式正常運作所需的任何專屬設定。同時,營運和安全團隊可以在設定和政策存放區中,管理平台的一致性和安全性。
應用程式登陸區
在本參考架構中,應用程式佈建時會建立應用程式的登陸區。在本系列下一份文件「使用 GKE 進行現代化 CI/CD:套用開發人員工作流程」中,您將佈建新應用程式,建立自己的登陸區。下圖說明此參考架構所用登陸區的重要元件:
每個命名空間都包含一個服務帳戶,用於 GKE 的 Workload Identity Federation,以便存取 Kubernetes 容器外部的服務,例如 Cloud Storage 或 Spanner。命名空間也包含其他資源,例如網路政策,可與其他命名空間或應用程式隔離或共用界線。
命名空間是由 CD 執行服務帳戶建立。建議團隊遵循最低權限原則,確保 CD 執行服務帳戶只能存取必要命名空間。
您可以在 Config Sync 中定義服務帳戶存取權,並使用 Kubernetes 角色式存取權控管 (RBAC) 角色和角色繫結來實作。採用這個模型後,團隊可以直接將任何資源部署到他們管理的命名空間,但無法覆寫或刪除其他命名空間的資源。
目標
- 部署單一專案參考架構。
- 探索程式碼存放區。
- 探索管道和基礎架構。
費用
在本文件中,您會使用 Google Cloud的下列計費元件:
- Google Kubernetes Engine (GKE)
- Google Kubernetes Engine (GKE) Enterprise edition for Config Sync and Policy Controller
- Cloud Build
- Artifact Registry
- Cloud Deploy
如要根據預測用量估算費用,請使用 Pricing Calculator。
完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。
事前準備
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
部署參考架構
在 Cloud Shell 中設定專案:
gcloud config set core/project PROJECT_ID
將
PROJECT_ID
替換為您的 Google Cloud 專案 ID。在 Cloud Shell 中,複製 Git 存放區:
git clone https://github.com/GoogleCloudPlatform/software-delivery-blueprint.git cd software-delivery-blueprint/launch-scripts git checkout single-project-blueprint
在 GitHub 中建立個人存取權杖,並設定下列範圍:
repo
delete_repo
admin:org
admin:repo_hook
software-delivery-bluprint/launch-scripts
資料夾下有名為vars.sh
的空白檔案。在檔案中新增下列內容:cat << EOF >vars.sh export INFRA_SETUP_REPO="gke-infrastructure-repo" export APP_SETUP_REPO="application-factory-repo" export GITHUB_USER=GITHUB_USER export TOKEN=TOKEN export GITHUB_ORG=GITHUB_ORG export REGION="us-central1" export SEC_REGION="us-west1" export TRIGGER_TYPE="webhook" EOF
將
GITHUB_USER
替換成 GitHub 使用者名稱。將
TOKEN
替換成 GitHub 個人存取權杖。將
GITHUB_ORG
替換為 GitHub 機構名稱。執行
bootstrap.sh
指令碼。如果 Cloud Shell 提示您授權,請按一下「Authorize」(授權):./bootstrap.sh
指令碼會啟動軟體推送平台。
探索程式碼存放區
在本節中,您將探索程式碼存放區。
登入 GitHub
- 在網路瀏覽器中前往 github.com,然後登入帳戶。
- 按一下介面頂端的圖片圖示。
- 按一下「你的機構」。
- 選擇您在
vars.sh
檔案中輸入的機構。 - 按一下「存放區」分頁標籤。
探索入門、運算子、設定和基礎架構存放區
營運人員和平台管理員會在啟動、營運、設定和基礎架構存放區中,定義建構及營運平台的常見最佳做法。啟動參照架構時,系統會在 GitHub 機構下建立這些存放區。
入門存放區
入門儲存庫可協助您在整個平台採用 CI/CD、基礎架構和開發最佳做法。詳情請參閱「使用 GKE 打造現代化 CI/CD:軟體推送架構」
應用程式範例存放區
在應用程式入門儲存庫中,運算符可以編碼及記錄最佳做法,例如應用程式的 CI/CD、指標收集、記錄、容器步驟和安全性。參考架構中包含 Go、Python 和 Java 應用程式的入門存放區範例。
app-template-python
、app-template-java
和 app-template-golang
應用程式啟動器存放區包含樣板程式碼,可用於建立新應用程式。除了建立新應用程式,您也可以根據應用程式需求建立新範本。參考架構提供的應用程式啟動器存放區包含:
kustomize
基本和修補程式,位於k8s
資料夾下。應用程式原始碼。
Dockerfile
,說明如何建構及執行應用程式。描述持續整合步驟最佳做法的
cloudbuild.yaml
檔案。說明部署步驟的
skaffold.yaml
檔案。
在本系列文章的下一篇「使用 GKE 進行現代化 CI/CD:套用開發人員工作流程」中,您將使用 app-template-python
存放區建立新應用程式。
基礎架構入門存放區
在基礎架構入門存放區中,運算子和基礎架構管理員可以編碼及記錄最佳做法,例如基礎架構的 CI/CD 管道、IaC、指標收集、記錄和安全性。參考架構中包含使用 Terraform 的基礎架構入門存放區範例。infra-template
基礎架構入門存放區包含 Terraform 的樣板程式碼,可用於建立應用程式所需的基礎架構資源,例如 Cloud Storage bucket、Spanner 資料庫或其他資源。
共用範本存放區
在共用範本存放區中,基礎架構管理員和營運人員會提供標準範本來執行工作。參考架構提供名為 terraform-modules
的存放區。這個存放區包含範本化的 Terraform 程式碼,可建立各種基礎架構資源。
運算子存放區
在參考架構中,運算子存放區與應用程式入門存放區相同。運算子會管理應用程式入門儲存區中 CI 和 CD 兩者所需的檔案。
參考架構包含 app-template-python
、app-template-java
和 app-template-golang
存放區。
- 這些是入門範本,內含在平台上 Kubernetes 中執行的應用程式基本 Kubernetes 資訊清單。視需要更新入門範本中的資訊清單。建立應用程式時,系統會擷取更新。
- 這些存放區中的
cloudbuild.yaml
和skaffold.yaml
檔案分別儲存了在平台上執行 CI 和 CD 的最佳做法。與應用程式設定類似,運算子可以更新及新增最佳做法的步驟。系統會使用最新步驟建立個別應用程式管道。
在本參考實作中,運算子會使用 kustomize
管理入門存放區 k8s
資料夾中的基本設定。開發人員可以隨意擴充資訊清單,加入應用程式專屬的變更,例如資源名稱和設定檔。kustomize
工具支援將設定做為資料。使用這種方法時,kustomize
輸入和輸出都是 Kubernetes 資源。您可以將某次修改資訊清單的輸出內容,用於另一次修改。
下圖說明 Spring Boot 應用程式的基本設定:
在 kustomize
中將設定視為資料模型,可帶來重大優勢:當營運商更新基本設定時,開發人員的部署管道會在下次執行時自動採用更新,開發人員端不需進行任何變更。
如要進一步瞭解如何使用 kustomize
管理 Kubernetes 資訊清單,請參閱 kustomize
說明文件。
設定和政策存放區
參考架構中包含設定和政策存放區的實作項目,該存放區使用 Config Sync 和 Policy Controller。acm-gke-infrastructure-repo
存放區包含您在應用程式環境叢集中部署的設定和政策。平台管理員在這些存放區中定義及儲存的設定,對於確保平台為作業和開發團隊提供一致的外觀和風格至關重要。
以下各節會詳細說明參考架構如何實作設定和政策存放區。
設定
在本參考實作中,您會使用 Config Sync 集中管理平台中叢集的設定,並強制執行政策。集中式管理可讓您在整個系統中傳播設定變更。
貴機構可以使用 Config Sync 註冊叢集,從 Git 存放區同步處理設定,這個程序稱為 GitOps。新增叢集時,叢集會自動同步處理最新設定,並持續比對叢集狀態與設定,以免有人導入頻外變更。
如要進一步瞭解 Config Sync,請參閱說明文件。
政策
在本參考實作中,您會使用以 Open Policy Agent 為基礎的 Policy Controller,攔截並驗證平台中 Kubernetes 叢集的每個要求。您可以使用 Rego 政策語言建立政策,全面控管提交至叢集的資源類型和設定。
下圖的架構顯示使用 Policy Controller 建立資源的要求流程:
您可以在 Config Sync 存放區中建立及定義規則,這些變更會套用至叢集。之後,無論是 CLI 或 API 用戶端提出的新資源要求,都會由 Policy Controller 根據限制條件進行驗證。
如要進一步瞭解如何管理政策,請參閱「Policy Controller 總覽」。
基礎架構存放區
參考資料中包含使用 Terraform 實作的基礎架構存放區。gke-infrastructure-repo
存放區包含基礎架構即程式碼,可建立開發、測試和正式環境的 GKE 叢集,並使用 acm-gke-infrastructure-repo
存放區設定這些叢集上的 Config Sync。gke-infrastructure-repo
包含三個分支,分別對應開發、測試和正式環境。每個分支也包含開發、測試和正式版資料夾。
探索管道和基礎架構
參考架構會在 Google Cloud 專案中建立管道。這個管道負責建立共用基礎架構。
pipeline
在本節中,您將探索基礎架構即程式碼管道,並執行該管道來建立共用基礎架構,包括 GKE 叢集。這個管道是與基礎架構存放區 gke-infrastructure-repo
連結的 Google Cloud 專案中,名為 create-infra
的 Cloud Build 觸發條件。您會按照 GitOps 方法建立基礎架構,如這部影片所示。
gke-infrastructure-repo
有開發、測試和正式分支版本。存放區中也有與這些分支相應的開發、暫存和正式環境資料夾。存放區設有分支版本保護規則,確保程式碼只能推送至開發分支版本。如要將程式碼推送至預先發布和正式版分支,您必須建立提取要求。
通常,有權存取存放區的人員會審查變更,然後合併提取要求,確保只有預期變更會升級至較高分支版本。為讓個人試用藍圖,參考架構已放寬分支保護規則,因此存放區管理員可以略過審查並合併提取要求。
當推送至 gke-infrastructure-repo
時,系統會叫用 create-infra
觸發條件。該觸發條件會識別推送發生所在的分支,並前往該分支存放區中的對應資料夾。找到相應資料夾後,系統會使用該資料夾中的檔案執行 Terraform。舉例來說,如果程式碼推送至開發分支版本,觸發程序會在開發分支版本的開發資料夾中執行 Terraform,以建立開發 GKE 叢集。同樣地,當推送作業發生至 staging
分支版本時,觸發條件會在暫存分支版本的暫存資料夾上執行 Terraform,以建立暫存 GKE 叢集。
執行管道來建立 GKE 叢集:
前往 Google Cloud 控制台的 Cloud Build 頁面。
- 共有五個 Cloud Build Webhook 觸發條件。找出名為
create-infra
的觸發條件。這個觸發程序會建立共用基礎架構,包括 GKE 叢集。
- 共有五個 Cloud Build Webhook 觸發條件。找出名為
按一下觸發條件名稱。系統會開啟觸發條件定義。
按一下「開啟編輯器」,即可查看觸發條件執行的步驟。
在「Anthos 的新型持續整合/持續推送軟體更新:套用開發人員工作流程」中導入應用程式時,會使用其他觸發條件。
前往 Google Cloud 控制台的 Cloud Build 頁面。
查看記錄頁面上的管道。使用
bootstrap.sh
部署軟體交付平台時,指令碼會將程式碼推送至gke-infrastructure-repo
存放區的開發分支,啟動這個管道並建立開發 GKE 叢集。如要建立暫存 GKE 叢集,請從開發分支提交提取要求至暫存分支:
前往 GitHub 並瀏覽存放區
gke-infrastructure-repo
。按一下「提取要求」,然後點選「新的提取要求」。
在「Base」(基本) 選單中選擇「staging」(預先發布),並在「Compare」(比較) 選單中選擇「dev」(開發)。
按一下 [Create pull request]。
如果您是存放區管理員,請合併提取要求。否則,請管理員合併提取要求。
前往 Google Cloud 控制台的 Cloud Build 記錄頁面。
專案中會啟動第二個 Cloud Build 管道。這個管道會建立暫存 GKE 叢集。
如要建立正式版 GKE 叢集,請將
pull request
從暫存環境提交至正式版分支:前往 GitHub 並瀏覽存放區
gke-infrastructure-repo
。按一下「提取要求」,然後點選「新的提取要求」。
在「Base」選單中選擇「prod」,並在「Compare」選單中選擇「staging」。
按一下 [Create pull request]。
如果您是存放區管理員,請合併提取要求。否則,請管理員合併提取要求。
前往 Google Cloud 控制台的 Cloud Build 記錄頁面。
專案中會啟動第三個 Cloud Build 管道。這個管道會建立實際工作環境 GKE 叢集。
基礎架構
在本節中,您將探索管道建立的基礎架構。
在 Google Cloud 控制台中,前往「Kubernetes clusters」(Kubernetes 叢集) 頁面。
前往 Kubernetes 的「clusters」(叢集) 頁面
這個頁面會列出用於開發 (
gke-dev-us-central1
)、預先發布 (gke-staging-us-central1
) 和正式發布 (gke-prod-us-central1
、gke-prod-us-west1
) 的叢集:
開發叢集
開發叢集 (gke-dev-us-central1
) 可讓開發人員存取命名空間,以便疊代應用程式。建議團隊使用 Skaffold 等工具,主動監控開發中的程式碼,並在變更時重新套用至開發環境,藉此提供疊代式工作流程。這個疊代迴圈類似於熱重載。不過,這個迴圈並非特定於程式設計語言,而是適用於您可使用 Docker 映像檔建構的任何應用程式。您可以在 Kubernetes 叢集中執行迴圈。
或者,開發人員可以遵循開發環境的 CI/CD 迴圈。這個迴圈會準備好程式碼變更,以便升級至較高的環境。
在本系列的下一份文件「使用 GKE 進行現代化 CI/CD:套用開發人員工作流程」中,您將使用 Skaffold 和 CI/CD 建立開發迴圈。
預備叢集
這個叢集會執行應用程式的預先發布環境。在本參考架構中,您會建立一個用於暫存的 GKE 叢集。一般來說,測試環境是實際工作環境的精確副本。
正式叢集
在參考架構中,您有兩個用於實際工作環境的 GKE 叢集。如為異地備援或高可用性 (HA) 系統,建議您在每個環境中新增多個叢集。對於部署應用程式的所有叢集,建議使用區域叢集。這種做法可避免應用程式受到區域層級故障,以及叢集或節點集區升級作業中斷的影響。
如要同步處理叢集資源的設定 (例如命名空間、配額和 RBAC),建議使用 Config Sync。如要進一步瞭解如何管理這些資源,請參閱「設定和政策存放區」。
套用參考架構
現在您已瞭解參考架構,接下來可以探索以這個實作項目為基礎的開發人員工作流程。在本系列文章的下一份文件「使用 GKE 的新型 CI/CD:套用開發人員工作流程」中,您會建立新應用程式、新增功能,然後將應用程式部署至測試和正式環境。
清除所用資源
如要試用本系列中的下一份文件「使用 GKE 進行現代化 CI/CD:套用開發人員工作流程」,請勿刪除與這個參考架構相關聯的專案或資源。否則,如要避免系統向您的 Google Cloud帳戶收取您在參考架構中使用的資源費用,請刪除專案或手動移除資源。
刪除專案
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
手動移除資源
在 Cloud Shell 中移除基礎架構:
gcloud container clusters delete gke-dev-us-central1 gcloud container clusters delete gke-staging-us-central1 gcloud container clusters delete gke-prod-us-central1 gcloud container clusters delete gke-prod-us-west1 gcloud beta builds triggers delete create-infra gcloud beta builds triggers delete add-team-files gcloud beta builds triggers delete create-app gcloud beta builds triggers delete tf-plan gcloud beta builds triggers delete tf-apply
後續步驟
- 按照「透過 GKE 進行新型 CI/CD:套用開發人員工作流程」中的步驟,建立新應用程式。
- 瞭解設定身分聯盟的最佳做法。
請參閱「Kubernetes and the challenges of continuous software deployment」。
探索 Google Cloud 的參考架構、圖表和最佳做法。 歡迎瀏覽我們的雲端架構中心。