이 페이지에서는 구성 동기화 및 Terraform을 사용하여 클러스터 Fleet 전반에 팀 범위 리소스를 동적으로 만드는 방법을 설명합니다. 구성 동기화는 Fleet 팀 관리 기능을 확장하여 Fleet 전반에서 인프라 및 클러스터 구성을 만들고 관리합니다.
이 가이드에서는 사용자가 팀 범위 및 Fleet 네임스페이스와 같은 Fleet 팀 관리 개념에 이미 익숙하다고 가정합니다. 자세한 내용은 Fleet 팀 관리 개요를 참조하세요.
샘플 구성이 포함된 엔드 투 엔드 튜토리얼의 경우 샘플 저장소에서 Fleet 테넌시 튜토리얼을 참조하세요.
Terraform에서 구성 동기화에 지원되는 필드 목록은 GKE Fleet 기능에 대한 Terraform 참고 문서를 참조하세요.
워크플로 예시
서로 다른 여러 팀의 요구사항이 다른 클러스터의 Fleet 전반에서 동적으로 리소스를 생성하려는 플랫폼 관리자입니다. 예를 들어 NetworkPolicy
를 백엔드팀의 네임스페이스에 적용하지만 프런트엔드팀의 네임스페이스에는 적용하지 않을 수 있습니다.
이 시나리오에서 네임스페이스 전체에 팀 범위 리소스를 만드는 절차는 다음과 같습니다.
- 팀의 리소스를 관리할 Fleet을 선택하거나 만듭니다.
- 정보 소스를 설정합니다. 정보 소스에는 팀 범위에서 Fleet 수준 네임스페이스를 선택하는 데 사용하는
NamespaceSelector
객체와 이러한 네임스페이스 간에 동기화하려는 모든 리소스(예:NetworkPolicy
)가 포함됩니다. 구성 동기화에 대한 Fleet 수준 기본 구성을 만듭니다. 구성 동기화는 이전 단계에서 만든 정보 소스에서 동기화할 때 이러한 기본 설정을 사용합니다. 이러한 구성 동기화 설정은 Fleet에서 생성된 모든 새 클러스터에 적용됩니다.
Fleet에 클러스터를 만듭니다.
구성 동기화가 네임스페이스의 리소스를 감지하고 조정할 수 있도록 프런트엔드 및 백엔드 팀 범위와 네임스페이스를 만듭니다.
이 단계를 완료하면 구성 동기화는 NamespaceSelector
를 기준으로 NetworkPolicy
를 만들어 백엔드팀의 네임스페이스에 적용합니다. 리소스를 변경하거나 추가하는 경우 구성 동기화는 구성 파일, 팀 범위, Fleet 네임스페이스, Fleet 멤버에 대한 변경사항을 지속적으로 감지하고 적용합니다.
가격 책정
구성 동기화 및 Fleet 팀 관리 기능은 GKE Enterprise를 사용 설정한 사용자에게만 제공됩니다. 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.
-
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.
-
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 저장소를 사용합니다.
필요한 역할
Fleet의 팀 리소스를 만드는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대해 다음 IAM 역할을 부여해 달라고 요청하세요.
- Fleet 리소스 관리: Fleet 관리자(이전의 GKE 허브 관리자)(
roles/gkehub.admin
) - GKE 클러스터 만들기: Kubernetes Engine 클러스터 관리자(
roles/container.clusterAdmin
) - GKE Enterprise 사용 설정: 서비스 사용량 관리자(
roles/serviceusage.serviceUsageAdmin
)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
사용자 인증 정보 가져오기
로컬 환경에서 이 가이드의 Terraform 명령어를 실행하려면 다음 명령어를 실행하여 새 사용자 인증 정보를 가져옵니다.
gcloud auth application-default login
Fleet 설정
이 섹션에서는 Fleet을 만들고 필요한 서비스를 사용 설정합니다.
Fleet을 설정하려면 다음 단계를 완료합니다.
Fleet 구성 Terraform 파일의 디렉터리를 만듭니다. 해당 디렉터리에
main.tf
파일과variables.tf
파일을 추가합니다.variables.tf
파일에서 다음 코드를 추가합니다.main.tf
파일에서 다음 코드를 추가합니다.PROJECT_ID 변수를 내보냅니다.
export TF_VAR_project=PROJECT_ID
PROJECT_ID
를 Fleet을 만들려는 프로젝트 ID로 바꿉니다.생성한 디렉터리에서 Terraform을 초기화합니다.
terraform init
Terraform으로 제안한 변경사항이 예상 계획과 일치하는지 확인합니다.
terraform plan
Fleet을 만들고, API를 사용 설정하고, 서비스 계정을 만듭니다.
terraform apply
경우에 따라 모든 서비스를 사용 설정하는 데 몇 분 정도 걸릴 수 있습니다.
정보 소스 설정
이 섹션에서는 정보 소스에 구성 파일을 추가합니다.
사용할 각 팀 범위에 대해 NamespaceSelector
객체가 필요합니다.
예를 들어 프런트엔드팀과 백엔드팀이 있으면 각 팀에 대해 NamespaceSelector
객체를 만들어야 합니다. NamespaceSelector
객체는 팀 범위 내의 네임스페이스 전체 또는 일부를 선택합니다. NetworkPolicy
와 같이 정보 소스에 팀 리소스를 추가할 수 있습니다. 이러한 리소스를 만들 때는 구성 동기화가 해당 리소스를 네임스페이스 전반에 동적으로 배포하고 동기화할 수 있도록 NamespaceSelector
를 참조합니다.
정보 소스를 설정하려면 다음 단계를 완료하세요.
정보 소스에서 구성 동기화를 동기화할 구성 파일의 디렉터리를 만듭니다.
각 팀에 대해 구성 디렉터리에
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
예시를 참조하세요.네임스페이스 간에 동기화할 객체를 만듭니다.
특정 팀에만 객체를 동기화하려면 해당 객체의 메타데이터에 다음 주석을 설정합니다.
annotations: configmanagement.gke.io/namespace-selector: NAMESPACE_SELECTOR_NAME
예를 들어 백엔드팀에 대한
NetworkPolicy
는 다음과 유사합니다.
구성 동기화의 Fleet 수준 기본값 만들기
이 섹션에서는 Fleet에서 만든 모든 클러스터에 동일한 구성 동기화 구성을 적용하는 구성 동기화의 Fleet 수준 기본값을 만듭니다.
구성 동기화의 Fleet 수준 기본 구성을 만들려면 다음 단계를 완료하세요.
Fleet 기본 구성 Terraform 파일의 디렉터리를 만듭니다. 해당 디렉터리에
main.tf
파일과variables.tf
파일을 추가합니다.variables.tf
파일에서 다음 코드를 추가합니다.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
: 구성 파일이 포함된 저장소의 URLBRANCH
: 저장소 브랜치(예: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 이미지 저장소의 URLDIRECTORY
: 동기화할 리소스가 포함된 디렉터리의 절대 경로. 루트 디렉터리를 사용하려면 비워 둡니다.SECRET
: 보안 비밀 인증 유형
구성 동기화
oci
블록에서 지원되는 전체 설정 목록은 GKE 허브 기능에 대한 Terraform 참고 문서를 참조하세요.예를 들어 다음
main.tf
파일은 Git 저장소에서 동기화하도록 구성 동기화를 구성하고config
디렉터리에 있는 모든 객체를 동기화합니다.생성한 디렉터리에서 Terraform을 초기화합니다.
terraform init
Terraform으로 제안한 변경사항이 예상 계획과 일치하는지 확인합니다.
terraform plan
기본 Fleet 구성원 구성을 만듭니다.
terraform apply
Fleet에서 클러스터 만들기
이 섹션에서는 공유 클러스터 구성을 만든 다음 Fleet에 클러스터를 만듭니다.
새 클러스터를 만들고 Fleet에 등록하려면 다음 단계를 완료하세요.
클러스터 구성 Terraform 파일의 디렉터리를 만듭니다. 해당 디렉터리에
main.tf
파일과variables.tf
파일을 추가합니다.variables.tf
파일에서 다음 코드를 추가합니다.프로젝트 및 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 }
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
팀 범위 및 Fleet 네임스페이스 구성
이 섹션에서는 팀 범위를 만들고 클러스터를 해당 범위와 연결합니다. 그런 다음 각 범위에서 필요한 Fleet 네임스페이스(예: 각 팀마다 하나씩)를 만들면 구성 동기화가 네임스페이스 전반에서 리소스를 생성합니다.
팀 범위 및 네임스페이스를 구성하려면 다음 단계를 완료합니다.
팀 범위 및 네임스페이스 구성 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 네임스페이스가 생성되면 네임스페이스에
fleet.gke.io/fleet-scope: SCOPE_NAME
으로 라벨이 자동 지정되므로 구성 동기화에서 Kubernetes 리소스를 동기화할 때 존재하는NamespaceSelector
라벨을 기준으로 네임스페이스를 선택할 수 있습니다.예를 들어 프런트엔드팀과 백엔드팀 모두에 대한 범위가 포함된 팀 범위 Terraform 리소스는 다음과 유사할 수 있습니다.
팀 범위에 적용하려는 각 클러스터에 대해 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_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 네임스페이스 리소스가 다음과 유사할 수 있습니다.
생성한 디렉터리에서 Terraform을 초기화합니다.
terraform init
Terraform으로 제안한 변경사항이 예상 계획과 일치하는지 확인합니다.
terraform plan
Fleet 범위 및 네임스페이스를 만듭니다.
terraform apply
Fleet 범위 및 네임스페이스를 만든 후 구성 동기화는 해당 새 네임스페이스와 해당 범위를 감지하고, Fleet 네임스페이스에서 리소스를 선택하고, 이를 구성 파일과 조정합니다.
nomos status
를 사용하거나 Google Cloud 콘솔의 구성 동기화 패키지 탭으로 이동하여 보기 기준 라디오 버튼을 클러스터로 변경하여 리소스가 올바른 클러스터에 적용되었는지 확인할 수 있습니다.
구성 동기화는 정보 소스에 저장된 구성에 따라 팀 범위를 기준으로 네임스페이스 간에 리소스를 동기화합니다. 올바른 NamespaceSelector
주석을 포함하는 한 새 리소스를 추가할 때마다 구성 동기화가 팀 네임스페이스 전반에서 해당 리소스를 자동으로 조정합니다.
기존 클러스터에 구성 동기화 설정을 적용하려면 구성 동기화 설치 가이드의 Fleet 수준 기본값 구성 안내를 참조하세요.
다음 단계
- Fleet 팀 설정 자세히 알아보기