반응형
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 삭제 완료 되었습니다."
1) 제어 영역 승인 네트워크 부분을 보면 테라폼 코드에서 지정한 IP 대역이 적용되어 있다.
2) 네트워크, 서브넷 관련해서도 입력한 부분대로 적용되어 있다.
반응형
'클라우드 > GCP 자원 테라폼으로 관리해보기' 카테고리의 다른 글
(8-2) Terraform에서 helm 관리 - ELK (0) | 2024.06.09 |
---|---|
(8-1) Terraform에서 helm 관리 - Jenkins (0) | 2024.06.09 |
(6) 공유 VPC 서비스 프로젝트에 서브넷 생성 및 연결하기 (0) | 2024.06.09 |
(5) GCP 공유 VPC 설정 모듈화 (0) | 2024.06.09 |
(4) GCP Cloud function 모듈로 관리하기 (0) | 2024.06.09 |