반응형
시작하기 전
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분 이상 걸릴 수 있으니 여유있을 때 생성 삭제 추천
반응형
'Kubernetes > Google(GCP)' 카테고리의 다른 글
구글 클라우드 GCP gcloud cli shared vpc 생성 프로젝트 할당 (0) | 2024.07.03 |
---|---|
Windows 11 gcloud CLI 환경셋팅(설치방법, 로그인) (0) | 2024.07.03 |
GKE 클러스터 생성 GKE 시작하기 (0) | 2024.02.21 |
GCP 무료 크레딧으로 쿠버네티스 클러스터 구축(kubeadm) (0) | 2024.02.05 |
GCP 무료로 시작하기 계정등록, 카드 등록, 인스턴스 만들기 (0) | 2024.02.01 |