Fleet 전반에서 팀 리소스 관리

이 페이지에서는 구성 동기화 및 Terraform을 사용하여 클러스터 Fleet 전반에 팀 범위 리소스를 동적으로 만드는 방법을 설명합니다. 구성 동기화는 Fleet 팀 관리 기능을 확장하여 Fleet 전반에서 인프라 및 클러스터 구성을 만들고 관리합니다.

이 가이드에서는 사용자가 팀 범위 및 Fleet 네임스페이스와 같은 Fleet 팀 관리 개념에 이미 익숙하다고 가정합니다. 자세한 내용은 Fleet 팀 관리 개요를 참조하세요.

샘플 구성이 포함된 엔드 투 엔드 튜토리얼의 경우 샘플 저장소에서 Fleet 테넌시 튜토리얼을 참조하세요.

Terraform에서 구성 동기화에 지원되는 필드 목록은 GKE Fleet 기능에 대한 Terraform 참고 문서를 참조하세요.

워크플로 예시

서로 다른 여러 팀의 요구사항이 다른 클러스터의 Fleet 전반에서 동적으로 리소스를 생성하려는 플랫폼 관리자입니다. 예를 들어 NetworkPolicy를 백엔드팀의 네임스페이스에 적용하지만 프런트엔드팀의 네임스페이스에는 적용하지 않을 수 있습니다. 이 시나리오에서 네임스페이스 전체에 팀 범위 리소스를 만드는 절차는 다음과 같습니다.

  1. 팀의 리소스를 관리할 Fleet을 선택하거나 만듭니다.
  2. 정보 소스를 설정합니다. 정보 소스에는 팀 범위에서 Fleet 수준 네임스페이스를 선택하는 데 사용하는 NamespaceSelector 객체와 이러한 네임스페이스 간에 동기화하려는 모든 리소스(예: NetworkPolicy)가 포함됩니다.
  3. 구성 동기화에 대한 Fleet 수준 기본 구성을 만듭니다. 구성 동기화는 이전 단계에서 만든 정보 소스에서 동기화할 때 이러한 기본 설정을 사용합니다. 이러한 구성 동기화 설정은 Fleet에서 생성된 모든 새 클러스터에 적용됩니다.

  4. Fleet에 클러스터를 만듭니다.

  5. 구성 동기화가 네임스페이스의 리소스를 감지하고 조정할 수 있도록 프런트엔드 및 백엔드 팀 범위와 네임스페이스를 만듭니다.

이 단계를 완료하면 구성 동기화는 NamespaceSelector를 기준으로 NetworkPolicy를 만들어 백엔드팀의 네임스페이스에 적용합니다. 리소스를 변경하거나 추가하는 경우 구성 동기화는 구성 파일, 팀 범위, Fleet 네임스페이스, Fleet 멤버에 대한 변경사항을 지속적으로 감지하고 적용합니다.

가격 책정

구성 동기화 및 Fleet 팀 관리 기능은 GKE Enterprise를 사용 설정한 사용자에게만 제공됩니다. GKE Enterprise 가격 책정에 대한 자세한 내용은 GKE 가격 책정 페이지를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud CLI를 설치합니다.
  3. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  4. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  8. 구성 파일을 저장할 수 있는 정보 소스(Git 저장소 또는 OCI 이미지)를 만들거나 액세스합니다. 이 가이드의 예시에서는 Git 저장소를 사용합니다.

필요한 역할

Fleet의 팀 리소스를 만드는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대해 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.

사용자 인증 정보 가져오기

로컬 환경에서 이 가이드의 Terraform 명령어를 실행하려면 다음 명령어를 실행하여 새 사용자 인증 정보를 가져옵니다.

gcloud auth application-default login

Fleet 설정

이 섹션에서는 Fleet을 만들고 필요한 서비스를 사용 설정합니다.

