본문으로 건너뛰기
프로젝트 목록

PF-02 · GCP · IaC

GCP Terraform GKE 플랫폼

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

역할
설계 · 구현
기간
개인 프로젝트 · 2026.11 공개
CSP
GCP
규모
모듈 22종 · 예제 3개
핵심 기술
Terraform · GCP · GKE · Cloud Logging · Cloud Monitoring
GitHub
22
공개한 Terraform 모듈
5
max_surge로 먼저 뜨는 새 노드
0
max_unavailable, 동시에 빠지는 노드

한눈에 보기

GKE 노드 풀 SURGE 업그레이드max_surge = 5 max_unavailable = 0새 노드기존 노드기존 노드를 하나씩 제거 · 사용 불가 0새 노드 5개로 교체 완료 · 사용 불가 노드 0soak 3600s는 BLUE_GREEN 전략에서만 적용
교체가 끝납니다. soak 3600s는 BLUE_GREEN으로 바꿀 때만 읽히는 값입니다.

문제

GKE 노드를 업그레이드하는 동안 서비스 용량이 줄면 안 됐고, 관리 포트는 VPN 대역에서만 열려야 했습니다.

접근

노드 풀 업그레이드 전략을 SURGE로 두어 새 노드 5대를 먼저 올리고 사용 불가 노드를 0으로 유지합니다. c2sfirewall 모듈은 우선순위 1000으로 VPN의 관리 포트만 열고, 우선순위 65534로 그 외 tcp와 udp 아웃바운드를 막습니다.

결과

새 노드가 준비된 뒤에야 기존 노드가 빠집니다. 호스트 장애는 hostError 감사 로그에서 로그 기반 지표, 알림 정책, Slack 채널 순으로 이어지도록 구성했습니다.

자세히 보기

우선순위 순서로 평가되는 방화벽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
        }
      ]
    }

배운 점

설정 이름만 보고 동작을 판단하면 틀릴 수 있다는 점을 배웠습니다. soak 시간처럼 이름만 보면 모든 업그레이드에 적용될 것 같은 값도 실제로는 BLUE_GREEN 전략에서만 읽히기 때문에, SURGE 예제에서는 이 값이 동작하지 않는다는 사실을 주석으로 분명히 남겼습니다. 업그레이드 중 용량을 지키는 것도 "새 노드를 먼저 올리고(max_surge 5), 빠지는 노드는 0으로 둔다"처럼 의도를 숫자로 고정해야 운영자가 바뀌어도 같은 결과가 나옵니다. 방화벽 역시 필요한 관리 포트만 우선순위 1000으로 열고 나머지를 65534에서 막는 기본선을 모듈에 넣어, 새 환경이 처음부터 같은 규칙으로 시작하게 했습니다.

Open to work · 클라우드 인프라/보안

테마 고르기

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

처음 화면으로 →