本頁面說明如何使用 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 會持續偵測並將變更套用至設定檔、團隊範圍、機群命名空間和機群成員。
定價
只有啟用 GKE Enterprise 的使用者,才能使用 Config Sync 和機群團隊管理功能。如要進一步瞭解 GKE Enterprise 定價,請參閱 GKE 定價頁面。
事前準備
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
- 建立或存取可靠來源 (Git 存放區或 OCI 映像檔),以便儲存設定檔。本指南中的範例使用 Git 存放區。
-
管理機群資源:
機群管理員 (原稱 GKE Hub 管理員) (
roles/gkehub.admin
) -
建立 GKE 叢集:
Kubernetes Engine 叢集管理員 (
roles/container.clusterAdmin
) -
啟用 GKE Enterprise:
Service Usage 管理員 (
roles/serviceusage.serviceUsageAdmin
) 為機群設定 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
有時啟用所有服務可能需要幾分鐘的時間。
在可靠來源中,為要透過 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
可能如下所示:為機群預設設定 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
為團隊範圍和命名空間設定 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
- 進一步瞭解如何為車隊設定團隊。
必要的角色
如要取得建立車隊團隊資源所需的權限,請要求管理員授予您專案的下列 IAM 角色:
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
取得使用者憑證
如要在本機環境中執行本指南的 Terraform 指令,請執行下列指令來取得新的使用者憑證:
gcloud auth application-default login
設定車隊
在本節中,您將建立機群並啟用必要服務。
如要設定車隊,請完成下列步驟:
設定可靠資料來源
在本節中,您會將設定檔新增至可靠資料來源。如要使用每個團隊範圍,您都需要 NamespaceSelector
物件。舉例來說,如果您有前端和後端團隊,就必須為每個團隊建立 NamespaceSelector
物件。NamespaceSelector
物件會選取團隊範圍內的所有或部分命名空間。您可以在單一事實來源中新增其他團隊資源,例如 NetworkPolicy
。建立這些資源時,請參照 NamespaceSelector
,讓 Config Sync 能夠跨命名空間動態部署及同步處理這些資源。
如要設定單一事實來源,請完成下列步驟:
為 Config Sync 建立機群層級預設值
在本節中,您將建立 Config Sync 的機群層級預設值,這會將相同的 Config Sync 設定套用至機群中建立的所有叢集。
如要為 Config Sync 建立機群層級的預設設定,請完成下列步驟:
在機群中建立叢集
在本節中,您將建立共用叢集設定,然後在機群中建立叢集。
如要建立新叢集並註冊至機群,請完成下列步驟:
設定團隊範圍和機群命名空間
在本節中,您將建立團隊範圍,並將叢集與這些範圍建立關聯。然後在每個範圍中建立所需的機群命名空間 (例如每個團隊各一個),Config Sync 就會在命名空間中建立資源。
如要設定團隊範圍和命名空間,請完成下列步驟:
建立機群範圍和命名空間後,Config Sync 會偵測到這些新的命名空間及其範圍,選取機群命名空間中的資源,並與設定檔進行比對。
您可以使用 nomos status
檢查資源是否已套用至正確的叢集,也可以前往 Google Cloud 控制台的 Config Sync「套件」分頁,將「查看依據」單選按鈕變更為「叢集」。
Config Sync 會根據團隊範圍,按照可靠來源中儲存的設定,在命名空間之間同步處理資源。只要您加入新資源時包含正確的 NamespaceSelector
註解,Config Sync 就會自動在團隊命名空間中調解該資源。
如要將 Config Sync 設定套用至現有叢集,請參閱 Config Sync 安裝指南中的設定機群層級預設值操作說明。