管理機群中的團隊資源

本頁面說明如何使用 Config Sync 和 Terraform,在叢集機群中動態建立團隊範圍的資源。Config Sync 擴充了機群團隊管理功能,可讓您在機群中建立及管理基礎架構和叢集設定。

本指南假設您已熟悉機群團隊管理概念,例如團隊範圍和機群命名空間。詳情請參閱機群團隊管理作業簡介

如需提供範例設定的端對端教學課程,請參閱範例存放區中的車隊租戶教學課程

如要查看 Terraform 中 Config Sync 支援的欄位清單,請參閱 GKE 機群功能的 Terraform 參考說明文件

工作流程範例

您是平台管理員,希望在叢集機群中動態建立資源,但不同團隊有不同的需求。舉例來說,您可能只想將 NetworkPolicy 套用至後端團隊的命名空間,不套用至前端團隊的命名空間。在這種情況下,跨命名空間建立團隊範圍資源的程序如下:

  1. 選擇或建立要管理團隊資源的車隊。
  2. 設定可靠資料來源。真實來源包含 NamespaceSelector 物件,您可以使用這些物件在團隊範圍內選取車隊層級的命名空間,以及您要在這些命名空間之間同步處理的任何資源 (例如 NetworkPolicy)。

  3. 為 Config Sync 建立機群層級預設設定。從上一步建立的單一事實來源同步處理時,Config Sync 會使用這些預設設定。這些 Config Sync 設定會套用至機群中建立的所有新叢集

  4. 在機群中建立叢集。

  5. 建立前端和後端團隊範圍和命名空間,讓 Config Sync 偵測並調解命名空間中的資源。

完成這些步驟後,Config Sync 會根據 NamespaceSelector,在後端團隊的命名空間中建立並套用 NetworkPolicy。如果您變更或新增任何資源,Config Sync 會持續偵測並將變更套用至設定檔、團隊範圍、機群命名空間和機群成員。

定價

只有啟用 GKE Enterprise 的使用者,才能使用 Config Sync 和機群團隊管理功能。如要進一步瞭解 GKE Enterprise 定價,請參閱 GKE 定價頁面