Fleet을 설정하려면 다음 단계를 완료합니다.

  1. Fleet 구성 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를 Fleet을 만들려는 프로젝트 ID로 바꿉니다.

  5. 생성한 디렉터리에서 Terraform을 초기화합니다.

    terraform init
    
  6. Terraform으로 제안한 변경사항이 예상 계획과 일치하는지 확인합니다.

    terraform plan
    
  7. Fleet을 만들고, API를 사용 설정하고, 서비스 계정을 만듭니다.

    terraform apply
    

    경우에 따라 모든 서비스를 사용 설정하는 데 몇 분 정도 걸릴 수 있습니다.

정보 소스 설정

이 섹션에서는 정보 소스에 구성 파일을 추가합니다. 사용할 각 팀 범위에 대해 NamespaceSelector 객체가 필요합니다. 예를 들어 프런트엔드팀과 백엔드팀이 있으면 각 팀에 대해 NamespaceSelector 객체를 만들어야 합니다. NamespaceSelector 객체는 팀 범위 내의 네임스페이스 전체 또는 일부를 선택합니다. NetworkPolicy와 같이 정보 소스에 팀 리소스를 추가할 수 있습니다. 이러한 리소스를 만들 때는 구성 동기화가 해당 리소스를 네임스페이스 전반에 동적으로 배포하고 동기화할 수 있도록 NamespaceSelector를 참조합니다.

정보 소스를 설정하려면 다음 단계를 완료하세요.

  1. 정보 소스에서 구성 동기화를 동기화할 구성 파일의 디렉터리를 만듭니다.

  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 네임스페이스의 일부인 모든 네임스페이스에는 자동으로 fleet.gke.io/fleet-scope: SCOPE_NAME 라벨이 포함됩니다. NamespaceSelector는 해당 라벨을 사용하여 팀 범위의 모든 Fleet 네임스페이스를 선택합니다. 네임스페이스를 포함하거나 제외하는 방법에 대한 더 많은 예시는 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

구성 동기화의 Fleet 수준 기본값 만들기

이 섹션에서는 구성 동기화의 Fleet 수준 기본값을 만들어 Fleet에서 생성된 모든 클러스터에 동일한 구성 동기화 구성을 적용합니다.

구성 동기화의 Fleet 수준 기본 구성을 만들려면 다음 단계를 완료하세요.

  1. Fleet 기본 구성 Terraform 파일의 디렉터리를 만듭니다. 해당 디렉터리에 main.tf 파일과 variables.tf 파일을 추가합니다.

  2. variables.tf 파일에서 다음 코드를 추가합니다.

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

  3. main.tf 파일에서 다음 리소스를 추가하여 구성 동기화 설정을 구성합니다.

    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: (선택사항) 구성 동기화 버전 번호입니다. 버전 1.17.0 이상으로 설정해야 합니다. 비워두면 기본값이 최신 버전입니다.
    • REPO: 구성 파일이 포함된 저장소의 URL입니다.
    • BRANCH: 저장소 브랜치(예: main)입니다.
    • DIRECTORY: 동기화하려는 저장소의 최상위 수준을 나타내는 Git 저장소 내의 경로입니다.
    • SECRET: 보안 비밀 인증 유형입니다.

    구성 동기화 git 블록에서 지원되는 전체 설정 목록은 GKE 허브 기능에 대한 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: 구성 동기화 버전 번호입니다. 버전 1.17.0 이상으로 설정해야 합니다. 비워두면 기본값이 최신 버전입니다.
    • REPO: 구성 파일이 포함된 OCI 이미지 저장소의 URL입니다.
    • DIRECTORY: 동기화할 리소스가 포함된 디렉터리의 절대 경로입니다. 루트 디렉터리를 사용하려면 비워 둡니다.
    • SECRET: 보안 비밀 인증 유형입니다.

    구성 동기화 oci 블록에서 지원되는 전체 설정 목록은 GKE 허브 기능에 대한 Terraform 참고 문서를 참조하세요.

    예를 들어 다음 main.tf 파일은 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. 기본 Fleet 구성원 구성을 만듭니다.

    terraform apply
    

