Terraform์ ๊ฐ๋ ฅํ Infrastructure as Code(IaC) ๋๊ตฌ๋ก, ํด๋ผ์ฐ๋ ์๋น์ค์ ์์ฑ, ๊ด๋ฆฌ, ์ ๋ฐ์ดํธ๋ฅผ ์๋ํํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค.
์ด๋ ์ฐ๋ฆฌ๊ฐ Public Cloud์์ ์ฌ์ฉํ๋ ์ธํ๋ผ๋ฅผ ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ํจ์จ์ ์ผ๋ก ์์ฑ, ๊ด๋ฆฌํ ์ ์๊ฒ ๋์ต๋๋ค.
"์ด๊ฑธ ์ ์ฌ์ฉํ๋๊ฐ?" ์๋ฌธ์ด ๋ค ์ ์์ต๋๋ค. ์ ๋ ๊ฐ๋ Low Code
, No Code
๋ฅผ ์ธ์น๋ ์๋์์ IaC๋ ๋ชจ์์ด์ง ์์๊ฐ ์๊ฐํ์ง๋ง, ๊ฒฐ๊ตญ์๋ ์ธํ๋ผ ๊ด๋ฆฌ์ ํธ์์ฑ์ ์ํด Terraform์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
Terraform์ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ง๊ฒ ์ง๋ง, ๋ฌด์๋ณด๋ค ์ ๊ฐ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒ์ด ๋งค์ฐ ๊ฐ๋จํ๋ค๋ ์ ์ ๋๋ค.
๋ณดํต ๊ฐ์ธ Public Cloud๊ณ์ ์ ์ด์ฉํด์ ํ ์คํธ ๋ฐ ๊ณต๋ถ๋ฅผ ํ๊ณ ๋ ํ๋๋ฐ, ์ฌ์ฉํ๊ณ ๋์ ๋์ ์๊ณ ์์คํ ๋์ ์๋ผ๊ธฐ ์ํด์ ์์ฑํ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํฉ๋๋ค.
์ด ๊ณผ์ ์์ ๋์น๋ ๋ฆฌ์์ค๋ ์๊ณ , ํญ์ ์ฌ์ฉ ์ค์ธ ๋ฆฌ์์ค๊ฐ ์๋์ง Billing์ ํ์ธํฉ๋๋ค. ๐ฅฒ
์ด๋ด ๋, Terraform์ ์์ฒญ๋๊ฒ ํธ๋ฆฌํฉ๋๋ค.
Terraform์ผ๋ก ์์ฑ๋ ๋ฆฌ์์ค๋ terraform destroy
๋ช
๋ น์ด ํ๋ฐฉ์ผ๋ก ์ ๋ถ ์ญ์ ํ ์ ์์ผ๋ ํธํ์ง ์์ ์ ์์ต๋๋ค.
์๋ก ์ด ๊ธธ์๋ค์. ์ด์ ๋ถํฐ ๋์ค๋ ๋ด์ฉ์, ์ ๊ฐ ๋ํ์ ์ผ๋ก Terraform์ ์ฌ์ฉํด์ ์์ฑ, ์ญ์ ๋ฅผ ๋ฐ๋ณตํ๋ GKE์ ๋๋ค.
์ด๋ฅผ ๋ณด๊ณ , ํ๋ถ์ด๋ผ๋ GKE๋ฅผ ์ฝ๊ฒ ์์ฑ, ์ญ์ ํ์์ผ๋ฉด ์ข๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์ด ๊ณต์ ํฉ๋๋ค.
gcloud auth
Terraform์ ์ด์ฉํด์ GCP ๋ฆฌ์์ค๋ฅผ ์์ฑ, ์ญ์ ํ๊ธฐ ์ํด์๋ GCP์์ ์ ๊ณตํ๋ ์ธ์ฆ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด ์ค ์ ๋ gcloud๋ฅผ ์ด์ฉํด์ ์ฌ์ฉํฉ๋๋ค.
gcloud๋, GCP์ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก, ํฐ๋ฏธ๋์์ GCP์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ค์น๋ฒ์ GCP docs์ ์น์ ํ๊ฒ ๋์์์ผ๋ ์ฐธ๊ณ ํ์ธ์~
๊ทธ ์ค์์๋ gcloud auth๋ฅผ ์ฌ์ฉํ ๊ฑด๋ฐ, ์ฌ์ฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
shellgcloud auth login --brief
์์ ๋ช ๋ น์ด๋ฅผ Terminal์ ์ ๋ ฅํ๋ฉด, google ๋ก๊ทธ์ธ์ ํตํด์ ๊ฐ๋จํ๊ฒ ์ธ์ฆ์ด ์๋ฃ๋ฉ๋๋ค.
shellgcloud auth list
์ ์์ ์ผ๋ก ๋ฑ๋ก๋์๋์ง ํ์ธ์ ์ํด์๋ list ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
shellgcloud auth revoke test@gmail.com
๋ง์ฝ ์ฌ์ฉํ๊ณ ์๋ ๊ณ์ ์ด ๋ง๊ฑฐ๋, ๋ค๋ฅธ ์ด์ ๋ก ์ธ์ฆ์์ ์ ๊ฑฐํ๊ณ ์ถ์ผ๋ฉด revoke๋ฅผ ์ฌ์ฉํ์ธ์.
(์ ๊ฐ์ ๊ฒฝ์ฐ, ํ์ฌ๊ณ์ ๊ณผ ๋ถ๋ฆฌํ๊ณ ์ถ์ด์ ๊ฐ๋ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ด๋ฆฌ๋ ์๊ฒ ์ง๋ง, ํ์ฌ๊ณ์ ์ ์ด์ฉํด์ ํ์ฌ์์ ์ฌ์ฉํ๋ ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ ์๋ ์์ผ๋...)
shellgcloud auth application-default login
๋ง์ง๋ง์ผ๋ก ์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด, Terraform๊ฐ์ application ๋ฑ์์ google auth์ ๋ฑ๋ก๋ ๋ด์ฉ์ default๋ก ์ฌ์ฉํ๋๋ก ์ค์ ํฉ๋๋ค.
์์ ๋ด์ฉ๋๋ก gcloud auth๋ฅผ ๋ฑ๋กํ๋ฉด Terraform์ ์ด์ฉํด์ GCP์ ์ ๊ทผํ ์ค๋น๊ฐ ์๋ฃ ๋ฉ๋๋ค.
Terraform ์ค์นํ๊ธฐ
Terraform ์ค์นํ๋ ๋ฐฉ๋ฒ์ ๊ฐ๋จํฉ๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ, Mac ์ ์ ๋ก brew๋ฅผ ํตํด์ ๊ฐ๋จํ๊ฒ ์ค์นํฉ๋๋ค.
shellbrew tap hashicorp/tap
brew install hashicorp/tap/terraform
Mac ์ธ์ ํ๊ฒฝ์์ Terraform์ ์ค์นํ๋ ๋ฐฉ๋ฒ์ Terraform Docs: Install Terraform์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
shell$ terraform --version
Terraform v1.4.6
on darwin_arm64
์ ์์ ์ผ๋ก ์ค์น๋์๋์ง ํ์ธํ๊ธฐ ์ํด์ ์์ ๊ฐ์ด ํ ์คํธ ํด๋ณด์ธ์.
GKE ์์ฑํ๊ธฐ
GKE
or Terraform
์ ์กฐ๊ธ ๋ง์ ธ๋ณด์ ๋ถ๋ค์, ์ค์ ํ ๋ด์ฉ์ด ๋ง๋ค๋ ๊ฒ์ ๋๋ ๊ฒ ์
๋๋ค.
GKE๋ฅผ ์์ฑํ๊ธฐ ์ํด VPC, Subnet ๋ฑ์ ์ถ๊ฐ๋ก ์์ฑํ๊ณ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ด์ ๋ํ ๊ณผ์ ์ BESPIN GLOBAL: Terraform ์ ์ฌ์ฉํ์ฌ GKE ์์ฑํ๊ธฐ ์์ ์ ์ค๋ช ํ๊ณ ์์ต๋๋ค.
์ ๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ module ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ ค๊ณ ํฉ๋๋ค.
module์ ์ง์ ์์ฑํ๋ ๊ฒ์ ํ๋ค์ง๋ง, ์ด๋ฏธ ์์ฑ๋์ด ์๋ module์ ๊ฐ์ ธ๋ค ์ฐ๋๊ฑด ๊ฐ๋จํฉ๋๋ค.
๋คํํ๋, ์ด๋ฌํ ๋ชจ๋์ Google Cloud and HashiCorp์์ ์ ๊ณตํด์ฃผ๊ณ ์์ต๋๋ค.
๊ดํ ํ๋ค๊ฒ ์ด์ง ๋ง๊ณ , ๊ฑฐ์ธ์ ์ด๊นจ์ ์ฌ๋ผํ์...
Github Repo๋ฅผ Clone ๋ฐ์์ ํ์ํ module์ ๊ฐ์ ธ์ค๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ ๋ modules ์ค private-cluster๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ณธ์ธ์ ํ์์ ๋ฐ๋ผ modules๋ฅผ ์ ํํ์ ๋ ๊ด์ฐฎ์ต๋๋ค.
ํด๋น ํ์ผ์ ๊ฐ์ธ์ ์ ํธ์ ๋ฐ๋ผ ์๋ก์ด ํด๋์ ๊ตฌ์ฑํ์์ต๋๋ค.
shell$ tree
.
โโโ gke
โย ย โโโ gke.tf
โย ย โโโ variables.tf
โโโ module
โโโ google-kubernetes-engine
โโโ README.md
โโโ cluster.tf
โโโ dns.tf
โโโ firewall.tf
โโโ main.tf
โโโ masq.tf
โโโ networks.tf
โโโ outputs.tf
โโโ sa.tf
โโโ scripts
โย ย โโโ delete-default-resource.sh
โโโ variables.tf
โโโ variables_defaults.tf
โโโ versions.tf
gke
๋ผ๋ ํด๋์ module
ํด๋๋ก ๋ถ๋ฆฌํ์์ผ๋ฉฐ, module
ํด๋์์, google-kubernetes-engine
์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์ด์ ์ ๋ค์ด ๋ฐ์ private-cluster๋ฅผ ๋ฃ์์ต๋๋ค.
์ดํ, module์ ๊ฑด๋ค์ง ์๊ณ , gke ํด๋์์ ์์ ํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก gke.tf
์, variables.tf
๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํฉ๋๋ค.
json# gke.tf
module "cluster" {
source = "../module/google-kubernetes-engine"
ip_range_pods = ""
ip_range_services = ""
name = "<์์ฑํ cluster-name์ ์
๋ ฅํ์ธ์>"
network = ""
project_id = "<project-id๋ฅผ ์
๋ ฅํ์ธ์>"
subnetwork = ""
region = "asia-northeast3"
zones = ["asia-northeast3-a"]
regional = false
node_pools = [
{
name = "pool-1"
machine_type = "e2-standard-2"
autoscaling = false
node_count = 2
disk_size_gb = 10
disk_type = "pd-balanced"
auto_upgrade = true
},
]
}
json# variables.tf
provider "google" {
project = "<project-id๋ฅผ ์
๋ ฅํ์ธ์>"
region = "asia-northeast3"
}
terraform {
backend "gcs" {
bucket = "terraform์ ๋ณด๋ฅผ ๋ด์ bucket์ด๋ฆ"
prefix = "terraform-gke"
}
required_providers {
google = {
source = "hashicorp/google"
version = ">= 4.51.0, < 4.65.0"
}
}
}
์์ ๋ด์ฉ์ ์ ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ด์ฉ์ด์ง, Terraform์์ GKE๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ์ ์กฐ๊ฑด์ด ์๋๋๋ค.
์ฌ์ฉํ๊ณ ์ถ์ ๋ด์ฉ์ผ๋ก ์์ ํ์ ์ ์ฌ์ฉํ์ ๋ ๋ฉ๋๋ค.
ํนํ, variables.tf
์ backend๋ถ๋ถ์ gcs๊ฐ ์๋ local๋ก ์ฌ์ฉํ์
๋ ์ข์ต๋๋ค.
Terraform์ ์ด์ฉํด์ ๋ฆฌ์์ค ์์ฑํ๊ธฐ
๋จผ์ ๋ชจ๋ ๋ช ๋ น์ด๋ ์ด์ ์ ์์ฑํ gke ํด๋์์ ์งํ๋ฉ๋๋ค.
์ด์ ์์ฑ๋ง ํ๋ฉด ์๋ฃ๋ฉ๋๋ค.
shellterraform init
์์ ๋ช
๋ น์ด๋ฅผ ํตํด์, terraform์ ์ด๊ธฐํ ํด์ค๋๋ค. init
๋ช
๋ น์ด์ ๊ฒฝ์ฐ ๋ฉฑ๋ฑ์ฑ์ ๋ณด์ฅํ์ฌ ์ฌ๋ฌ๋จผ ์
๋ ฅํด๋ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์์ต๋๋ค.
shellterraform plan
๋ค์์ plan
๋ช
๋ น์ด์
๋๋ค. Terraform์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ช
๋ น์ด์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์ํ tf ํ์ผ๋ค๋ก ์์ฑ, ๋ณ๊ฒฝ, ์ญ์ ๋๋ ๋ฆฌ์์ค๋ค์ ํ์ํฉ๋๋ค.
shellterraform apply
๋ง์ง๋ง์ผ๋ก ์ค์ GCP์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ๋๋ค.
์์ฑ, ๋ณ๊ฒฝ, ์ญ์ ๋๋ ๋ฆฌ์์ค๋ฅผ ํ์ธํ๊ณ yes
๋ฅผ ์
๋ ฅํ๋ฉด ์์
์ด ์งํ๋ฉ๋๋ค.
๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ์ค์ GCP์์ ๋ฆฌ์์ค๋ฅผ ์์ฑ ์ค์์ ํ์ธ ํ ์ ์์ต๋๋ค.
shellApply complete! Resources: 9 added, 0 changed, 0 destroyed.
์์ ๊ฐ์ด terminal์์ terraform ๋ฉ์์ง๊ฐ ๋ณด์ด๋ฉด ์์ ์ด ์๋ฃ๋ ์ํ์ ๋๋ค.
์ด์ ์ํ๋ ๋๋ก ์์ ํด์ Terraform์ ์ฌ์ฉํ์๋ฉด ๋ฉ๋๋ค.
shellterraform destroy
๋ง์ง๋ง์ผ๋ก ์๊ณ ์์คํ ๋์ ์๋ผ๊ณ ์... ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ญ์ ํด์ฃผ์ธ์.