본문 바로가기

개발하자

Terraform에서 GKE 노드에 대한 네트워크 태그를 생성하는 방법

반응형

Terraform에서 GKE 노드에 대한 네트워크 태그를 생성하는 방법

이후 Terraform에서 GCP 네트워크와 GKE 모듈을 활용하여 VPC와 GKE 클러스터를 구축하고 있습니다. 이제 대상을 GKE 노드로 하는 방화벽 규칙을 생성하려고 합니다. GCP가 이름을 지정하는 데 사용하는 형식으로 자동 생성된 기존 방화벽 규칙을 업데이트하고 싶지 않습니다. 이로 인해 논리가 실패할 수 있습니다. 그렇기 때문에 GKE 노드를 가리키는 별도의 네트워크 태그와 함께 별도의 방화벽 규칙을 만들어야 합니다. 모듈 정보

VPC

module "vpc" {
  source       = "terraform-google-modules/network/google"
  #version      = "~> 2.5"
  project_id   = var.project_id
  network_name = "${var.project_name}-${var.env_name}-vpc"
  subnets = [
    {
      subnet_name   = "${var.project_name}-${var.env_name}-subnet"
      subnet_ip     = "${var.subnetwork_cidr}"
      subnet_region = var.region
    }
  ]
  secondary_ranges = {
    "${var.project_name}-${var.env_name}-subnet" = [
      {
        range_name    = "${var.project_name}-gke-pod-ip-range"
        ip_cidr_range = "${var.ip_range_pods_cidr}"
      },
      {
        range_name    = "${var.project_name}-gke-service-ip-range"
        ip_cidr_range = "${var.ip_range_services_cidr}"
      }
    ]
  }
}

GKE_클러스터

module "gke" {
  source                 = "terraform-google-modules/kubernetes-engine/google//modules/beta-private-cluster"
  project_id             = var.project_id
  name                   = "${var.project_name}-gke-${var.env_name}-cluster"
  regional               = true
  region                 = var.region
  zones                  = ["${var.region}-a", "${var.region}-b", "${var.region}-c"]
  network                = module.vpc.network_name
  subnetwork             = module.vpc.subnets_names[0]
  ip_range_pods          = "${var.project_name}-gke-pod-ip-range"
  ip_range_services      = "${var.project_name}-gke-service-ip-range"
  http_load_balancing        = false
  network_policy             = false
  horizontal_pod_autoscaling = true
  filestore_csi_driver       = false
  enable_private_endpoint    = false
  enable_private_nodes       = true
  master_ipv4_cidr_block     = "${var.control_plane_cidr}"
  istio                      = false
  cloudrun                   = false
  dns_cache                  = false
  node_pools = [
    {
      name                      = "${var.project_name}-gke-node-pool"
      machine_type              = "${var.machine_type}"
      node_locations            = "${var.region}-a,${var.region}-b,${var.region}-c"
      min_count                 = "${var.node_pools_min_count}"
      max_count                 = "${var.node_pools_max_count}"
      disk_size_gb              = "${var.node_pools_disk_size_gb}"
    #   local_ssd_count           = 0
    #   spot                      = false
    #   local_ssd_ephemeral_count = 0
    #   disk_type                 = "pd-standard"
    #   image_type                = "COS_CONTAINERD"
    #   enable_gcfs               = false
      auto_repair               = true
      auto_upgrade              = true
    #   service_account           = "project-service-account@<PROJECT ID>.iam.gserviceaccount.com"
      preemptible               = false
    #   initial_node_count        = 80
    }
  ]

  # node_pools_tags = {
  #   all = []

  #   default-node-pool = ["default-node-pool",]
  # }
}

방화벽

module "firewall_rules" {
  source       = "terraform-google-modules/network/google//modules/firewall-rules"
  project_id   = var.project_id
  network_name = module.vpc.network_name

  rules = [{
    name                    = "allow-istio-ingress"
    description             = null
    direction               = "INGRESS"
    priority                = null
    ranges                  = ["${var.control_plane_cidr}"]
    source_tags             = null
    source_service_accounts = null
    target_tags             = null
    target_service_accounts = null
    allow = [{
      protocol = "tcp"
      ports    = ["15017"]
    }]
    deny = []
    log_config = {
      metadata = "INCLUDE_ALL_METADATA"
    }
  }]

  depends_on = [module.gke]
}

비록 GKE 모듈이 태그를 명시적으로 정의하기 위한 태그 속성을 가지고 있지만, 우리는 그것을 적절하게 인스턴스화한 다음 방화벽 모듈에서 동일한 태그 값을 가져오기 위한 지원이 여전히 필요하다.




나는 이전에 게시된 내 질문에 대한 실용적인 해결책을 찾았다. GKE 모듈 스니펫을 참조하십시오. 이 경우 아래 부분만 수정하면 해당 노드 풀의 모든 노드를 가리키는 명시적 네트워크 태그가 생성됩니다.

module "gke" {
  .
  .
  node_pools = [
    {
      name = "gke-node-pool"
      .
      .
      .
    },
  ]

  node_pools_tags = {
    "gke-node-pool" = "gke-node-pool-network-tag"
  }
}



공급자의 리소스()를 사용하는 경우 다음과 같은 작업을 수행하여 노드에 네트워크 태그를 지정할 수 있습니다:


resource "google_container_node_pool" "some_node_pool" {
  name       = "my-node-pool"
  .
  .
  .

  node_config {
    tags = "gke-node-pool-network-tag"
  }
}

반응형