태그를 사용한 GKE 리소스 관리


이 페이지에서는 태그를 사용하여 Google Kubernetes Engine(GKE) 클러스터를 관리하고 Identity and Access Management 정책을 노드에 조건부로 적용하는 방법을 보여줍니다.

개요

태그는 조직 또는 프로젝트 수준에서 Google Cloud 리소스에 주석을 추가하고 관리할 수 있게 해주는 키-값 쌍입니다. 태그를 사용하여 리소스를 정리하고 방화벽 또는 IAM 정책과 같은 정책을 조건부로 적용할 수 있습니다. 태그는 태그를 연결, 생성, 업데이트 또는 삭제할 수 있는 사용자를 정의할 수 있는 IAM 액세스 제어를 지원합니다.

GKE의 태그 사용 사례

다음과 같은 상황에서 GKE에서 태그를 사용할 수 있습니다.

  • 특정 노드에 네트워크 방화벽 정책을 조건부로 적용합니다. 예를 들어 공개 인터넷에서 스테이징 또는 테스트 환경에 있는 한 클러스터의 모든 노드로 전송되는 인그레스 트래픽을 거부합니다. 자세한 내용은 GKE에서 선택적으로 네트워크 방화벽 정책 적용을 참조하세요.
  • 태그를 기반으로 IAM 역할을 조건부로 부여합니다. 예를 들어 일반적으로 정규직 직원만 사용할 수 있는 특정 환경에 대한 액세스 권한을 계약업체에 자동으로 부여합니다. 자세한 내용은 이 문서의 나머지 부분을 참조하세요.
  • 프로젝트 또는 조직 수준에서 적용된 태그를 기반으로 결제 정보를 감사하고 분석합니다.

작동 방식

특히 네트워크 방화벽 정책 적용의 경우 태그를 만들고 방화벽 사용을 위해 태그를 명시적으로 지정합니다. 다른 모든 용도에서는 방화벽 지정을 설정하지 않고 태그를 만듭니다.

태그를 만든 후에는 GKE 리소스에 태그를 키-값 쌍으로 연결합니다. 네트워크 방화벽 정책의 경우 GKE API를 사용하고 다른 모든 용도에서는 Tags API를 사용합니다.

각 키에 대해 하나의 값을 하나의 리소스에 연결할 수 있습니다. 예를 들어 env:dev를 GKE 클러스터에 연결한 경우 env:prod 또는 env:test도 연결할 수 없습니다. 각 리소스에 최대 50개의 비방화벽 태그와 최대 5개의 방화벽 태그를 연결할 수 있습니다.

GKE의 리소스 주석 추가 방법

GKE에는 다음 표에 설명된 대로 리소스에 주석을 다는 여러 가지 방법이 있습니다.

특수효과 유형 설명
태그(비방화벽)
  • Tags API를 사용하여 클러스터 리소스에 적용합니다.
  • 리소스를 구성하여 사용량과 청구를 추적합니다.
  • IAM 정책을 조건부로 적용합니다.
  • IAM으로 특정 태그에 대한 액세스를 제어합니다.

자세한 내용은 태그 개요를 참조하세요.

특정 태그가 있는 리소스에 대한 액세스를 제어하는 IAM 역할을 조건부로 부여합니다.
태그(방화벽)
  • GKE API를 사용하여 클러스터 또는 노드 풀에 적용합니다.
  • Cloud Next Generation Firewall 네트워크 방화벽 정책을 조건부로 적용합니다.
  • IAM으로 특정 태그에 대한 액세스를 제어합니다.
  • GKE가 키-값 쌍을 기본 Compute Engine VM에 연결합니다.

자세한 내용은 GKE에서 선택적으로 네트워크 방화벽 정책 적용을 참조하세요.

공개 인터넷에서 모든 스테이징 또는 테스트 환경으로 전송되는 인그레스 트래픽을 자동으로 거부합니다.
네트워크 태그
  • GKE API를 사용하여 클러스터 또는 노드 풀에 적용합니다.
  • IAM 액세스 제어가 없는 단순 문자열
  • VPC 방화벽 규칙을 조건부로 적용하는 데 사용합니다.
  • GKE가 키-값 쌍을 기본 Compute Engine VM에 연결합니다.

자세한 내용은 네트워크 태그를 사용해 노드에 방화벽 규칙 적용하기를 참조하세요.

