본문 바로가기

클라우드/GCP 자원 테라폼으로 관리해보기

(7) GKE Cluster, nodepool 생성 모듈화

반응형

GKE Cluster, nodepool생성 모듈화에 대해 기술한다.

 

1. gke.tf

gke 생성시 필요한 정보를 모듈로 전달한다.

쿠버네티스 provider 설정 및 설정 시 필요한 data를 전달한다.

module "gke_cluster" {
  source       = "./modules/gke"

  cluster_name = "an3-hr-gke"
  location = "asia-northeast3"
  project_id   = "pjt-an3-dev-vm-2"

  network    = module.vpc_network.google_compute_network_id
  subnetwork = module.sbn_an3_gkenet_1.google_compute_subnetwork
  cluster_secondary_range_name  = module.sbn_an3_gkenet_1.cluster_secondary_range_name
  services_secondary_range_name = module.sbn_an3_gkenet_1.services_secondary_range_name


  #node pool 관련 옵션
  gke_num_nodes = 1
  gke_machine_type = "e2-standard-4"
#   gke_machine_type = "e2-micro"  
  disk_size_gb = "100"
  disk_type = "pd-standard"
  service_account = "svcacc-test@pjt-an3-dev-vm-2.iam.gserviceaccount.com"
  tags = ["gke-node", "${var.project_id}-gke"]
}





#쿠버네티스 자원 설치 시 endpoint 지정을 위해 필요 data, provider 설정
data "google_client_config" "provider" {}
data "google_container_cluster" "cluster" {
  name = module.gke_cluster.gke_cluster_name
  project =  "pjt-an3-dev-vm-2"
}
provider "kubernetes" {
  #config_path    = "~/.kube/config"
 
  token = data.google_client_config.provider.access_token

  #config_context_cluster = module.gke_cluster.gke_cluster_name
  #load_config_file       = true
  host                   = data.google_container_cluster.cluster.endpoint
 
  ### cluster_ca_certificate 와 insecure 옵션은 둘 중하나만 활성화 해야함!
 
  # X509 에러 시 해당 옵션 활성화    
  insecure = true

  # 인증 시 아래 옵션 활성화
  # cluster_ca_certificate = base64decode(
  #   data.google_container_cluster.cluster.master_auth[0].cluster_ca_certificate,
  # )
}

 

gke 모듈

1) main.tf

gke cluster 를 생성할 때 필요한 정보를 받아 생성하고 노드풀의 경우 노드가 계속 떠있으면 비용이 발생하기 때문에 비용 관리 차원에서 gke-start.sh, gke-stop.sh 파일을 통해 노드풀을 생성, 삭제하도록 구성했다.

resource "google_container_cluster" "gke_cluster" {
  name     = var.cluster_name
  location = var.location
  project = var.project_id

  # We can't create a cluster with no node pool defined, but we want to only use
  # separately managed node pools. So we create the smallest possible default
  # node pool and immediately delete it.
  min_master_version = "1.26"
  remove_default_node_pool = true
  initial_node_count       = 1
  network    =  var.network
  subnetwork = var.subnetwork
  master_authorized_networks_config {
    # cidr_blocks {
    #   cidr_block   = "0.0.0.0/0"  # 허용할 IP 주소 범위 설정
    #   display_name = "my ip"
    # }
    cidr_blocks {
      cidr_block   = "59.15.35.75/32"  # 허용할 IP 주소 범위 설정
      display_name = "my ip2"
    }
    cidr_blocks {
      cidr_block   = "165.243.5.20/32"  # 허용할 IP 주소 범위 설정
      display_name = "my ip"
    }    


    # 특정 IP 주소를 추가할 경우 아래와 같이 추가할 수 있습니다.
    # cidr_blocks {
    #   cidr_block   = "xxx.xxx.xxx.xxx/32"  # 추가할 IP 주소
    #   display_name = "My IP"
    # }
  }
  ip_allocation_policy {
    cluster_secondary_range_name  = var.cluster_secondary_range_name
    services_secondary_range_name = var.services_secondary_range_name
  }

  # node_config {
  #   # Google recommends custom service accounts that have cloud-platform scope and permissions granted via IAM Roles.
  #   service_account = "svcacc-test@pjt-an3-dev-vm-2.iam.gserviceaccount.com"
  #   machine_type = "e2-micro"
  #   oauth_scopes = [
  #   ]
  #   labels = {
  #     foo = "bar"
  #   }
  #   tags = ["foo", "bar"]
  # }
  timeouts {
    create = "30m"
    update = "40m"
  }
  node_locations = [
    "asia-northeast3-a"
  ]


 


}