Fleet에서 클러스터 만들기

이 섹션에서는 공유 클러스터 구성을 만든 다음 Fleet에 클러스터를 만듭니다.

새 클러스터를 만들고 Fleet에 등록하려면 다음 단계를 완료하세요.

  1. 클러스터 구성 Terraform 파일의 디렉터리를 만듭니다. 해당 디렉터리에 main.tf 파일과 variables.tf 파일을 추가합니다.

  2. variables.tf 파일에서 다음 코드를 추가합니다.

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

  3. 프로젝트 및 Fleet ID와 같이 모든 클러스터에서 사용되는 기본값이 포함된 cluster.tf 파일을 만듭니다.

    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
    

팀 범위 및 Fleet 네임스페이스 구성

이 섹션에서는 팀 범위를 만들고 클러스터를 해당 범위와 연결합니다. 그런 다음 각 범위에서 필요한 Fleet 네임스페이스(예: 각 팀마다 하나씩)를 만들면 구성 동기화가 네임스페이스 전반에서 리소스를 생성합니다.

팀 범위 및 네임스페이스를 구성하려면 다음 단계를 완료합니다.

  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 네임스페이스가 생성되면 네임스페이스에 fleet.gke.io/fleet-scope: SCOPE_NAME으로 라벨이 자동 지정되므로 구성 동기화에서 Kubernetes 리소스를 동기화할 때 존재하는 NamespaceSelector 라벨을 기준으로 네임스페이스를 선택할 수 있습니다.

      예를 들어 프런트엔드팀과 백엔드팀 모두에 대한 범위가 포함된 팀 범위 Terraform 리소스는 다음과 유사할 수 있습니다.

      resource "google_gke_hub_scope" "scope" {
        provider = google
        for_each = toset([
          "backend",
          "frontend",
        ])
        scope_id = each.value
      }
    3. 팀 범위에 적용하려는 각 클러스터에 대해 Fleet 멤버십 바인딩을 추가합니다.

      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).

      각 클러스터에 대한 Fleet 멤버십 바인딩을 정의해야 합니다. 클러스터의 팀 범위를 정의하지 않으면 해당 네임스페이스에 대해 클러스터가 생성되지 않습니다. 예를 들어 us-east1, us-west1, us-central1 리전에 3개의 클러스터가 있지만 us-central1 클러스터가 Frontend 팀 전용인 경우 멤버십 바인딩 리소스는 다음과 유사합니다.

      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과 동일할 수 있습니다.

      예를 들어 프런트엔드 팀과 백엔드 팀에 각각 두 개의 네임스페이스가 있게 하려면 Fleet 네임스페이스 리소스가 다음과 유사할 수 있습니다.

      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. Fleet 범위 및 네임스페이스를 만듭니다.

    terraform apply
    

Fleet 범위 및 네임스페이스를 만든 후 구성 동기화는 해당 새 네임스페이스와 해당 범위를 감지하고, Fleet 네임스페이스에서 리소스를 선택하고, 이를 구성 파일과 조정합니다.

nomos status를 사용하거나 Google Cloud 콘솔의 구성 동기화 패키지 탭으로 이동하여 보기 기준 라디오 버튼을 클러스터로 변경하여 리소스가 올바른 클러스터에 적용되었는지 확인할 수 있습니다.

패키지로 이동

구성 동기화는 정보 소스에 저장된 구성에 따라 팀 범위를 기준으로 네임스페이스 간에 리소스를 동기화합니다. 올바른 NamespaceSelector 주석을 포함하는 한 새 리소스를 추가할 때마다 구성 동기화가 팀 네임스페이스 전반에서 해당 리소스를 자동으로 조정합니다.

기존 클러스터에 구성 동기화 설정을 적용하려면 구성 동기화 설치 가이드의 Fleet 수준 기본값 구성 안내를 참조하세요.

다음 단계