공개 인터넷에서 모든 스테이징 또는 테스트 환경으로 전송되는 인그레스 트래픽을 자동으로 거부합니다.
GKE 클러스터 라벨
  • GKE API를 사용하여 클러스터 또는 노드 풀에 적용합니다.
  • 리소스를 구성하여 사용량과 청구를 추적합니다.

자세한 내용은 클러스터 라벨을 참조하세요.

조직의 특정 비용 센터 또는 팀이 소유한 클러스터를 구분합니다.
Kubernetes 라벨
  • Kubernetes API 객체에 적용합니다.
  • 클러스터 구성요소 및 리소스를 서로 연결하고 리소스 수명 주기를 관리합니다.

자세한 내용은 Kubernetes 라벨 및 선택기를 참조하세요.

워크로드가 특정 라벨로 노드에 예약되어야 합니다.

시작하기 전에

시작하기 전에 다음 태스크를 수행했는지 확인합니다.

  • Google Kubernetes Engine API를 사용 설정합니다.
  • Google Kubernetes Engine API 사용 설정
  • 이 태스크에 Google Cloud CLI를 사용하려면 gcloud CLI를 설치한 후 초기화합니다. 이전에 gcloud CLI를 설치한 경우 gcloud components update를 실행하여 최신 버전을 가져옵니다.

클러스터에 태그 연결

올바른 권한이 있으면 Google Cloud CLI, Google Cloud 콘솔, Tags API, Terraform을 사용하여 기존 클러스터에 태그를 연결할 수 있습니다.

gcloud

gcloud CLI를 사용하여 GKE 리소스에 태그를 연결하려면 먼저 태그를 만들고 값을 구성해야 합니다. 태그 키와 값을 만들려면 태그 만들기태그 값 추가를 참조하세요.

태그를 클러스터에 연결하기 위해 태그 바인딩을 만들려면 다음 명령어를 실행합니다.

gcloud alpha resource-manager tags bindings create \
    --tag-value=TAG_VALUE_ID \
    --parent=RESOURCE_ID \
    --location=CLUSTER_LOCATION

다음을 바꿉니다.

  • TAG_VALUE_ID: 연결할 태그 값의 영구 ID 또는 네임스페이스화된 이름. 예를 들면 tagValues/4567890123입니다. 태그 식별자에 대한 자세한 내용은 태그 정의 및 식별자를 참조하세요.
  • CLUSTER_LOCATION: Compute Engine 위치. 영역 클러스터의 경우 컴퓨팅 영역을 지정합니다.
  • RESOURCE_ID: 클러스터의 전체 리소스 이름(예: //container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME).

    리소스 ID에서 각 항목의 의미는 다음과 같습니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID
    • CLUSTER_NAME: 클러스터 이름

콘솔

Google Cloud 콘솔을 사용하여 GKE 리소스에 태그를 연결하려면 먼저 태그를 만들고 값을 구성해야 합니다. 태그 키와 값을 만들려면 태그 만들기태그 값 추가를 참조하세요.

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.

  3. 메타데이터 섹션에서 태그 옆의 태그 수정을 클릭합니다.

  4. 조직이 태그 패널에 표시되지 않으면 범위 선택을 클릭합니다. 조직을 선택하고 열기를 클릭합니다.

  5. 태그 패널에서 태그 추가를 선택합니다.

  6. 목록에서 연결할 태그의 키를 선택합니다. 키워드를 입력하여 목록을 필터링할 수 있습니다.

  7. 목록에서 연결할 태그의 값을 선택합니다. 키워드를 입력하여 목록을 필터링할 수 있습니다.

  8. 저장을 클릭합니다.

  9. 확인 대화상자에서 확인을 클릭하여 태그를 연결합니다.

    태그가 업데이트되었음을 확인하는 알림이 표시됩니다.

API

리소스에 태그를 연결하려면 먼저 태그 값과 리소스의 영구 ID가 포함된 태그 binding의 JSON 표현을 만들어야 합니다. 태그 binding의 형식에 대한 자세한 내용은 TagBinding 참조를 확인하세요.

클러스터가 있는 리전 또는 영역 엔드포인트에서 tagBindings.create 메서드를 사용합니다.

POST https://LOCATION-cloudresourcemanager.googleapis.com/v3/tagBindings

LOCATION을 클러스터가 있는 리전 또는 영역으로 바꿉니다.

JSON 요청 본문:

{
  "parent": "RESOURCE_ID",
  "tagValue": "TAG_VALUE_ID"
}

다음을 바꿉니다.

  • RESOURCE_ID: 클러스터의 전체 리소스 이름(예: //container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME)

    리소스 ID에서 각 항목의 의미는 다음과 같습니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID
    • CLUSTER_NAME: 클러스터 이름
  • TAG_VALUE_ID: 연결할 태그 값의 영구 ID 또는 네임스페이스화된 이름. 예를 들면 tagValues/4567890123입니다. 태그 식별자에 대한 자세한 내용은 태그 정의 및 식별자를 참조하세요.

출력은 다음과 비슷합니다.

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.resourcemanager.v3.TagBinding",
    "name": "tagBindings///container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME/tagValues/TAG_VALUE_ID",
    "parent": "//container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME",
    "tagValue": "TAG_VALUE_ID"
  }
}

