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

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 설정

이 코드가 하는 일: 새 노드를 먼저 올려 업그레이드 중 빠지는 노드를 0으로 유지합니다.

  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만 허용하는 방화벽 기본선

이 코드가 하는 일: VPN 대역의 관리 포트만 우선순위 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 예제에는 쓰지 않았습니다.

다음에 개선할 점

이 레포는 GKE를 Terraform으로 정의한 범위까지 다룹니다. CI에서는 예제를 검증만 하고 apply하지 않습니다.

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