事前準備

  1. 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.
  2. Install the Google Cloud CLI.

  3. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. 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.

  6. Install the Google Cloud CLI.

  7. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. 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.

  10. 建立或存取可靠來源 (Git 存放區或 OCI 映像檔),以便儲存設定檔。本指南中的範例使用 Git 存放區。
  11. 必要的角色

    如要取得建立車隊團隊資源所需的權限,請要求管理員授予您專案的下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

    您或許還可透過自訂角色或其他預先定義的角色取得必要權限。

    取得使用者憑證

    如要在本機環境中執行本指南的 Terraform 指令,請執行下列指令來取得新的使用者憑證

    gcloud auth application-default login
    

    設定車隊

    在本節中,您將建立機群並啟用必要服務。

    如要設定車隊,請完成下列步驟:

    1. 為機群設定 Terraform 檔案建立目錄。 將 main.tf 檔案和 variables.tf 檔案新增至該目錄。

    2. variables.tf 檔案中新增下列變數:

      variable "project" {
        type = string
        description = "GCP project ID"
      }

    3. main.tf 檔案中新增下列資源:

      terraform {
        required_providers {
          google = {
            source = "hashicorp/google"
            version = ">= 5.16.0"
          }
        }
      }
      
      provider "google" {
        # project variable must be provided at runtime
        project = var.project
      }
      
      # Enable API services
      resource "google_project_service" "services" {
        for_each = toset([
          "gkehub.googleapis.com",
          "container.googleapis.com",
          "connectgateway.googleapis.com",
          "cloudresourcemanager.googleapis.com",
          "iam.googleapis.com",
          "anthos.googleapis.com",
          "anthosconfigmanagement.googleapis.com",
        ])
        service = each.value
        disable_on_destroy = false
      }
      
      # Declare a fleet in the project
      resource "google_gke_hub_fleet" "default" {
        display_name = "demo"
      
        depends_on = [google_project_service.services]
      }
    4. 匯出 PROJECT_ID 變數:

      export TF_VAR_project=PROJECT_ID
      

      PROJECT_ID 替換為要建立車隊的專案 ID。

    5. 在您建立的目錄中初始化 Terraform:

      terraform init
      
    6. 確認您透過 Terraform 提議的變更符合預期計畫:

      terraform plan
      
    7. 建立車隊、啟用 API,並建立服務帳戶:

      terraform apply
      

      有時啟用所有服務可能需要幾分鐘的時間。

    設定可靠資料來源

    在本節中,您會將設定檔新增至可靠資料來源。如要使用每個團隊範圍,您都需要 NamespaceSelector 物件。舉例來說,如果您有前端和後端團隊,就必須為每個團隊建立 NamespaceSelector 物件。NamespaceSelector 物件會選取團隊範圍內的所有或部分命名空間。您可以在單一事實來源中新增其他團隊資源,例如 NetworkPolicy。建立這些資源時,請參照 NamespaceSelector,讓 Config Sync 能夠跨命名空間動態部署及同步處理這些資源。

    如要設定單一事實來源,請完成下列步驟:

    1. 在可靠來源中,為要透過 Config Sync 同步處理的設定檔建立目錄。

    2. 針對每個團隊,在設定目錄中建立 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_NAMENamespaceSelector 物件的名稱,例如 backend-scope
      • SCOPE_NAME:團隊範圍的名稱,例如 backend

      凡是屬於機群命名空間的命名空間,都會自動加上 fleet.gke.io/fleet-scope: SCOPE_NAME 標籤。NamespaceSelector 會使用該標籤選取團隊範圍的所有機群命名空間。如需更多納入或排除命名空間的範例,請參閱 NamespaceSelector 範例

    3. 建立要在命名空間之間同步處理的任何物件。

      如要只將物件同步至特定團隊,請在該物件的中繼資料中設定下列註解:

      annotations:
        configmanagement.gke.io/namespace-selector: NAMESPACE_SELECTOR_NAME
      

      舉例來說,後端團隊的 NetworkPolicy 可能如下所示:

      apiVersion: networking.k8s.io/v1
      kind: NetworkPolicy
      metadata:
        name: be-deny-all
        annotations:
          configmanagement.gke.io/namespace-selector: backend-scope # Actuate this resource in the namespaces with labels matched by the namespace selector
      spec:
        ingress:
        - from:
          - podSelector: {}
        podSelector:
          matchLabels: null

    為 Config Sync 建立機群層級預設值

    在本節中,您將建立 Config Sync 的機群層級預設值,這會將相同的 Config Sync 設定套用至機群中建立的所有叢集。

    如要為 Config Sync 建立機群層級的預設設定,請完成下列步驟:

    1. 為機群預設設定 Terraform 檔案建立目錄。 將 main.tf 檔案和 variables.tf 檔案新增至該目錄。

    2. variables.tf 檔案中新增下列變數:

      variable "project" {
        type = string
        description = "GCP project ID"
      }

    3. 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 {
        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 = "1.17.0" # Use the default latest version; if specifying a version, it must be at or after 1.17.0
            config_sync {
              source_format = "unstructured"
              git {
                sync_repo = "https://github.com/GoogleCloudPlatform/anthos-config-management-samples"
                sync_branch = "main"
                policy_dir = "fleet-tenancy/config"
                secret_type = "none"
              }
            }
          }
        }
      }
    4. 在您建立的目錄中初始化 Terraform:

      terraform init
      
    5. 確認您透過 Terraform 提議的變更符合預期計畫:

      terraform plan
      
    6. 建立預設機群成員設定:

      terraform apply
      

    在機群中建立叢集

    在本節中,您將建立共用叢集設定,然後在機群中建立叢集。

    如要建立新叢集並註冊至機群,請完成下列步驟:

    1. 為叢集設定 Terraform 檔案建立目錄。 將 main.tf 檔案和 variables.tf 檔案新增至該目錄。

    2. variables.tf 檔案中新增下列變數:

      variable "project" {
        type = string
        description = "GCP project ID"
      }

    3. 建立 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
      }
      
    4. 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_NAMECLUSTER_NAME 可以是相同的值,例如 us-east-cluster
      • CLUSTER_CONFIGURATION_FILEPATH:您建立的 cluster.tf 檔案的相對路徑。
      • CLUSTER_NAME:叢集名稱。MODULE_NAMECLUSTER_NAME 可以是相同的值,例如 us-east-cluster
      • CLUSTER_LOCATION:叢集位置,例如 us-east1

      您可以視需要建立多個叢集,數量不限。舉例來說,下列 main.tf 檔案會在不同區域建立 3 個叢集:

      terraform {
        required_providers {
          google = {
            source = "hashicorp/google"
            version = ">= 5.16.0"
          }
        }
      }
      
      provider "google" {
        project = var.project
      }
      
      module "us-west-cluster" {
        source = "./cluster"
        cluster_name = "us-west-cluster"
        location="us-west1-a"
      }
      
      module "us-east-cluster" {
        source = "./cluster"
        cluster_name = "us-east-cluster"
        location="us-east1-b"
      }
      
      module "us-central-cluster" {
        source = "./cluster"
        cluster_name = "us-central-cluster"
        location="us-central1-c"
      }
    5. 在您建立的目錄中初始化 Terraform:

      terraform init
      
    6. 確認您透過 Terraform 提議的變更符合預期計畫:

      terraform plan
      
    7. 建立叢集:

      terraform apply
      

    設定團隊範圍和機群命名空間

    在本節中,您將建立團隊範圍,並將叢集與這些範圍建立關聯。然後在每個範圍中建立所需的機群命名空間 (例如每個團隊各一個),Config Sync 就會在命名空間中建立資源。

    如要設定團隊範圍和命名空間,請完成下列步驟:

    1. 為團隊範圍和命名空間設定 Terraform 檔案建立目錄。 將 main.tf 檔案和 variables.tf 檔案新增至該目錄。

    2. variables.tf 檔案中新增下列變數:

      variable "project" {
        type = string
        description = "GCP project ID"
      }
      

    3. main.tf 檔案中新增下列資源:

      1. 新增供應商資訊:

        terraform {
          required_providers {
            google = {
              source = "hashicorp/google"
              version = ">=5.16.0"
             }
           }
         }
        
        provider "google" {
          project = var.project
        }
        
      2. 新增團隊範圍資源:

        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_scope" "scope" {
          provider = google
          for_each = toset([
            "backend",
            "frontend",
          ])
          scope_id = each.value
        }
      3. 針對要套用至團隊範圍的每個叢集,新增車隊成員資格繫結:

        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-east1us-west1us-central1 區域中有三個叢集,但 us-central1 叢集僅供前端團隊使用,您的成員資格繫結資源會類似於下列內容:

        resource "google_gke_hub_membership_binding" "membership-binding" {
          provider = google
          for_each = {
            us-east-backend = {
              membership_binding_id = "us-east-backend"
              scope = google_gke_hub_scope.scope["backend"].name
              membership_id = "us-east-cluster"
              location = "us-east1"
            }
            us-west-backend = {
              membership_binding_id = "us-west-backend"
              scope = google_gke_hub_scope.scope["backend"].name
              membership_id = "us-west-cluster"
              location = "us-west1"
            }
            us-east-frontend = {
              membership_binding_id = "us-east-frontend"
              scope = google_gke_hub_scope.scope["frontend"].name
              membership_id = "us-east-cluster"
              location = "us-east1"
            }
            us-west-frontend = {
              membership_binding_id = "us-west-frontend"
              scope = google_gke_hub_scope.scope["frontend"].name
              membership_id = "us-west-cluster"
              location = "us-west1"
            }
            us-central-frontend = {
              membership_binding_id = "us-central-frontend"
              scope = google_gke_hub_scope.scope["frontend"].name
              membership_id = "us-central-cluster"
              location = "us-central1"
            }
          }
        
          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]
        }
      4. 新增要為團隊定義的命名空間:

        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 的值相同。

        舉例來說,如果您希望前端和後端團隊各有兩個命名空間,機群命名空間資源可能如下所示:

        resource "google_gke_hub_namespace" "fleet_namespace" {
          provider = google
        
          for_each = {
            bookstore = {
              scope_id = "backend"
              scope_namespace_id = "bookstore"
              scope = google_gke_hub_scope.scope["backend"].name
            }
            shoestore = {
              scope_id = "backend"
              scope_namespace_id = "shoestore"
              scope = google_gke_hub_scope.scope["backend"].name
            }
            frontend_a = {
              scope_id = "frontend"
              scope_namespace_id = "frontend-a"
              scope = google_gke_hub_scope.scope["frontend"].name
            }
            frontend_b = {
              scope_id = "frontend"
              scope_namespace_id = "frontend-b"
              scope = google_gke_hub_scope.scope["frontend"].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]
        }
    4. 在您建立的目錄中初始化 Terraform:

      terraform init
      
    5. 確認您透過 Terraform 提議的變更符合預期計畫:

      terraform plan
      
    6. 建立機群範圍和命名空間:

      terraform apply
      

    建立機群範圍和命名空間後,Config Sync 會偵測到這些新的命名空間及其範圍,選取機群命名空間中的資源,並與設定檔進行比對。

    您可以使用 nomos status 檢查資源是否已套用至正確的叢集,也可以前往 Google Cloud 控制台的 Config Sync「套件」分頁,將「查看依據」單選按鈕變更為「叢集」

    前往「Packages」(套件) 頁面

    Config Sync 會根據團隊範圍,按照可靠來源中儲存的設定,在命名空間之間同步處理資源。只要您加入新資源時包含正確的 NamespaceSelector 註解,Config Sync 就會自動在團隊命名空間中調解該資源。

    如要將 Config Sync 設定套用至現有叢集,請參閱 Config Sync 安裝指南中的設定機群層級預設值操作說明。

    後續步驟