망지로그

Terraform으로 GCP 비공개 GKE 생성하기 본문

IaC/Terraform

Terraform으로 GCP 비공개 GKE 생성하기

망지v 2022. 10. 9. 19:14

Terraform을 이용한 비공개 GKE 생성에 대해 포스트 해보고자 한다.

프로젝트에서 진행했었는데, 정보가 많이 없어서 애먹었다.

 

 비공개 GKE의 GCP 공식 docs에서 private한 정도를 3단계로 구분한다. 

필자가 만든 GKE는 클라이언트가 공개 엔드포인트에 액세스할 수 없는 비공개 클러스터로, 가장 접근하기 어려운 GKE다.

처음엔 공개 엔드포인트에 무제한으로 액세스 할 수 있는 비공개 GKE를 만들었는데,,

비공개 GKE 공개(열린 교회 닫힘)느낌이라 최대한 접근이 어렵게 만들었다. 

 

(+프로젝트에서의 아키텍처가 보안이 중요한 아키텍처였기 때문에 이렇게 했다.

그렇지 않다면 굳이굳이 어렵게 갈 필요는 없다. 상황에 따라 생성하면 된다.)

 

그냥 비공개 GKE 생성은 간단하지만, 공개엔드포인트 액세스에 대한 접근에 제한을 두면,

"master_authorized_networks_config"블럭이 필수이다.

이 블럭이 없다면 autorized 관련 error 발생으로 GKE 생성이 되지 않는다.

마스터에 접근 가능한 IP 대역을 넣어주면된다.

참고로,생성 후에 콘솔에서 수정이 가능하다.

 

일단 전체를 보자. 본 포스팅에서는 variables.tf,provider.tf파일은 기본 이해가 있다고 가정하고 생략한다.

 

 

resource "google_container_cluster" "pvt-cluster" {
  name     = "pvt-cluster"
  location = var.region_seoul
  node_locations = [
    "asia-northeast3-a",
    "asia-northeast3-b"
  ]
  network = "test-vpc"
  subnetwork = "test-subnet"

  min_master_version = var.k8s_ver


  # 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.
  remove_default_node_pool = true
  initial_node_count       = 1
  master_authorized_networks_config {
     cidr_blocks {
       cidr_block = "10.0.0.0/8"
       display_name = "cloud"
     }
     cidr_blocks {
       cidr_block = "192.168.0.0/24"
       display_name = "onprem"
     }
   }

  private_cluster_config {
    enable_private_nodes = true
    enable_private_endpoint = true
    master_ipv4_cidr_block = "10.31.0.0/28"
 }

  networking_mode = "VPC_NATIVE"
  ip_allocation_policy {
 }

}

resource "google_container_node_pool" "pvt-node-pool" {
  name       = "pvt-node-pool"
  location   = var.region_seoul
  cluster    = google_container_cluster.pvt-cluster.name
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = var.node_vm_type
    disk_size_gb = 20

    service_account = var.svc_account
    oauth_scopes    = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }

  autoscaling {
    min_node_count = var.min_node
    max_node_count = var.max_node
  }
}

📌  클러스터 생성

📙 기본 설정

