本頁說明如何使用 Config Sync 和 Terraform,在叢集機群中動態建立團隊範圍的資源。Config Sync 擴充了機群團隊管理功能,可跨機群建立及管理基礎架構和叢集設定。
本指南假設您已熟悉機群團隊管理概念,例如團隊範圍和機群命名空間。詳情請參閱機群團隊管理作業簡介。
如需端對端教學課程和設定範例,請參閱範例存放區中的機群租用教學課程。
如需 Terraform 中 Config Sync 支援的欄位清單,請參閱 GKE 機群功能的 Terraform 參考文件。
工作流程範例
您是平台管理員,希望在叢集機群中動態建立資源,但不同團隊有不同的需求。舉例來說,您可能想對後端團隊的命名空間套用 NetworkPolicy,但不想對前端團隊的命名空間套用。在這種情況下,跨命名空間建立團隊範圍資源的程序如下:
- 選擇或建立要為團隊管理資源的機群。
設定可靠資料來源。真實來源包含
NamespaceSelector物件,可用於在團隊範圍內選取艦隊層級命名空間,以及您想在這些命名空間之間同步處理的任何資源 (例如NetworkPolicy)。為 Config Sync 建立機群層級預設設定。從上一個步驟建立的可靠資料來源同步處理時,Config Sync 會使用這些預設設定。這些 Config Sync 設定適用於在機群中建立的所有新叢集。
在機群中建立叢集。
建立前端和後端團隊範圍和命名空間,讓 Config Sync 偵測並調解命名空間中的資源。
完成這些步驟後,Config Sync 會根據 NamespaceSelector,在後端團隊的命名空間中建立並套用 NetworkPolicy。如果您變更或新增任何資源,Config Sync 會持續偵測並將任何變更套用至設定檔、團隊範圍、機群命名空間和機群成員。
定價
Config Sync 和機群團隊管理功能是 GKE 的一部分。如要進一步瞭解定價,請參閱 GKE 定價頁面。
事前準備
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為要建立的專案名稱。 Google Cloud -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
-
安裝 Google Cloud CLI。
-
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
-
執行下列指令,初始化 gcloud CLI:
gcloud init -
選取或建立專案所需的角色
- 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
-
建立專案:如要建立專案,您需要專案建立者角色 (
roles/resourcemanager.projectCreator),其中包含resourcemanager.projects.create權限。瞭解如何授予角色。
-
建立 Google Cloud 專案:
gcloud projects create PROJECT_ID
將
PROJECT_ID替換為要建立的專案名稱。 Google Cloud -
選取您建立的 Google Cloud 專案:
gcloud config set project PROJECT_ID
將
PROJECT_ID替換為 Google Cloud 專案名稱。
- 建立或存取可靠資料來源 (Git 存放區或 OCI 映像檔),以便儲存設定檔。本指南中的範例使用 Git 存放區。
必要的角色
如要取得建立車隊團隊資源所需的權限,請要求管理員在專案中授予您下列 IAM 角色:
-
管理機群資源:機群管理員 (原稱 GKE Hub 管理員) (
roles/gkehub.admin) -
建立 GKE 叢集:Kubernetes Engine 叢集管理員 (
roles/container.clusterAdmin)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
取得使用者憑證
如要在本機環境中執行本指南的 Terraform 指令,請執行下列指令來取得新使用者憑證:
gcloud auth application-default login
設定車隊
在本節中,您將建立車隊並啟用必要服務。
如要設定車隊,請完成下列步驟:
為機群設定 Terraform 檔案建立目錄。 在該目錄中,新增
main.tf檔案和variables.tf檔案。在
variables.tf檔案中,新增下列變數:在
main.tf檔案中,新增下列資源:匯出 PROJECT_ID 變數:
export TF_VAR_project=PROJECT_ID將
PROJECT_ID替換為要建立車隊的專案 ID。在您建立的目錄中初始化 Terraform:
terraform init確認您透過 Terraform 提出的變更符合預期計畫:
terraform plan建立車隊、啟用 API 並建立服務帳戶:
terraform apply有時啟用所有服務可能需要幾分鐘。
設定可靠資料來源
在本節中,您會將設定檔新增至可靠資料來源。您需要為要使用的每個團隊範圍建立 NamespaceSelector 物件。舉例來說,如果您有前端和後端團隊,則必須為每個團隊建立 NamespaceSelector 物件。NamespaceSelector 物件會選取團隊範圍內的所有或部分命名空間。您可以將其他團隊資源新增至可靠資料來源,例如 NetworkPolicy。建立這些資源時,請參照 NamespaceSelector,Config Sync 才能在命名空間中動態部署及同步處理這些資源。
如要設定可靠資料來源,請完成下列步驟:
在可靠資料來源中,為要讓 Config Sync 同步處理的設定檔建立目錄。
針對每個團隊,在設定目錄中建立
NamespaceSelector物件:apiVersion: configmanagement.gke.io/v1 kind: NamespaceSelector metadata: name: NAMESPACE_SELECTOR_NAME spec: mode: dynamic selector: matchLabels: fleet.gke.io/fleet-scope: SCOPE_NAME更改下列內容:
NAMESPACE_SELECTOR_NAME:NamespaceSelector物件的名稱,例如backend-scope。SCOPE_NAME:團隊範圍的名稱,例如backend。
凡是屬於機群命名空間的命名空間,都會自動加上
fleet.gke.io/fleet-scope: SCOPE_NAME標籤。NamespaceSelector:使用該標籤選取團隊範圍的所有機群命名空間。如要查看更多納入或排除命名空間的範例,請參閱「NamespaceSelector範例」。建立要跨命名空間同步處理的物件。
如要只將物件同步至特定團隊,請在該物件的中繼資料中設定下列註解:
annotations: configmanagement.gke.io/namespace-selector: NAMESPACE_SELECTOR_NAME舉例來說,後端團隊的
NetworkPolicy可能如下所示:
建立 Config Sync 的機群層級預設值
在本節中,您將建立 Config Sync 的機群層級預設值,將相同的 Config Sync 設定套用至機群中建立的所有叢集。
如要為 Config Sync 建立機群層級的預設設定,請完成下列步驟:
為機群預設設定 Terraform 檔案建立目錄。 將
main.tf檔案和variables.tf檔案新增至該目錄。在
variables.tf檔案中,新增下列變數:在
main.tf檔案中新增下列資源,設定 Config Sync 的設定:Git
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } resource "google_gke_hub_feature" "feature" { name = "configmanagement" location = "global" provider = google fleet_default_member_config { configmanagement { version = "VERSION" config_sync { source_format = "unstructured" git { sync_repo = "REPO" sync_branch = "BRANCH" policy_dir = "DIRECTORY" secret_type = "SECRET" } } } } }更改下列內容:
VERSION:(選用) Config Sync 版本號碼。如果留空,預設為最新版本。REPO:存放設定檔的存放區網址。BRANCH:存放區分支,例如main。DIRECTORY:Git 存放區中的路徑,代表要同步處理的存放區頂層。SECRET:密鑰驗證類型。
如要查看 Config Sync
git模塊支援的完整設定清單,請參閱 GKE Hub 功能的 Terraform 參考文件。OCI
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } resource "google_gke_hub_feature" "feature" { name = "configmanagement" location = "global" provider = google fleet_default_member_config { configmanagement { version = "VERSION" config_sync { source_format = "unstructured" oci { sync_repo = "REPO" policy_dir = "DIRECTORY" secret_type = "SECRET" } } } } }更改下列內容:
VERSION:Config Sync 版本號碼。如果留空,預設為最新版本。REPO:含有設定檔的 OCI 映像檔存放區網址。DIRECTORY:包含要同步資源的目錄絕對路徑。如要使用根目錄,請將這個欄位留空。SECRET:密鑰驗證類型。
如需 Config Sync
oci區塊支援的完整設定清單,請參閱 GKE Hub 功能的 Terraform 參考文件。舉例來說,下列
main.tf檔案會設定 Config Sync 從 Git 存放區同步,並同步config目錄中的所有物件:在您建立的目錄中初始化 Terraform:
terraform init確認您透過 Terraform 提議的變更與預期計畫相符:
terraform plan建立預設機群成員設定:
terraform apply
在機群中建立叢集
在本節中,您將建立共用叢集設定,然後在機群中建立叢集。
如要建立新的叢集並註冊至機群,請完成下列步驟:
建立叢集設定 Terraform 檔案的目錄。 將
main.tf檔案和variables.tf檔案新增至該目錄。在
variables.tf檔案中,新增下列變數:建立
cluster.tf檔案,其中包含所有叢集使用的預設值,例如專案和機群 ID:variable "location" { type = string } variable "cluster_name" { type = string } data "google_project" "project" { provider = google } resource "google_container_cluster" "cluster" { provider = google name = var.cluster_name location = var.location initial_node_count = 3 project = data.google_project.project.project_id fleet { project = data.google_project.project.project_id } workload_identity_config { workload_pool = "${data.google_project.project.project_id}.svc.id.goog" } deletion_protection = false }在
main.tf檔案中,新增下列資源:terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project } module "MODULE_NAME" { source = "CLUSTER_CONFIGURATION_FILEPATH" cluster_name = "CLUSTER_NAME" location="CLUSTER_LOCATION" }更改下列內容:
MODULE_NAME:要為叢集模組指定的名稱。MODULE_NAME 和 CLUSTER_NAME 可以是相同的值,例如us-east-cluster。CLUSTER_CONFIGURATION_FILEPATH:您建立的cluster.tf檔案相對路徑。CLUSTER_NAME:叢集名稱。MODULE_NAME 和 CLUSTER_NAME 可以是相同的值,例如us-east-cluster。CLUSTER_LOCATION:叢集位置,例如us-east1。
您可以視需要建立多個叢集,數量不限。舉例來說,下列
main.tf檔案會在不同區域建立 3 個叢集:在您建立的目錄中初始化 Terraform:
terraform init確認您透過 Terraform 提出的變更符合預期計畫:
terraform plan建立叢集:
terraform apply
設定團隊範圍和機群命名空間
在本節中,您將建立團隊範圍,並將叢集與這些範圍建立關聯。接著,您可以在每個範圍中建立所需的機群命名空間 (例如每個團隊各一個),而 Config Sync 會在命名空間中建立資源。
如要設定團隊範圍和命名空間,請完成下列步驟:
為團隊範圍和命名空間設定 Terraform 檔案建立目錄。將
main.tf檔案和variables.tf檔案新增至該目錄。在
variables.tf檔案中,新增下列變數:在
main.tf檔案中,新增下列資源:新增提供者資訊:
terraform { required_providers { google = { source = "hashicorp/google" version = ">=5.16.0" } } } provider "google" { project = var.project }新增團隊範圍資源:
resource "google_gke_hub_scope" "scope" { provider = google for_each = toset([ "SCOPE_NAME", "SCOPE_NAME_2", ]) scope_id = each.value }更改下列內容:
SCOPE_NAME:團隊範圍的名稱,例如backend。SCOPE_NAME_2:其他團隊範圍 (如有建立)。
您可以視需要新增多個團隊範圍。在叢集中建立機群命名空間時,系統會自動為該命名空間加上
fleet.gke.io/fleet-scope: SCOPE_NAME標籤,讓 Config Sync 能夠根據同步處理 Kubernetes 資源時的NamespaceSelector標籤選取命名空間。舉例來說,包含前端和後端團隊範圍的團隊範圍 Terraform 資源可能如下所示:
為要套用至團隊範圍的每個叢集,新增機群成員繫結:
resource "google_gke_hub_membership_binding" "membership-binding" { provider = google for_each = { MEMBERSHIP_BINDING_NAME = { membership_binding_id = "MEMBERSHIP_BINDING_ID" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name membership_id = "CLUSTER_NAME" location = "CLUSTER_LOCATION" } MEMBERSHIP_BINDING_NAME_2 = { membership_binding_id = "MEMBERSHIP_BINDING_ID_2" scope = google_gke_hub_scope.scope["SCOPE_NAME_2"].name membership_id = "CLUSTER_NAME_2" location = "CLUSTER_LOCATION_2" } } membership_binding_id = each.value.membership_binding_id scope = each.value.scope membership_id = each.value.membership_id location = each.value.location depends_on = [google_gke_hub_scope.scope] }更改下列內容:
MEMBERSHIP_BINDING_NAME:成員資格繫結名稱,例如us-east-backend。MEMBERSIP_BINDING_ID:成員資格繫結 ID。可以與 MEMBERSHIP_BINDING_NAME 相同。SCOPE_NAME:您在建立NamespaceSelector時提供給團隊範圍的標籤選取器,例如backend。CLUSTER_NAME:您在建立叢集時建立的叢集名稱,例如us-east-cluster。CLUSTER_LOCATION:叢集位置,例如us-east1。
您必須為每個叢集定義機群成員資格繫結。如果未定義叢集的團隊範圍,系統就不會為該命名空間建立叢集。舉例來說,如果您在
us-east1、us-west1和us-central1區域有三個叢集,但us-central1叢集僅供前端團隊使用,您的成員資格繫結資源會類似於下列內容:新增要為團隊定義的命名空間:
resource "google_gke_hub_namespace" "fleet_namespace" { provider = google for_each = { FLEET_NAMESPACE = { scope_id = "SCOPE_NAME" scope_namespace_id = "FLEET_NAMESPACE_ID" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name } FLEET_NAMESPACE_2 = { scope_id = "SCOPE_NAME" scope_namespace_id = "FLEET_NAMESPACE_ID_2" scope = google_gke_hub_scope.scope["SCOPE_NAME"].name } } scope_namespace_id = each.value.scope_namespace_id scope_id = each.value.scope_id scope = each.value.scope depends_on = [google_gke_hub_scope.scope] }更改下列內容:
FLEET_NAMESPACE:您要為命名空間指定的名稱,例如backend-a。SCOPE_NAME:建立NamespaceSelector時,為團隊範圍指定的標籤選取器,例如backend。FLEET_NAMESPACE_ID:命名空間 ID。可以與 FLEET_NAMESPACE 的值相同。
舉例來說,如果您希望前端和後端團隊各有兩個命名空間,機群命名空間資源可能如下所示:
在您建立的目錄中初始化 Terraform:
terraform init確認您透過 Terraform 提議的變更與預期計畫相符:
terraform plan建立機群範圍和命名空間:
terraform apply
建立機群範圍和命名空間後,Config Sync 會偵測這些新的命名空間和範圍、選取機群命名空間中的資源,並與設定檔進行協調。
如要確認資源是否已套用至正確的叢集,請使用 nomos status,或前往 Google Cloud 控制台的「Config Sync」套件分頁,然後將「View by」(依據檢視) 圓形按鈕變更為「Cluster」(叢集)。
Config Sync 會根據您團隊範圍的命名空間,並根據可靠資料來源中儲存的設定,同步處理資源。只要加入正確的 NamespaceSelector 註解,Config Sync 就會在您新增資源時,自動在團隊命名空間中調解該資源。
如要將 Config Sync 設定套用至現有叢集,請參閱 Config Sync 安裝指南中的設定機群層級預設值操作說明。
後續步驟
- 進一步瞭解如何為機群設定團隊。