# #gke 사용 시 활성화 할 것
  resource "google_container_node_pool" "gke_cluster_nodes" {
    name       = "${google_container_cluster.gke_cluster.name}-node-pool"
    location   = var.location
    project = var.project_id
    cluster    = google_container_cluster.gke_cluster.name
    node_count = var.gke_num_nodes
    node_locations = [
      "${var.location}-a", "${var.location}-b"
    ]


    network_config {
      pod_range = var.cluster_secondary_range_name
    }


    node_config {
      disk_size_gb = var.disk_size_gb
      disk_type = var.disk_type
      image_type = "COS_CONTAINERD"
      service_account = var.service_account
      oauth_scopes = [
      ]

      labels = {
        env = var.project_id
      }

      machine_type = var.gke_machine_type
      # tags         = ["gke-node", "${var.project_id}-gke"]
      tags = var.tags



      metadata = {
        disable-legacy-endpoints = "true"
      }
    }
  }


2) output

output "gke_cluster_name" {
  description = "ID of the created google_compute_network id"
  value       = google_container_cluster.gke_cluster.name
}


3) variables.tf

variable "cluster_name" {
  description = "gke 클러스터 이름"
  type        = string
}

variable "location" {
  description = "지역"
  type        = string
}
variable "project_id" {
  description = "프로젝트 ID"
  type        = string
}


variable "subnetwork" {
  description = "서브넷"
  type        = string
}

variable "network" {
  description = "네트워크"
  type        = string
}

variable "cluster_secondary_range_name" {
  description = "pod 대역"
  type        = string
}

variable "services_secondary_range_name" {
  description = "서비스 대역"
  type        = string
}



variable "gke_num_nodes" {
  description = "노드 수"
  type        = number
}

variable "gke_machine_type" {
  description = "머신 타입 지정"
  type        = string
}


variable "disk_size_gb" {
  description = "노드 풀 디스크 크기"
  type        = string
}

variable "disk_type" {
  description = "노드 풀 디스크 타입"
  type        = string
}

variable "service_account" {
  description = "노드 풀 서비스 계정"
  type        = string
}

variable "tags" {
  description = "태그 목록"
  type        = list(string)
}

 

※ gke-start.sh, gke-stop.sh 파일 정보 

주석을 추가 후 테라폼을 돌리는 방식으로 설정했다.

1. gke-start.sh

#!/bin/bash

# 원본 파일과 새 파일 정의
original_file="../modules/gke/main.tf"
#new_file="../modules/gke/main_test2.tf"

# 원본 파일에서 주석 제거 후 새 파일에 쓰기
sed -i '78,119 s/^#//' "$original_file"

echo "원본 파일의 주석이 제거되었습니다."


LS_OUTPUT=$(cd .. && terraform init && terraform  apply -auto-approve  -target module.gke_cluster)
#LS_OUTPUT=$(cd .. && terraform init && terraform  apply  -target module.gke_cluster)
echo $LS_OUTPUT

# cd .. & terraform apply  -target  module.gke_cluster

echo "GKE node 추가 완료 되었습니다."

 

2.gke-stop.sh

#!/bin/bash

# 원본 파일과 새 파일 정의
original_file="../modules/gke/main.tf"
#new_file="../modules/gke/main_test2.tf"

# 다시 주석 처리
sed -i '78,119 s/^/#/' "$original_file"

echo "원본 파일의 주석이 다시 추가되었습니다."

LS_OUTPUT=$(cd .. && terraform init && terraform  apply -auto-approve  -target module.gke_cluster)
#LS_OUTPUT=$(cd .. && terraform init && terraform  apply  -target module.gke_cluster)
echo $LS_OUTPUT

# cd .. & terraform apply  -target  module.gke_cluster

echo "GKE node 삭제 완료 되었습니다."

 

 

 

테라폼으로 생성된 GKE 클러스터 및 노드풀

 

 

 

1) 제어 영역 승인 네트워크 부분을 보면 테라폼 코드에서 지정한 IP 대역이 적용되어 있다.

2) 네트워크, 서브넷 관련해서도 입력한 부분대로 적용되어 있다.

 

반응형