resource "google_container_cluster" "pvt-cluster" {
  name     = "pvt-cluster"
  location = var.region_seoul
  node_locations = [
    "asia-northeast3-a",
    "asia-northeast3-b"
  ]
  network = "test-vpc"
  subnetwork = "test-subnet"

  min_master_version = var.k8s_ver


  # 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.
  remove_default_node_pool = true
  initial_node_count       = 1

1.  이름을 설정해주고 클러스터와 노드를 생성하고 싶은 지역을 설정한다.  

 

2. 이미 생성해둔  VPC와 서브넷으로 네트워크를 설정해준다.

 

3. 쿠버네티스 버전을 넣어준다. 여기서, 버전은 GCP 출시채널 버전을 입력해주어야한다.

 

4.  위 과정만 진행하면 노드커스텀을 할 수없고 디폴트로 설정된 노드가 자동 생성되므로, 자동으로 바로 삭제하는 명령어를 넣어주어야 한다. 맨 아래 두 줄이  이에 해당된다.

 

📙 비공개 GKE설정

master_authorized_networks_config {
     cidr_blocks {
       cidr_block = "10.0.0.0/8"
       display_name = "cloud"
     }
     cidr_blocks {
       cidr_block = "192.168.0.0/24"
       display_name = "onprem"
     }
   }

  private_cluster_config {
    enable_private_nodes = true
    enable_private_endpoint = true
    master_ipv4_cidr_block = "10.31.0.0/28"
 }

  networking_mode = "VPC_NATIVE"
  ip_allocation_policy {
 }

1. 공개 엔드포인트에 대한 액세스를 사용자가 승인한 IP 주소 범위로 제한한다.  (cidr blocks는 1개만 설정해주어도 된다. 2개 이상으로 설정할 때 저렇게 하나씩 블럭을 추가해준다.)

 

2. 비공개 GKE에 대한 액세스포인트 설정이다. private node와 endpoint의 기본값이 false이므로 설정하고 싶은 명령어에 true를 넣어주면 된다.

 

3.  클러스터를 VPC 기반으로 만드는 블럭이다.

 

📙 노드 설정

resource "google_container_node_pool" "pvt-node-pool" {
  name       = "pvt-node-pool"
  location   = var.region_seoul
  cluster    = google_container_cluster.pvt-cluster.name
  node_count = 1

  node_config {
    preemptible  = true
    machine_type = var.node_vm_type
    disk_size_gb = 20

    service_account = var.svc_account
    oauth_scopes    = [
      "https://www.googleapis.com/auth/cloud-platform"
    ]
  }

  autoscaling {
    min_node_count = var.min_node
    max_node_count = var.max_node
  }
}

1. 노드 pool이름을 설정해주고,  cluster의 리전으로 location입력, 노드를 생성할 클러스터 이름을 설정해준다. 

node 개수는 영역별 생성 개수로, 앞서 cluster에서 node location을 asia-a, asia-b로 설정해두었으므로 이렇게 생성하면

각 영역에 1개씩 노드가 생성된다.(총 2개의 노드 생성)

 

2. node VM타입(ex.e2-small), 용량, service account 정보를 기입한다. service account는 gcp 테라폼 사용자 정보이름을 넣으면된다.

(필자의 경우 "terraform-access@[프로젝트이름].iam.gserviceaccount.com")

 

3.오토스캘링 정보를 넣어준다. 여기도 마찬가지로 영역별 개수에 해당한다.  해당 클러스터의 경우 min:1, max:2로 넣으면 총 노드의 최소 개수는 2개, 최대개수는 4개가 된다.


오늘은 여기까지!! 사람들에게 도움이 되었으면 좋겠다.

앞으로는 AWS와 관련해서 많은 포스팅이 이루어 질 것 같다.

 

어떤 플랫폼이든 테라폼을 이용한  프로비저닝은 terraform registry와 클라우드의 정식 docs를 참고하고 수많은 구글링..ㅎㅎㅎ 그리고 수많은 테스트,,,만 있다면 못 할 게 없다고 생각한다!! 화이팅 !!(내 자신)

 

아래는 참고용 사이트다 (terraform registry, GCP 클러스터 docs)

 

https://registry.terraform.io/providers/hashicorp/google/latest/docs

 

Terraform Registry

 

registry.terraform.io

 

https://cloud.google.com/kubernetes-engine/docs/concepts/private-cluster-concept?hl=ko 

 

비공개 클러스터  |  Google Kubernetes Engine(GKE)  |  Google Cloud

의견 보내기 비공개 클러스터 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 페이지에서는 Google Kubernetes Engine(GKE)에서 비공개 클러스터가 작동하는 방식

cloud.google.com

 

안녕~~