본문 바로가기
Kubernetes/Google(GCP)

테라폼(Terraform)을 이용한 GKE 클러스터 생성

by 썩석 2024. 3. 5.
반응형

시작하기 전


API 설정하기

경로: API 및 서비스 - 라이브러리 - Cloud Resource Manager API 검색 - 사용하기

Compute Engine API, Kubernetes Engine API 사용

 

 

 

작업위치: Google Console

 

$ mkdir terraform-gke
$ cd terraform-gke
$ terraform init
  • 테라폼 배포할 폴더 생성
  • 테라폼 폴더로 이동
  • 테라폼 초기화 선언

 

Provider 설정

$ vi provider.tf #테라폼 프로바이더 선택

provider "google" {
  project = "sseokseok" # 프로젝트 ID 입력
  region  = "us-west1" # 배포할 region
}

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 4.0"
    }
  }
}
  • project에는 프로젝트 ID입력
    • 확인방법: gcloud config get project
  • region에는 배포할 Region 입력

 

VPC 생성

$ vpc.tf

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_project_service
resource "google_project_service" "compute" {
  service = "compute.googleapis.com"
}

resource "google_project_service" "container" {
  service = "container.googleapis.com"
}

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_network
resource "google_compute_network" "main" {
  name                            = "main" # VPC 이름
  routing_mode                    = "REGIONAL"
  auto_create_subnetworks         = false
  mtu                             = 1460
  delete_default_routes_on_create = false

  depends_on = [
    google_project_service.compute,
    google_project_service.container
  ]
}

 

 

서브넷 생성

$ subnet.tf

resource "google_compute_subnetwork" "private" {
  name                     = "private" # Subnet 이름
  ip_cidr_range            = "10.0.0.0/18"
  region                   = "us-west1" # Region 설정
  network                  = google_compute_network.main.id
  private_ip_google_access = true

  secondary_ip_range {
    range_name    = "k8s-pod-range"
    ip_cidr_range = "10.48.0.0/14"
  }
  secondary_ip_range {
    range_name    = "k8s-service-range"
    ip_cidr_range = "10.52.0.0/20"
  }
}
  • Region 위치 설정

 

라우터 생성

$ vi router.tf

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_router
resource "google_compute_router" "router" {
  name    = "router" # Router 이름
  region  = "us-west1" # Region 설정
  network = google_compute_network.main.id
}
  • Region 위치 설정

 

NAT 생성

$ vi nat.tf

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_router_nat
resource "google_compute_router_nat" "nat" {
  name   = "nat" #Nat 이름
  router = google_compute_router.router.name
  region = "us-west1"  # Region 설정

  source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
  nat_ip_allocate_option             = "MANUAL_ONLY"

  subnetwork {
    name                    = google_compute_subnetwork.private.id
    source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
  }

  nat_ips = [google_compute_address.nat.self_link]
}

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_address
resource "google_compute_address" "nat" {
  name         = "nat"
  address_type = "EXTERNAL"
  network_tier = "PREMIUM"

  depends_on = [google_project_service.compute]
}

 

방화벽 생성

vi firewall.tf

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_firewall
resource "google_compute_firewall" "allow-ssh" {
  name    = "allow-ssh"
  network = google_compute_network.main.name

  allow {
    protocol = "tcp"
    ports    = ["22"]
  }

  source_ranges = ["0.0.0.0/0"]
}

 

클러스터 생성

$ vi kubernetes.tf

resource "google_container_cluster" "primary" {
  name                     = "primary" # 클러스터 이름
  location                 = "us-west1-b" #Region 설정
  remove_default_node_pool = true
  initial_node_count       = 1
  network                  = google_compute_network.main.self_link
  subnetwork               = google_compute_subnetwork.private.self_link
  logging_service          = "logging.googleapis.com/kubernetes"
  monitoring_service       = "monitoring.googleapis.com/kubernetes"
  networking_mode          = "VPC_NATIVE"

# multi Region 사용시 여러개 사용 가능
  node_locations = [
    "us-west1-b"
  ]
  
  addons_config {
    http_load_balancing {
      disabled = true
    }
    horizontal_pod_autoscaling {
      disabled = false
    }
  }

  release_channel {
    channel = "REGULAR"
  }

  workload_identity_config {
    workload_pool = "sseokseok.svc.id.goog" # 워크로드 이름 설정. 보통 <이름>.svc.id.goog 사용
  }

  ip_allocation_policy {
    cluster_secondary_range_name  = "k8s-pod-range"
    services_secondary_range_name = "k8s-service-range"
  }

  private_cluster_config {
    enable_private_nodes    = true
    enable_private_endpoint = false
    master_ipv4_cidr_block  = "172.16.0.0/28"
  }

}

 

노드 풀 생성

vi nodepool.tf

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/google_service_account
resource "google_service_account" "kubernetes" {
  account_id = "kubernetes"
}

# https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/container_node_pool
resource "google_container_node_pool" "general" {
  name       = "general" # Node Pool 이름
  cluster    = google_container_cluster.primary.id # 클러스터 이름
  node_count = 1 # Node의 갯수

  management {
    auto_repair  = true
    auto_upgrade = true
  }

  node_config {
    preemptible  = false
    machine_type = "e2-small" # Node의 크기

    labels = {
      role = "general"
    }

    service_account = google_service_account.kubernetes.email
    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
}

resource "google_container_node_pool" "spot" {
  name    = "spot" # Node Pool 이름
  cluster = google_container_cluster.primary.id

  management {
    auto_repair  = true
    auto_upgrade = true
  }

  autoscaling {
    min_node_count = 0
    max_node_count = 10
  }

  node_config {
    preemptible  = true
    machine_type = "e2-small"

    labels = {
      team = "devops"
    }

    taint {
      key    = "instance_type"
      value  = "spot"
      effect = "NO_SCHEDULE"
    }

    service_account = google_service_account.kubernetes.email
    oauth_scopes = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }
}

 

테라폼 적용

$ terraform apply

 

클러스터 접근

메뉴 - Kubernetes Engine - 클러스터 버튼 누른 후 클러스터 선택 - 연결 버튼 클릭

 

 

해당 명령어 복사 후 Google SDK에 붙여넣기

Google SDK에서 쿠버네티스 클러스터 접근 가능

 

 

클러스터 뿐만 아니라 VPC, 서브넷, 라우터, NAT, 노드 풀 등 다른 서비스도 생성하고 있으니 각각 이름이 유니크해야한다.

생성 및 삭제가 10분 이상 걸릴 수 있으니 여유있을 때 생성 삭제 추천

 

반응형