Terraform

Terraform을 사용하여 태그를 만들고, 값을 구성하고, 태그를 리소스에 연결하려면 다음 예시를 참조하세요.

resource "google_container_cluster" "default" {
  name     = "gke-autopilot-tag"
  location = "us-central1"

  enable_autopilot = true

  # Set `deletion_protection` to `true` will ensure that one cannot
  # accidentally delete this instance by use of Terraform.
  deletion_protection = false
}

data "google_project" "default" {}

resource "google_tags_tag_key" "default" {
  parent      = "projects/${data.google_project.default.project_id}"
  short_name  = "env"
  description = "Environment tag key"
}

resource "google_tags_tag_value" "default" {
  parent      = "tagKeys/${google_tags_tag_key.default.name}"
  short_name  = "dev"
  description = "Development environment tag value."
}

resource "google_tags_location_tag_binding" "default" {
  parent    = "//container.googleapis.com/${google_container_cluster.default.id}"
  location  = google_container_cluster.default.location
  tag_value = "tagValues/${google_tags_tag_value.default.name}"
}

Terraform 사용에 대한 자세한 내용은 GKE에 대한 Terraform 지원을 참조하세요.

클러스터에 연결된 태그 나열

gcloud CLI, Google Cloud 콘솔, Tags API를 사용하여 클러스터에 연결된 태그를 나열할 수 있습니다.

gcloud

클러스터에 연결된 태그 바인딩 목록을 가져오려면 다음 명령어를 실행합니다.

gcloud alpha resource-manager tags bindings list \
    --parent=RESOURCE_ID \
    --location=CLUSTER_LOCATION

