본문으로 건너뛰기
hannctl
PDF

case-studies gcp-terraform DESIGN.md

GCP Terraform GKE 플랫폼 설계 및 구현

노드 풀 업그레이드 중에도 용량을 유지하는 SURGE 설정과, VPN 대역만 허용하는 방화벽 기본선을 코드로 담은 모듈 모음입니다.

GKE 노드 풀 SURGE 업그레이드max_surge = 5 max_unavailable = 0새 노드기존 노드기존 노드를 하나씩 제거 · 사용 불가 0새 노드 5개로 교체 완료 · 사용 불가 노드 0soak 3600s는 BLUE_GREEN 전략에서만 적용
교체가 끝납니다. soak 3600s는 BLUE_GREEN으로 바꿀 때만 읽히는 값입니다.
우선순위 순서로 평가되는 방화벽c2sfirewall 모듈이 만드는 규칙 2개 + GCP 기본 규칙1000 · INGRESS allowVPN 대역 → tcp 22, 3389, 637965534 · EGRESS denytcp, udp 0-65535 아웃바운드 차단65535 · GCP 기본 규칙인바운드 deny, 아웃바운드 allowVPNallow서버 아웃바운드deny기본 차단, 필요한 경로만 앞선 우선순위로 허용
65534 규칙보다 앞선 allow 규칙을 추가하면 필요한 경로만 열 수 있습니다.

노드 풀 SURGE 설정

이 코드가 하는 일: game 노드 풀을 3~12대 사이에서 자동 확장하도록 정의하고, 업그레이드 전략을 SURGE로 둡니다. max_surge 5는 새 노드 5대를 먼저 올린다는 뜻이고, max_unavailable 0은 대체 노드가 준비되기 전에는 기존 노드를 하나도 빼지 않는다는 뜻이라 업그레이드 중에도 서비스 용량이 줄지 않습니다. 아래의 soak 시간 값은 주석대로 전략을 BLUE_GREEN으로 바꿨을 때만 읽힙니다.

  node_pool = {
    game = {
      autoscaling_enable = true
      min_node_count     = 3
      max_node_count     = 12
      location_policy    = "BALANCED"
      node_count         = null
      pool_version       = "1.31"
      machine_type       = "e2-standard-4"
      tags               = ["gke-node"]

      # Five extra nodes come up first, and no node is taken away until its replacement is ready.
      strategy        = ["SURGE"]
      max_surge       = 5
      max_unavailable = 0

      # Soak time is read only when the strategy is switched to BLUE_GREEN.
      node_pool_soak_duration = "3600s"
    }
  }

VPN만 허용하는 방화벽 기본선

이 코드가 하는 일: 방화벽 규칙을 맵으로 선언하고, 그중 c2s-inbound-vpn 규칙이 들어오는(INGRESS) tcp 트래픽을 허용합니다. 출발지는 변수로 받은 VPN 대역(vpn_source_ranges)뿐이고 포트도 변수로 받은 관리 포트(management_ports)만 열며, 우선순위 1000으로 둬 뒤에 오는 차단 규칙보다 먼저 적용됩니다. 대역과 포트를 변수로 빼 두었기 때문에 환경이 달라도 규칙 구조는 그대로 재사용됩니다.

locals {
  firewall_rules = {
    c2s-inbound-vpn = {
      direction            = "INGRESS"
      action               = "allow"
      ranges               = var.vpn_source_ranges
      sources              = null
      targets              = null
      use_service_accounts = false
      enable_logging       = false
      priority             = "1000"
      rules = [
        {
          protocol = "tcp"
          ports    = var.management_ports
        }
      ]
    }
© 2026 Kim JunHyun · Built with Astro · 이 사이트의 인프라도 코드로 관리합니다

↑↓ 이동 · Enter 열기 · Esc 닫기

테마 고르기

사원증을 누르면 그 테마로, 보던 내용과 같은 곳으로 이동합니다. 끌면 흔들리기만 합니다.

처음 화면으로 →