管理機群中的團隊資源

本頁面說明如何使用 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_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」(套件) 分頁,然後將「View by」(依據檢視) 單選按鈕變更為「Cluster」(叢集)

前往「Packages」(套件) 頁面

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

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

後續步驟