管理機群中的團隊資源

本頁說明如何使用 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 會持續偵測並將任何變更套用至設定檔、團隊範圍、機群命名空間和機群成員。

定價

Config Sync 和機群團隊管理功能是 GKE 的一部分。如要進一步瞭解定價,請參閱 GKE 定價頁面。

事前準備

  1. 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,能用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 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 專案名稱。

  6. 安裝 Google Cloud CLI。

  7. 如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  8. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  9. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 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 專案名稱。

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

必要的角色

如要取得建立車隊團隊資源所需的權限,請要求管理員在專案中授予您下列 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_NAME:NamespaceSelector 物件的名稱,例如 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_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 {
      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-east1、us-west1 和 us-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」套件分頁,然後將「View by」(依據檢視) 圓形按鈕變更為「Cluster」(叢集)。

前往「Packages」(套件) 頁面

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

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

後續步驟