다음을 바꿉니다.

  • CLUSTER_LOCATION: 리전 클러스터의 경우 컴퓨팅 리전 지정. 영역 클러스터의 경우 컴퓨팅 영역을 지정합니다.

  • RESOURCE_ID: 클러스터의 전체 리소스 이름(예: //container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME)

    리소스 ID에서 각 항목의 의미는 다음과 같습니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID

    • CLUSTER_NAME: 클러스터 이름

콘솔

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 보려는 클러스터의 이름을 클릭합니다.

  3. 메타데이터 섹션의 태그 옆에서 현재 연결된 태그 값을 찾습니다.

API

클러스터의 태그 바인딩 목록을 가져오려면 클러스터가 있는 리전 또는 영역 엔드포인트와 함께 tagBindings.list 메서드를 사용합니다.

GET https://LOCATION-cloudresourcemanager.googleapis.com/v3/tagBindings

JSON 요청 본문:

{
  "parent": RESOURCE_ID,
}

다음을 바꿉니다.

  • RESOURCE_ID: 클러스터의 전체 리소스 이름(예: //container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME)

    리소스 ID에서 각 항목의 의미는 다음과 같습니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID
    • CLUSTER_NAME: 클러스터 이름

출력은 다음과 비슷합니다.

"tagBindings": [
  {
    "name": "tagBindings/%2F%2Fcontainer.googleapis.com%2Fprojects%2Ftags-bugbash-project%2Flocations%2LOCATION%2Fclusters%2Ftestcluster/tagValues/758072120217",
    "parent": "//container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/clusters/CLUSTER_NAME",
    "tagValue": "TAG_VALUE_ID"
  }
]

클러스터에서 태그 분리

gcloud CLI, Google Cloud 콘솔 또는 Tags API를 사용하여 클러스터에 연결된 태그 바인딩 리소스를 삭제하여 클러스터에서 태그를 분리할 수 있습니다. 태그를 삭제해야 하는 경우 먼저 모든 연결된 리소스에서 분리해야 합니다.

gcloud

클러스터에 연결된 태그 바인딩을 분리하려면 다음 명령어를 실행합니다.

gcloud alpha resource-manager tags bindings delete \
    --tag-value=TAG_VALUE_ID \
    --parent=RESOURCE_ID \
    --location=CLUSTER_LOCATION

다음을 바꿉니다.

  • TAG_VALUE_ID: 분리할 태그 값의 영구 ID 또는 네임스페이스화된 이름. 예를 들면 tagValues/4567890123입니다. 태그 식별자에 대한 자세한 내용은 태그 정의 및 식별자를 참조하세요.

  • CLUSTER_LOCATION: 리전 클러스터의 경우 컴퓨팅 리전. 지정 영역 클러스터의 경우 컴퓨팅 영역을 지정합니다.

  • RESOURCE_ID: 클러스터의 전체 리소스 이름(예: //container.googleapis.com/projects/PROJECT_ID/locations/CLUSTER_LOCATION/clusters/CLUSTER_NAME)

    리소스 ID에서 각 항목의 의미는 다음과 같습니다.

    • PROJECT_ID: Google Cloud 프로젝트 ID

    • CLUSTER_NAME: 클러스터 이름

콘솔

  1. Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.

    Google Kubernetes Engine으로 이동

  2. 클러스터 목록에서 수정하려는 클러스터 이름을 클릭합니다.

  3. 메타데이터 섹션에서 태그 옆의 태그 수정을 클릭합니다.

  4. 태그 패널에서 분리하려는 태그 옆에 있는 항목 삭제를 클릭합니다.

  5. 저장을 클릭합니다.

  6. 확인 대화상자에서 확인을 클릭하여 태그를 분리합니다.

    태그가 업데이트되었음을 확인하는 알림이 표시됩니다.

API

클러스터의 태그 바인딩을 삭제하려면 클러스터가 있는 리전 또는 영역 엔드포인트와 함께 tagBindings.delete 메서드를 사용합니다.

DELETE https://LOCATION-cloudresourcemanager.googleapis.com/v3/TAG_BINDING_NAME

TAG_BINDING_NAME을 분리할 tagBinding 객체의 전체 리소스 이름으로 바꿉니다. 예를 들면 tagBindings/container.googleapis.com/projects/PROJECT_ID/locations/LOCATION/tagValues/TAG_VALUE_ID입니다.

태그 키 및 태그 값 삭제

태그 키와 값을 삭제하기 전에 태그가 모든 리소스에서 분리되었는지 확인합니다. 그런 다음 태그 삭제를 참조하여 키와 값을 삭제합니다.

Identity and Access Management 조건 및 태그

태그와 IAM 조건을 사용하여 프로젝트 계층 구조 내 사용자에게 역할 바인딩을 조건부로 부여할 수 있습니다. 클러스터에 연결된 태그를 변경하거나 삭제할 때 조건부 역할 바인딩이 있는 IAM 허용 정책이 적용된 경우 GKE에서 해당 클러스터에 대한 사용자 액세스를 삭제할 수 있습니다.

GKE 클러스터를 나열하고 만들기 위한 승인은 개별 클러스터 수준이 아닌 프로젝트 수준에서 확인됩니다. 클러스터 수준 태그와 함께 조건부 IAM 역할 바인딩을 사용하여 특정 클러스터에 대한 액세스를 제한하는 경우, 사용자가 프로젝트에서 클러스터를 나열하거나 만들려고 할 때 오류가 발생할 수 있습니다. 이러한 오류를 방지하려면 상위 프로젝트에 태그를 연결하고 조건부 역할 결합을 사용하여 목록을 부여하거나 액세스 권한을 만듭니다. 역할 및 권한에 대한 자세한 내용은 IAM 역할 참조를 확인하세요.

IAM의 조건부 액세스 권한 부여에 대한 자세한 내용은 Identity and Access Management 조건 및 태그를 참조하세요.

다음 단계