GCE Architecture Deep Dive · Full Deck
1 / 98 문서 뷰 제안서
Intro · 1 / 4 00:00 ~ 03:00 (총 180분 · 4개 세션)

Google Compute Engine 아키텍처 심화 및 실전 구축·운영 가이드

맥락(Why): 온프레미스 데이터센터 및 타 클라우드(VPC 가상 어플라이언스 기반) 환경에 익숙한 인프라·네트워크 운영팀이 Google Cloud를 설계할 때 반드시 알아야 할 내부 아키텍처와 운영 공식을 다룹니다.
Session 1 (45분 · 24장)
  • GCE 코어 및 보안 베이스라인
  • C3/C4 & Titanium IPU 오프로딩
  • gVNIC & Tier 1 대역폭 수식
  • Hyperdisk 동적 성능 분리
  • Global/Shared VPC & OS Login
Session 2 (50분 · 24장)
  • Instance Group 라이프사이클
  • UMIG vs Regional MIG 분산 Shape
  • 무중단 Rolling/Canary 배포 수식
  • Liveness vs Readiness 완벽 분리
  • Stateful MIG 보존 항목과 3대 한계
Session 3 (55분 · 28장)
  • Cloud Load Balancing 트래픽 제어
  • GFE + Andromeda + Maglev + Envoy
  • Proxy LB vs Passthrough(DSR/proto 66)
  • 하이브리드 BGP & Cloud NAT 포트 산정
  • Keep-alive 502(600s vs 620s) 해결
Session 4 (30분 · 18장)
  • Day-2 트러블슈팅 및 IaC
  • Ops Agent 메모리·프로세스 관측
  • LB 지연 지표 대조 1분 병목 특정
  • statusDetails 5xx 판독 플레이북
  • Terraform create_before_destroy
발표자 노트 (스토리라인 가이드) 오늘 3시간 동안 진행될 아키텍처 딥다이브 세션의 전체 구성입니다. 각 세션은 20~28장의 슬라이드로 세분화되어 있어 한 장에 하나의 핵심 원리와 실전 코드만 선명하게 확인하실 수 있습니다.
Intro · 2 / 4 Overview & Target Audience

고숙련 인프라·네트워크 엔지니어를 위한 3대 설계 원칙

맥락(Why): 단순히 콘솔에서 VM을 클릭해 만드는 기초 튜토리얼이 아니라, 왜 Google Cloud에서는 기존 온프레미스나 타 클라우드와 다른 설계 패턴이 프로덕션 표준이 되는지를 아키텍처 원리로 규명합니다.
1. 내부 동작 원리(Under the Hood) 해부
  • Titanium IPU, Andromeda SDN, GFE, Maglev, 분산 Envoy 프록시가 패킷과 I/O를 어떻게 처리하는지 데이터 플레인 수준에서 설명합니다.
  • "그냥 그렇게 설정하세요"가 아니라 "커널과 SDN이 이렇게 동작하므로 이 파라미터가 필수입니다"를 증명합니다.
2. 온프레미스 / 타 클라우드와 1:1 대조
  • L4 DSR 스위치, VRRP 방화벽 HA, 리전 종속 VPC, AZ별 서브넷, ENI 기반 로드 밸런서와 GCP 아키텍처를 1:1로 비교합니다.
  • 기존 멘탈 모델을 그대로 가져왔을 때 겪게 되는 대표적인 안티 패턴을 사전에 차단합니다.
3. 즉시 적용 가능한 프로덕션 공식
  • Regional MIG maxSurge >= 3, Liveness/Readiness 분리, 백엔드 Keep-alive 620초, Cloud NAT 포트 산정 수식 등 실무 공식을 제공합니다.
  • 모든 설정은 즉시 복사해 사용할 수 있는 gcloud CLI 및 Terraform HCL 코드로 함께 제시합니다.
발표자 노트 (스토리라인 가이드) 참석자분들은 이미 온프레미스나 타 클라우드 운영 경험이 풍부한 엔지니어들입니다. 기존 경험과 비교하며 듣는 것이 가장 빠르다는 점을 안내하세요.
Intro · 3 / 4 Mental Model Shift

한눈에 보는 패러다임 전환: 기존 인프라 vs Google Cloud 아키텍처

맥락(Why): 본격적인 세션에 들어가기 전, 오늘 3시간 동안 반복해서 등장할 5가지 근본적인 아키텍처 차이를 먼저 머릿속에 그려봅니다.
아키텍처 영역 온프레미스 및 타 클라우드 멘탈 모델 Google Cloud 소프트웨어 정의 아키텍처
1. VPC & 서브넷 VPC가 단일 리전에 종속되며, 가용 영역(AZ)마다 서브넷 CIDR을 쪼개야 함 Global VPC + 리전 단위 단일 서브넷 (1개 서브넷이 Zone A/B/C 전체를 포괄)
2. 호스트 유지보수 물리 서버 점검 시 VM 재부팅/중지 예고 메일 수신 후 수동 페일오버 무중단 Live Migration 기본 제공 (TCP 세션과 메모리 유지한 채 옆 호스트로 이동)
3. 블록 스토리지 높은 IOPS를 얻기 위해 불필요한 디스크 용량(TB)을 강제로 증설 Hyperdisk를 통해 용량과 무관하게 IOPS/Throughput을 독립 할당 및 실시간 변경
4. 로드 밸런서 고객 서브넷 내 가상 어플라이언스(노드) 방식 → 급증 시 스케일링 지연(Pre-warming 필요) 전 세계 80+ PoP의 GFE/Maglev 및 호스트 Andromeda SDN → 예열 없이 백만 RPS 즉시 수용
5. 서버 SSH 접근 공인 IP가 달린 Bastion Host(Jumpbox) 운영 및 수동 SSH 키 배포·회수 공인 IP와 Bastion 전면 제거 → IAP TCP 터널링 + OS Login(IAM/2FA 연동)
발표자 노트 (스토리라인 가이드) 이 표 하나가 오늘 3시간 강의의 나침반입니다. 각 항목을 Session 1, 2, 3, 4에서 하나씩 깊이 파고들 것이라고 예고하세요.
Intro · 4 / 4 3-Hour Storyline Roadmap

단일 VM에서 글로벌 트래픽 제어까지: 3시간 빌드업 타임라인

맥락(Why): 오늘 교육은 파편화된 기능 나열이 아니라, 실제 엔터프라이즈 인프라를 바닥부터 꼭대기까지 한 층씩 쌓아 올리는 4단계 스토리라인으로 진행됩니다.
3시간(180분) 4단계 엔지니어링 여정
[Act 1 / Session 1 (45분)] 단일 VM & 베이스라인  ──▶ "Titanium/Hyperdisk로 고성능 단일 VM을 빚고 Global VPC와 OS Login 보안을 깐다"
        │
        ▼
[Act 2 / Session 2 (50분)] 무중단 클러스터(MIG) ──▶ "단일 서브넷 위에서 3개 존에 VM을 자동 분산하고 무중단 롤링 배포·자가 치유를 건다"
        │
        ▼
[Act 3 / Session 3 (55분)] SDN 로드밸런싱 제어  ──▶ "GFE/Maglev/Envoy로 트래픽을 라우팅하고 하이브리드 BGP 및 Keep-alive 502를 해결한다"
        │
        ▼
[Act 4 / Session 4 (30분)] Day-2 관측성 & IaC   ──▶ "LB 로그로 1분 안에 병목 구간을 특정하고, 전체 인프라를 Terraform으로 무중단 운영한다"
시간 배분 원칙 (총 180분 본 과정)
  • Session 1 (00:00~00:45): 45분 (Compute 15m + Storage 15m + Network/Sec 15m)
  • Session 2 (00:45~01:35): 50분 (Topology 12m + Rollout 13m + Autoscale/HC 15m + Stateful 10m)
후반부 심화 및 실습 연계
  • Session 3 (01:35~02:30): 55분 (SDN/Proxy 15m + DSR/proto66 12m + Hybrid/NAT 14m + 502 튜닝 14m)
  • Session 4 (02:30~03:00): 30분 (Ops Agent/LB 로그 15m + 네트워크 진단/Terraform 15m)
발표자 노트 (스토리라인 가이드) 자, 이제 첫 번째 블록인 단일 VM과 스토리지, VPC 베이스라인을 만드는 Session 1로 출발합니다.
Session 1 · GCE 코어 아키텍처 (1 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.1 워크로드 특성별 GCE 머신 패밀리 전체 지형도

맥락(Why): 클라우드 비용과 성능을 최적화하려면 먼저 우리 워크로드(API 게이트웨이, 배치, 인메모리 DB, 개발 서버)에 맞는 정확한 머신 시리즈를 골라야 합니다.
카테고리대표 머신 시리즈vCPU : Memory 비율핵심 타겟 워크로드
Compute-OptimizedC3, C4, C3D, H31 : 2 또는 1 : 4 (고클럭 유지)초저지연 API 게이트웨이, 대규모 트랜잭션 WAS, 고성능 게임/금융 엔진
General-Purpose (Performance)N4, N2, N2D1 : 4 기본 (최대 1 : 8 확장)엔터프라이즈 표준 웹/앱 서버, 마이크로서비스, 중규모 RDBMS/NoSQL
General-Purpose (Cost-Saving)E21 : 1 ~ 1 : 8 (동적 CPU 할당)개발/검증(Dev/Staging) 환경, 백오피스, 트래픽 변화가 완만한 경량 서비스
Memory / Storage OptimizedM3, X4 / Z31 : 8 ~ 1 : 32+ 대용량 메모리SAP HANA, 대규모 인메모리 캐시(Redis 클러스터), 고밀도 로컬 NVMe DB
발표자 노트 (스토리라인 가이드) 머신 패밀리의 큰 그림을 먼저 보여주고, 실제 가장 많이 고민하는 C3/C4 vs N2/N4 vs E2의 구체적인 선택 기준으로 넘어갑니다.
Session 1 · GCE 코어 아키텍처 (2 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.2 주력 시리즈 상세 비교: C3/C4 vs N2/N4 vs E2

맥락(Why): 겉보기엔 똑같은 8 vCPU, 32GB RAM 인스턴스라도 E2와 N4, C4는 바닥의 CPU 할당 방식과 네트워크·디스크 처리 한계가 완전히 다릅니다.
비교 항목E2 (비용 최적화)N2 / N2D (2세대 범용)N4 / C3 / C4 (3·4세대 차세대 표준)
CPU 플랫폼 할당가용 호스트 풀에서 동적 배정 (CPU 오버서브스크립션 일부 허용)고정 프로세서(Ice Lake / Milan) 전용 코어 할당전용 최신 코어(Emerald/Granite Rapids) + Titanium IPU
기본 스토리지 엔진Persistent Disk (pd-balanced / pd-ssd)Persistent Disk 및 일부 Hyperdisk차세대 Hyperdisk 전용 설계 (용량·IOPS 완전 분리)
최대 네트워크 대역폭최대 16 Gbps최대 32 Gbps ~ 100 Gbps (Tier 1)최대 100 Gbps ~ 200 Gbps (gVNIC + Tier 1)
권장 도입 판단 기준CPU 스파이크가 적고 비용 절감(약 31% 저렴)이 최우선일 때기존 레거시 PD 이미지와의 호환성이 필요할 때신규 구축하는 모든 프로덕션 WAS, API, DB 워크로드
발표자 노트 (스토리라인 가이드) 왜 3/4세대 머신(N4, C3, C4)이 2세대(N2)보다 P99 응답 시간 편차가 훨씬 적은지, 그 비밀인 Titanium IPU를 다음 장에서 해부합니다.
Session 1 · GCE 코어 아키텍처 (3 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.3 Titanium IPU 하드웨어 오프로딩 원리

맥락(Why): 가상화 환경에서 간헐적으로 응답 시간이 튀는(Tail Latency Jitter) 주된 원인은 호스트 하이퍼바이저가 네트워크 패킷과 디스크 I/O를 처리하느라 게스트 CPU 사이클을 뺏어 쓰기 때문입니다.
호스트 CPU 가상화(기존) vs Titanium IPU 전용 하드웨어 오프로딩(3·4세대)
[기존 세대 호스트]  물리 CPU 코어 ──┬─▶ 고객 VM vCPU 실행
                                  └─▶ 하이퍼바이저 I/O 처리 (Andromeda vSwitch + PD 암호화/블록 처리) ──▶ 대량 I/O 시 CPU 경합 발생!

[Titanium 호스트] 물리 CPU 코어 ────▶ 100% 고객 VM vCPU 연산에만 독점 사용! (Noisy Neighbor 및 I/O 인터럽트 간섭 제로)
                  Titanium IPU ────▶ 전용 ASIC 하드웨어에서 Andromeda SDN 패킷 처리, Hyperdisk NVMe 에뮬레이션, 라인레이트 암호화 전담!
Titanium이 오프로딩하는 3대 작업
  • 1. Andromeda SDN 패킷 파이프라인: 캡슐화/디캡슐화, 방화벽 규칙 매칭, 라우팅 테이블 조회를 하드웨어 가속기로 처리
  • 2. Hyperdisk NVMe 스토리지 프로토콜: 게스트 OS에는 로컬 NVMe 컨트롤러처럼 보이게 하면서 뒤쪽 분산 스토리지 통신을 전담
  • 3. 하드웨어 보안 루트 및 실시간 암호화: 메모리·네트워크·스토리지 전송 구간 암호화를 CPU 부하 없이 수행
운영팀이 얻는 실질적 효과
  • 네트워크 대역폭이나 디스크 IOPS가 100%로 치솟는 순간에도 애플리케이션 vCPU의 처리율과 P99 응답 시간이 흔들리지 않습니다.
  • 베어메탈에 준하는 예측 가능한 성능을 가상머신의 유연성(Live Migration 지원)과 함께 누릴 수 있습니다.
발표자 노트 (스토리라인 가이드) Titanium의 역할을 이해했다면, 이제 VM 내부의 vCPU 코어와 메모리 할당 규칙을 살펴봅니다.
Session 1 · GCE 코어 아키텍처 (4 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.4 vCPU 하이퍼스레딩, NUMA 구조 및 Custom Machine Type

맥락(Why): 라이선스가 코어 단위로 과금되는 상용 DB나 초고성능 인메모리 워크로드에서는 vCPU와 물리 코어의 매핑, 그리고 메모리 비율 조정이 필수적입니다.
vCPU 매핑 및 Visible Core Count 제어
  • 기본 규칙: GCE에서 1 vCPU = 물리 CPU 코어 1개의 하이퍼스레드(SMT 하드웨어 스레드) 1개입니다. 즉, 8 vCPU VM은 물리 코어 4개(스레드 8개)를 사용합니다.
  • SMT 비활성화 (Visible Core Count): 코어당 라이선스 비용 절감이나 스레드 간 캐시 경합 방지가 필요할 때, --threads-per-core=1 옵션을 주면 하이퍼스레딩을 끄고 순수 물리 코어만 노출할 수 있습니다.
Custom Machine Type & Extended Memory
  • 정해진 규격(2, 4, 8, 16 vCPU) 외에 워크로드 특성에 맞춰 vCPU 개수와 메모리 용량을 독립적으로 조합할 수 있습니다 (예: n2-custom-6-38912).
  • 메모리 집약적인 앱의 경우 불필요하게 vCPU를 두 배로 늘리지 않고, Extended Memory 기능을 통해 vCPU당 최대 8GB 이상으로 메모리만 증설하여 비용을 절감합니다.
gcloud CLI · 물리 코어당 스레드를 1개로 제한하거나 커스텀 메모리 비율로 VM 생성
# 1. SMT(하이퍼스레딩) 비활성화: 물리 코어당 1개 스레드만 사용
gcloud compute instances create db-node-01 --machine-type=c3-standard-16 --threads-per-core=1 --zone=asia-northeast3-a

# 2. vCPU는 4개로 유지하면서 메모리만 32GB로 높인 Custom Machine 생성
gcloud compute instances create cache-node-01 --custom-cpu=4 --custom-memory=32GB --custom-vm-type=n2 --zone=asia-northeast3-a
발표자 노트 (스토리라인 가이드) 컴퓨팅 코어를 살펴보았으니 이제 단일 VM의 네트워크 처리량을 결정짓는 가상 NIC(gVNIC)으로 넘어갑니다.
Session 1 · GCE 코어 아키텍처 (5 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.5 VirtIO의 한계를 넘는 gVNIC(Google Virtual NIC) 원리

맥락(Why): 3세대 이상 머신(C3, C4, N4)을 선택했는데 커스텀 이미지가 부팅조차 되지 않거나 대역폭이 32Gbps에서 막히는 이유는 무엇일까요? 바로 가상 랜카드 드라이버 때문입니다.
레거시 VirtIO-net vs 차세대 gVNIC 패킷 메모리 전달 구조
[VirtIO-net (1·2세대)] 게스트 커널 ──▶ VirtIO 링 버퍼 복사 및 하이퍼바이저 에뮬레이션 오버헤드 ──▶ 50Gbps 이상에서 CPU 인터럽트 포화
[gVNIC (3·4세대 필수)] 게스트 커널(gve 드라이버) ◀──(Zero-Copy DMA 직접 메모리 교환)──▶ Titanium IPU & Andromeda SDN (최대 200Gbps 선형 확장)
구분VirtIO-net (레거시 가상 NIC)gVNIC (Google Virtual NIC · 필수 표준)
지원 머신 시리즈1세대·2세대 머신(N1, N2, E2)에서만 지원 (3세대 이상 불가!)모든 머신 시리즈 지원 (C3, C4, N4, C3D, A3 등에서는 필수)
패킷 큐잉 및 성능고대역폭에서 단일/소수 큐 병목 및 높은 지터 발생멀티 큐(RSS/TSS) 하드웨어 오프로딩으로 전 코어 균등 분산 및 초저지연 달성
커스텀 이미지 요건기본 적용이미지 생성 시 반드시 --guest-os-features=GVNIC 메타데이터 태그 등록 필요
발표자 노트 (스토리라인 가이드) gVNIC 드라이버가 준비되었다면, 실제로 VM 하나가 낼 수 있는 네트워크 대역폭(Gbps)은 어떻게 계산되는지 공식을 확인합니다.
Session 1 · GCE 코어 아키텍처 (6 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.6 VM 네트워크 대역폭 산정 공식과 Tier 1 고대역폭

맥락(Why): 대용량 미디어 처리나 대규모 캐시 클러스터를 설계할 때 'VM 하나가 최대 몇 Gbps까지 트래픽을 내보낼 수 있는가?'를 정확한 수식으로 알고 있어야 합니다.
이그레스(Egress) 대역폭 계산 3단계 공식
  • 1. 코어 비례 증가: vCPU 1개당 2 Gbps씩 기본 대역폭이 선형 증가합니다 (예: 4 vCPU = 8 Gbps, 16 vCPU = 32 Gbps).
  • 2. 기본 상한선 (Default Cap): 머신 시리즈에 따라 기본 상한선(N2는 32 Gbps, C3/C4는 최대 100 Gbps)에서 캡이 씌워집니다.
  • 3. Tier 1 고대역폭 확장: 32 vCPU 이상의 대형 인스턴스에서 TIER_1 옵션을 켜면 최대 100 Gbps ~ 200 Gbps까지 상한선이 열립니다.
인바운드(Ingress) 및 프로토콜별 유의사항
  • VPC 내부 인바운드 제한 없음: 동일 VPC 내 다른 VM이나 Internal LB에서 들어오는 수신 트래픽은 별도의 대역폭 캡 없이 게스트 vCPU가 처리할 수 있는 한계까지 수신 가능합니다.
  • 외부 공인 IP 이그레스: 인터넷이나 Cloud NAT로 나가는 트래픽은 별도의 낮은 상한이 적용되므로 대용량 통신은 반드시 내부 IP 또는 전용선을 통합니다.
gcloud CLI · gVNIC 및 Tier 1 고대역폭(최대 100~200Gbps)을 활성화하여 인스턴스 생성
gcloud compute instances create high-bw-node-01   --machine-type=c3-standard-44   --network-interface=nic-type=GVNIC   --network-performance-configs=total-egress-bandwidth-tier=TIER_1   --zone=asia-northeast3-a
발표자 노트 (스토리라인 가이드) 컴퓨팅과 네트워크 스펙을 결정했습니다. 이제 물리 서버에 장애나 점검이 생겼을 때 VM이 어떻게 살아남는지 살펴봅니다.
Session 1 · GCE 코어 아키텍처 (7 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.7 물리 서버 점검 시 재부팅이 없는 Live Migration 메커니즘

맥락(Why): 클라우드 데이터센터의 물리 서버도 펌웨어 업데이트나 부품 교체를 합니다. 이때 위에서 돌고 있는 고객의 VM을 어떻게 TCP 세션 하나 끊지 않고 옆 서버로 옮길까요?
GCE Live Migration 3단계 메모리 복사 및 SDN 스위치오버 과정
[Phase 1: Pre-Copy (서비스 정상 가동 중)]
  호스트 A에서 VM이 정상 요청을 처리하는 동안, 백그라운드로 메모리 페이지(RAM)를 신규 호스트 B로 사전 복사
        │
[Phase 2: Dirty Page 반복 동기화]
  복사 도중 애플리케이션이 새로 수정한 메모리 조각(Dirty Pages)만 추려서 격차가 수 메가바이트 이하가 될 때까지 반복 전송
        │
[Phase 3: Blackout & SDN Cutover (수십~수백 ms 이내)]
  찰나의 순간 동안 CPU 레지스터와 마지막 메모리를 호스트 B로 넘기고, Andromeda SDN이 VM IP의 물리 호스트 포인터를 호스트 B로 즉시 전환!
Live Migration이 보장하는 무중단 특성
  • OS 재부팅 없음: 커널 uptime이 초기화되지 않고 그대로 유지됩니다.
  • IP 및 MAC 주소 불변: ARP 테이블 갱신이나 소켓 재연결 없이 기존에 맺어진 활성 TCP 연결이 그대로 이어집니다.
표준 가용성 정책 설정값
  • onHostMaintenance = MIGRATE (호스트 점검 시 라이브 마이그레이션 수행)
  • automaticRestart = TRUE (비정상 하드웨어 크래시 발생 시 자동 재부팅)
발표자 노트 (스토리라인 가이드) 그렇다면 모든 VM이 100% Live Migration 될까요? 물리 하드웨어가 직결되어 이동이 불가능한 예외 워크로드와 대응법을 알아봅니다.
Session 1 · GCE 코어 아키텍처 (8 / 24) 00:00 ~ 00:15 (Compute & Machine Family)

1.8 Terminate 대상 워크로드와 유지보수 이벤트 사전 감지

맥락(Why): GPU가 장착된 VM이나 대용량 로컬 NVMe가 직결된 인스턴스는 물리 PCIe 버스에 묶여 있어 Live Migration이 불가능합니다. 이런 노드는 호스트 점검 시 어떻게 방어해야 할까요?
Live Migration이 불가능한 인스턴스 유형
  • GPU 가속기 장착 VM: A3, A2, G2 및 GPU 부착 N1 인스턴스
  • 베어메탈 및 특수 로컬 스토리지 VM: -metal 시리즈, 대용량 Local SSD 집중 장착 시리즈(Z3 일부 등)
  • Spot VM (구 Preemptible VM): 가용 자원 회수 시 언제든 30초 예고 후 종료(TERMINATE)됨
메타데이터 기반 사전 감지 및 우아한 퇴거
  • GCE는 호스트 유지보수로 인해 VM이 종료되기 최대 60분 전(Spot 회수는 30초 전)에 로컬 메타데이터 서버로 예고 신호를 보냅니다.
  • 게스트 내부의 경량 워처(Watcher) 스크립트가 wait_for_change=true(Long-polling)로 대기하다가 신호 수신 즉시 LB 헬스 체크를 내리고 체크포인트를 저장합니다.
Bash · 메타데이터 서버 Long-Polling을 통한 호스트 유지보수 사전 감지 데몬 예시
# 메타데이터 값이 NONE에서 MIGRATE_ON_HOST_MAINTENANCE 또는 TERMINATE_ON_HOST_MAINTENANCE로 바뀔 때까지 블로킹 대기
EVENT=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/maintenance-event?wait_for_change=true"   -H "Metadata-Flavor: Google")

if [ "$EVENT" = "TERMINATE_ON_HOST_MAINTENANCE" ]; then
  touch /tmp/drain_mode && sleep 10 && systemctl stop my-gpu-worker
fi
발표자 노트 (스토리라인 가이드) 여기까지 Compute & Machine Family(Part 1)를 마쳤습니다. 이제 두 번째 축인 스토리지 및 이미지 엔지니어링(Part 2)으로 넘어갑니다.
Session 1 · GCE 코어 아키텍처 (9 / 24) 00:15 ~ 00:30 (Storage & Image Engineering)

1.9 GCE 블록 스토리지가 로컬 디스크가 아닌 네트워크 볼륨인 이유

맥락(Why): 온프레미스 서버에서는 OS와 데이터를 서버 내장 SAS/NVMe 디스크에 넣지만, 클라우드에서는 왜 컴퓨팅 노드와 블록 스토리지가 네트워크로 분리되어 있을까요?
컴퓨팅과 분산 스토리지의 물리적 분리 아키텍처
[GCE VM 호스트 (C3/N4)] ──(Titanium IPU 암호화 & Andromeda 고속 패브릭)──▶ [Google 분산 스토리지 풀 (다중 서버에 자동 샤딩 및 3중/다중 복제)]
   * 만약 물리 호스트 A의 메인보드가 완전히 타버려도? ──▶ 디스크 데이터는 외부 분산 스토리지에 안전하게 보존되어 옆 호스트 B에서 즉시 재마운트!
1. 하드웨어 장애로부터 데이터 격리
  • 물리 디스크 1~2개가 고장 나도 분산 스토리지 계층이 백그라운드에서 즉시 블록을 재구성(Re-replication)하므로 VM은 I/O 에러조차 인지하지 못합니다.
2. 무중단 용량·성능 확장 및 스냅샷
  • 파일시스템을 언마운트하거나 서버를 재부팅하지 않고도 온라인 상태에서 볼륨 크기를 키우고 증분 스냅샷을 뜰 수 있습니다.
3. Regional 복제 옵션 제공
  • Regional PD / Regional Hyperdisk Balanced를 선택하면 단일 리전 내 서로 다른 2개 존(Zone)에 블록을 실시간 동기 복제합니다.
발표자 노트 (스토리라인 가이드) 분산 블록 스토리지의 기본 원리를 이해했으니, 이제 기존 Persistent Disk와 차세대 Hyperdisk의 결정적 차이를 비교합니다.
Session 1 · GCE 코어 아키텍처 (10 / 24) 00:15 ~ 00:30 (Storage & Image Engineering)

1.10 Persistent Disk vs 차세대 Hyperdisk 아키텍처 비교

맥락(Why): 기존 Persistent Disk(`pd-ssd`)에서 30,000 IOPS를 얻으려면 데이터가 100GB뿐이어도 무조건 1TB(1,000GB × 30 IOPS) 디스크를 만들어 비용을 지불해야 했습니다. Hyperdisk는 이를 어떻게 바꿨을까요?
비교 항목Persistent Disk (pd-balanced / pd-ssd)Hyperdisk (hyperdisk-balanced / extreme / throughput)
성능 할당 방식디스크 용량(GB)에 종속 (GB당 고정 IOPS 및 처리량 부여)용량(GB), IOPS, Throughput(MB/s) 3요소 완전 분리 및 독립 프로비저닝!
실시간 성능 변경성능을 올리려면 용량을 키워야 하며, 한 번 키운 용량은 절대 줄일 수 없음용량 변경이나 재부팅 없이 IOPS와 처리량 수치를 실시간 상향·하향 조절 가능!
최대 성능 한계pd-ssd 기준 인스턴스당 최대 100,000 IOPS / 1,200 MB/shyperdisk-extreme 최대 350,000 IOPS / 5,000 MB/s (C3/C4/N4 지원)
프로비저닝 통합개별 디스크 단위 과금Hyperdisk Storage Pools로 수백 개 디스크가 용량·IOPS 풀을 씬 프로비저닝 공유
발표자 노트 (스토리라인 가이드) PD와 Hyperdisk의 가장 큰 차이인 '용량과 성능의 분리'를 확인했습니다. 다음 장에서 Hyperdisk 세부 유형과 실시간 변경 명령을 봅니다.
Session 1 · GCE 코어 아키텍처 (11 / 24) 00:15 ~ 00:30 (Storage & Image Engineering)

1.11 Hyperdisk 3종 선택 기준 및 무중단 실시간 IOPS 변경

맥락(Why): 워크로드가 랜덤 I/O 중심의 OLTP 데이터베이스인지, 순차 읽기/쓰기 중심의 Kafka/분석 스토리지인지에 따라 알맞은 Hyperdisk 유형을 선택합니다.
1. Hyperdisk Balanced (표준)
  • 용도: 대부분의 프로덕션 부팅 디스크, WAS, 범용 RDBMS
  • 기본 3,000 IOPS 및 140 MB/s 무료 포함, 필요 시 최대 160,000 IOPS 및 2,400 MB/s까지 독립 상향 가능
2. Hyperdisk Extreme (초고성능)
  • 용도: SAP HANA, 초고성능 트랜잭션 DB, 서브 밀리초 지연 요구 워크로드
  • 볼륨당 최대 350,000 IOPS 및 5,000 MB/s 처리량 제공
3. Hyperdisk Throughput (처리량)
  • 용도: Kafka 브로커 로그, Hadoop/Spark 분산 파일시스템, 대용량 스트리밍
  • 저렴한 비용으로 볼륨당 최대 600~2,400 MB/s의 높은 순차 대역폭 제공
gcloud CLI · Hyperdisk Balanced 생성 및 서비스 무중단 실시간 IOPS/Throughput 조정
# 1. 100GB 작은 용량에 15,000 IOPS와 400 MB/s 처리량을 독립 지정하여 디스크 생성
gcloud compute disks create prod-db-hd --type=hyperdisk-balanced --size=100GB   --provisioned-iops=15000 --provisioned-throughput=400 --zone=asia-northeast3-a

# 2. 야간 대규모 배치 작업 시작 전: 무중단으로 IOPS를 50,000으로 상향 (작업 종료 후 다시 15,000으로 하향해 비용 절감!)
gcloud compute disks update prod-db-hd --zone=asia-northeast3-a --provisioned-iops=50000 --provisioned-throughput=800
발표자 노트 (스토리라인 가이드) 네트워크 블록 스토리지인 Hyperdisk와 달리, 물리 호스트 내부에 직결된 Local SSD는 언제 쓰고 무엇을 조심해야 하는지 살펴봅니다.
Session 1 · GCE 코어 아키텍처 (12 / 24) 00:15 ~ 00:30 (Storage & Image Engineering)

1.12 Local SSD(로컬 NVMe) 활용 패턴과 데이터 휘발성 경계

맥락(Why): 네트워크 홉을 전혀 거치지 않는 극한의 IOPS(수백만 IOPS)와 최저 지연 시간이 필요할 때 Local SSD를 사용하지만, 데이터 영속성 규칙을 오해하면 대형 데이터 유실 사고로 이어집니다.
Local SSD가 빛을 발하는 올바른 사용처
  • 임시 스크래치 및 스왑/셔플 공간: Spark/Presto 중간 셔플 디스크, 대규모 정렬 작업용 임시 디렉토리(/mnt/scratch)
  • 원본이 외부에 있는 고속 읽기 캐시: 원본 데이터는 GCS나 Hyperdisk에 있고, 로컬 NVMe는 워밍업 캐시로만 쓰는 아키텍처
  • 자체 샤딩·복제 클러스터: 노드가 죽어도 다른 존의 복제본에서 즉시 재구축되는 분산 DB 캐시 계층
절대 잊지 말아야 할 데이터 보존/유실 경계
  • 유지되는 경우: 게스트 OS 내부에서 sudo reboot 명령을 내리거나 일반 머신 타입에서 Live Migration이 발생할 때는 데이터가 유지됩니다.
  • 완전 유실(초기화)되는 경우: 콘솔/CLI에서 VM을 중지(Stop)하거나, 호스트 하드웨어 결함(Crash)이 발생하거나, Spot VM이 회수될 때는 Local SSD 데이터가 100% 영구 삭제됩니다.
주의 · /etc/fstab에 Local SSD를 마운트할 때는 반드시 nofail 옵션을 넣어야 디스크 초기화 시 부팅 먹통을 막습니다!
# /etc/fstab 예시: nofail 옵션이 없으면 Local SSD 포맷 상태가 풀렸을 때 VM이 Emergency Mode로 빠져 SSH 접속이 불가해집니다.
UUID=xxxx-xxxx  /mnt/localssd  ext4  defaults,discard,nofail  0  2
발표자 노트 (스토리라인 가이드) 스토리지 설계를 마쳤으니, 이제 VM 부팅 이미지(Golden Image vs Startup Script) 설계로 넘어갑니다.
Session 1 · GCE 코어 아키텍처 (13 / 24) 00:15 ~ 00:30 (Storage & Image Engineering)

1.13 왜 부팅 시 패키지를 설치하는 Startup Script는 위험한가?

맥락(Why): 평소에 서버 1~2대를 수동으로 띄울 때는 부팅 스크립트에서 apt-get update && apt-get install을 실행해도 잘 돌아갑니다. 하지만 실제 프로덕션 장애나 피크 타임에는 이 스크립트가 재앙의 도화선이 됩니다.
실제 장애 시나리오: 트래픽 폭주로 MIG가 VM 40대를 동시에 스케일 아웃할 때 벌어지는 일
[00분 00초] 트래픽 급증 감지 ──▶ MIG Autoscaler가 신규 VM 40대 동시 생성 명령
[00분 20초] 40대 VM이 동시에 외부 패키지 저장소(apt/yum/pip/npm)로 수백 MB 다운로드 요청 집중!
  ├─▶ 병목 1: 사내 NAT 게이트웨이 대역폭 포화 및 외부 오픈소스 미러 서버 Rate Limit(429 Too Many Requests) 차단 발생!
  ├─▶ 병목 2: 패키지 다운로드 및 컴파일에 6~8분 소요 ──▶ 그 사이 기존 살아있던 서버들이 트래픽을 못 버티고 연쇄 다운!
  └─▶ 병목 3: 일부 VM은 외부 저장소 일시 타임아웃으로 설치 실패 ──▶ 빈 껍데기 VM이 떠서 헬스 체크 무한 실패 반복!
Startup Script에 넣으면 안 되는 작업
  • OS 패키지 업데이트(apt/yum/dnf) 및 커널 모듈 빌드
  • 언어 런타임(JDK, Node.js, Python), 웹서버(Nginx), 모니터링 에이전트 다운로드
  • 외부 Git 저장소 클론 또는 무거운 애플리케이션 빌드
Startup Script에 허용되는 유일한 작업
  • 이미 디스크에 설치된 바이너리에 주입할 환경별 설정값(메타데이터, Secret Manager 시크릿)을 로컬 설정 파일로 렌더링하는 작업 (수 초 이내 완료)
  • 로컬 systemd 데몬 기동(systemctl start app)
발표자 노트 (스토리라인 가이드) 그렇다면 어떻게 외부 다운로드 없이 30초 만에 부팅되는 불변 이미지를 만들고 관리할 수 있을까요? 다음 장에서 Golden Image 파이프라인을 봅니다.
Session 1 · GCE 코어 아키텍처 (14 / 24) 00:15 ~ 00:30 (Storage & Image Engineering)

1.14 Packer + Cloud Build 기반 Golden Image 표준 파이프라인

맥락(Why): 애플리케이션 릴리스나 보안 패치가 나올 때마다 엔지니어가 수동으로 VM에 들어가 스냅샷을 뜨는 대신, 코드 푸시 한 번으로 검증된 이미지를 굽고 배포하는 자동화 아키텍처입니다.
엔터프라이즈 Golden Image 자동 빌드 및 Image Family 무중단 승격 파이프라인
[Git 저장소 (Packer HCL + Ansible/Shell)]
        │ (PR 머지 시 Cloud Build 트리거)
        ▼
[임시 빌더 VM 기동] ──▶ 1) OS 보안 하드닝(CIS) + 2) gVNIC/Ops Agent 설치 + 3) Keep-alive 620초 튜닝 + 4) 앱 아티팩트 내장
        │
        ▼
[GCE 커스텀 이미지 생성: prod-was-20261019-v1] ──▶ [Image Family 포인터: prod-was-family] ──▶ [MIG Rolling Update 트리거]
Image Family를 통한 추상화 이점
  • Terraform이나 배포 스크립트에서 개별 이미지 이름 대신 image_family = "prod-was-family"를 참조하면 항상 가장 최근에 구워진 정상 이미지를 자동으로 가리킵니다.
  • 신규 이미지에 결함이 발견되면 gcloud compute images deprecate 명령으로 해당 이미지를 DEPRECATED 또는 OBSOLETE 처리하여 즉시 직전 정상 이미지로 포인터를 되돌립니다.
gcloud CLI · 커스텀 이미지 생성 시 Image Family 및 GVNIC 지정
gcloud compute images create prod-was-20261019   --source-disk=packer-builder-disk   --source-disk-zone=asia-northeast3-a   --family=prod-was-family   --guest-os-features=GVNIC
발표자 노트 (스토리라인 가이드) 부팅(Startup)을 최적화했으니, 반대로 VM이 내려갈 때 실행되는 Shutdown Script의 시간 제약과 동작 방식을 확인합니다.
Session 1 · GCE 코어 아키텍처 (15 / 24) 00:15 ~ 00:30 (Storage & Image Engineering)

1.15 VM 종료 시 ACPI 90초 제한과 Shutdown Script 동작 원리

맥락(Why): 인스턴스를 중지하거나 삭제할 때 실행되는 Shutdown Script는 무한정 기다려주지 않습니다. 정해진 하드웨어 타임아웃 안에 안전하게 연결을 정리하는 방법을 알아봅니다.
종료 트리거 유형최대 Shutdown Script 실행 보장 시간시간 초과 시 동작권장 작업 범위
일반 온디맨드 VM 중지/삭제
(MIG 스케일 인 및 롤링 배포 포함)
최대 90초
(ACPI Power Off 신호 전달 후 대기)
90초 경과 시 하이퍼바이저가 즉시 전원 강제 차단(SIGKILL 동일 효과)로컬 Readiness 상태 503 전환, 웹서버/WAS Graceful Stop, 인메모리 버퍼 플러시
Spot VM (구 Preemptible) 회수최대 30초30초 경과 시 즉시 강제 종료짧은 체크포인트 저장 및 진행 중인 단일 배치 트랜잭션 롤백/커밋
권장 Shutdown Script 패턴 (메타데이터 shutdown-script 등록용)
#!/bin/bash
# 1. LB Health Check가 즉시 이 노드를 제외하도록 상태 파일 변경 후 전파 대기
rm -f /var/run/app_ready
sleep 5

# 2. 애플리케이션에 SIGTERM을 보내 활성 요청만 마무리하고 종료 (최대 60초 타임아웃 제한)
timeout 60 systemctl stop prod-was.service

# 3. 남아있는 로컬 애플리케이션 로그를 Cloud Logging으로 강제 플러시
systemctl stop google-cloud-ops-agent
발표자 노트 (스토리라인 가이드) 이제 Session 1의 마지막 파트(Part 3: 네트워크 & 보안 베이스라인)로 넘어갑니다.
Session 1 · GCE 코어 아키텍처 (16 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.16 리전과 존의 경계를 허무는 Global VPC 아키텍처

맥락(Why): 타 클라우드에서 넘어온 네트워크 엔지니어가 가장 먼저 놀라는 점은 'VPC에 CIDR 블록이 없고, 서브넷 하나가 리전 내 모든 가용 영역(Zone)을 덮는다'는 사실입니다.
타 클라우드(리전 VPC + AZ별 서브넷) vs Google Cloud(Global VPC + 리전 단일 서브넷) 비교
[타 클라우드]  서울 VPC (10.0.0.0/16) ──┬─▶ AZ-a 서브넷 (10.0.1.0/24)  * AZ-a 장애로 AZ-b로 넘어가면 서버 IP 대역이 바뀜!
                                       └─▶ AZ-b 서브넷 (10.0.2.0/24)  * 도쿄 VPC와 통신하려면 별도 Peering / TGW 구성 필수!

[Google Cloud] 단일 Global VPC ────────┬─▶ 서울 서브넷 (10.10.0.0/20) ──▶ [Zone A VM: 10.10.0.2] [Zone B VM: 10.10.0.3] [Zone C VM: 10.10.0.4]
                                       └─▶ 도쿄 서브넷 (10.20.0.0/20) ──▶ 별도 피어링이나 게이트웨이 없이 Andromeda 내부 라우팅으로 즉시 사설 통신!
설계 및 운영상의 3대 압도적 이점
  • 1. IP 대역 파편화 방지: 존마다 `/24`씩 쪼갤 필요 없이 리전당 넉넉한 단일 서브넷(`/20` 등) 하나만 만들면 3개 존이 IP 풀을 유연하게 공유합니다.
  • 2. 존 무관 고정 IP 유지: 동일한 서브넷이 Zone A, B, C에 모두 걸쳐 있으므로 멀티존 클러스터 구성이 극도로 단순해집니다.
  • 3. 글로벌 사설 백본: 전 세계 어느 리전의 서브넷이든 하나의 VPC 안에서 Google 전용 해저/광케이블 백본으로 직접 연결됩니다.
서브넷 Secondary CIDR (Alias IP)
  • 하나의 서브넷에 기본 대역(Primary Range) 외에 여러 개의 보조 대역(Secondary CIDR Range)을 무중단으로 추가할 수 있습니다.
  • GKE 파드(Pod)/서비스 대역이나 컨테이너 워크로드에 별도 VPC 라우팅 가능한 IP를 부여할 때 활용됩니다.
발표자 노트 (스토리라인 가이드) Global VPC의 구조를 보았으니, 온프레미스 전용선/VPN과 연결될 때 경로를 어떻게 주고받는지 동적 라우팅 모드를 살펴봅니다.
Session 1 · GCE 코어 아키텍처 (17 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.17 VPC 라우팅 테이블 구조와 동적 라우팅 모드(REGIONAL vs GLOBAL)

맥락(Why): 서울 리전에만 전용선(Interconnect)을 꽂았는데, 재해 복구(DR)를 위해 도쿄 리전에 만든 서브넷까지 온프레미스 서버가 바로 통신하려면 어떤 설정 하나만 바꾸면 될까요?
REGIONAL 동적 라우팅 모드 (기본값)
  • Cloud Router가 자신이 속한 해당 리전의 서브넷 경로만 온프레미스로 BGP 광고하고, 온프레미스에서 받은 경로도 해당 리전 VM에만 전파합니다.
  • 리전 간 망 분리가 엄격히 요구되는 규제 환경에 적합합니다.
GLOBAL 동적 라우팅 모드 (엔터프라이즈 권장)
  • VPC의 동적 라우팅 모드를 GLOBAL로 전환하면, 서울 리전의 Cloud Router 하나가 전 세계 모든 리전의 서브넷 경로를 온프레미스로 자동 광고합니다.
  • 도쿄 DR 리전에 별도의 전용선을 추가로 포설하지 않아도 서울 전용선과 Google 글로벌 백본을 타고 즉시 하이브리드 통신이 이루어집니다.
gcloud CLI · VPC 생성 시 GLOBAL 동적 라우팅 모드 설정 및 실시간 전환
# 1. 신규 VPC 생성 시 글로벌 동적 라우팅 모드 지정
gcloud compute networks create prod-global-vpc --subnet-mode=custom --bgp-routing-mode=global

# 2. 기존 운영 중인 VPC도 무중단으로 GLOBAL 모드로 즉시 전환 가능
gcloud compute networks update prod-global-vpc --bgp-routing-mode=global
발표자 노트 (스토리라인 가이드) 단일 VPC 안에서 수십 개의 개발팀 프로젝트를 어떻게 안전하게 격리하고 중앙 통제할까요? 다음 장에서 Shared VPC를 다룹니다.
Session 1 · GCE 코어 아키텍처 (18 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.18 엔터프라이즈 네트워크 거버넌스의 핵심: Shared VPC

맥락(Why): 개발팀마다 각자 VPC를 만들게 두면 IP 대역이 충돌하고 전용선 연결과 방화벽 정책이 통제 불능에 빠집니다. Shared VPC는 중앙 통제와 개발 자율성을 어떻게 동시에 달성할까요?
Shared VPC: 중앙 네트워크 통제(Host Project)와 워크로드 자율성(Service Project)의 완벽한 분리
[Host Project: net-prod-host (네트워크/보안 운영팀 독점 소유)]
  ├─ 중앙 VPC, 서브넷, Cloud Router, Dedicated Interconnect, Cloud NAT, 계층형 방화벽 정책 중앙 관리
  ├─ 서브넷 A (10.10.10.0/24) ──(Subnet-level IAM: compute.networkUser 위임)──▶ [Service Project 1: 결제팀 프로젝트 (VM/MIG/GKE 생성)]
  └─ 서브넷 B (10.10.20.0/24) ──(Subnet-level IAM: compute.networkUser 위임)──▶ [Service Project 2: 송금팀 프로젝트 (VM/MIG/GKE 생성)]
최소 권한 위임: Subnet-level IAM
  • 네트워크 운영팀은 개발팀에게 Host Project 전체 권한을 주지 않고, 특정 서브넷 하나에 대해서만 roles/compute.networkUser 권한을 부여합니다.
  • 결제팀은 자신의 프로젝트에서 자유롭게 VM과 MIG를 띄우지만, 오직 결제 서브넷(`10.10.10.0/24`)의 IP만 쓸 수 있고 송금팀 서브넷이나 방화벽 규칙은 절대 건드릴 수 없습니다.
Transit Gateway 방식 대비 비용·성능 우위
  • 계정별 VPC를 Transit Gateway로 묶는 방식과 달리, Shared VPC 내부의 서브넷 간 통신은 동일한 Andromeda SDN 위에서 직접 라우팅됩니다.
  • 따라서 게이트웨이 시간당 요금이나 GB당 데이터 처리(Data Processing) 통행세 비용이 0원이며 추가 홉 지연이 없습니다.
발표자 노트 (스토리라인 가이드) Shared VPC로 네트워크 뼈대를 세웠다면, 이제 그 안의 VM 간 통신을 제어하는 방화벽 설계로 넘어갑니다.
Session 1 · GCE 코어 아키텍처 (19 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.19 방화벽 타겟팅 메커니즘 3종 완벽 비교

맥락(Why): IP 주소 기반 방화벽은 오토스케일링 환경에서 관리가 불가능합니다. GCP가 제공하는 3가지 논리적 방화벽 타겟팅 방식 중 보안 감사와 무중단 운영을 모두 만족하는 것은 무엇일까요?
비교 항목1세대: Network Tags2세대: Target Service Account3세대: IAM Tags (Resource Manager Tags · 권장)
권한 통제 (보안성)취약: VM 수정 권한(compute.instances.setTags)만 있으면 개발자가 임의로 allow-db 태그를 붙여 방화벽 우회 가능!안전: 해당 Service Account에 대한 iam.serviceAccounts.actAs 권한이 있어야만 부착 가능최고 수준: 중앙 보안팀이 관리하는 Tag User IAM 권한이 있어야만 VM에 태그 바인딩 가능
무중단 실시간 변경무중단 변경 가능치명적 단점: 실행 중인 VM의 Service Account를 바꾸려면 반드시 VM을 중지(Stop)해야 함!무중단 실시간 태그 부착/변경/제거 가능!
지원 범위 및 기능단일 VPC 방화벽에서만 동작 (VPC Peering 미지원)단일 VPC 방화벽에서만 동작 (VPC Peering 구간 미지원, 규칙당 SA 개수 제한)조직/폴더 계층 상속, VPC Peering 구간, Cloud NGFW(L7/IPS) 전반 완벽 지원!
발표자 노트 (스토리라인 가이드) 왜 IAM Tags가 기존 Network Tags와 Service Account의 단점을 모두 해결했는지 확인했습니다. 다음 장에서 방화벽 평가 순서를 봅니다.
Session 1 · GCE 코어 아키텍처 (20 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.20 계층형 방화벽 정책(Hierarchical Policy)과 평가 순서

맥락(Why): 조직 전체 보안팀이 강제하는 차단 규칙(예: 외부 RDP/Telnet 영구 차단)을 개별 프로젝트 관리자가 실수로 덮어쓰지 못하게 막는 다계층 방화벽 아키텍처입니다.
Google Cloud 방화벽 정책 평가 파이프라인 및 권한 위임(goto_next) 흐름
[1단계: Organization / Folder 계층 방화벽 정책] ──▶ 전사 필수 차단(Deny) 또는 공통 보안 에이전트 허용(Allow) 즉시 확정!
        │ (판정이 안 난 트래픽은 goto_next 액션으로 하위 계층에 위임)
        ▼
[2단계: Global / Regional Network Firewall Policy] ──▶ IAM Tags 기반 마이크로서비스 간 세밀한 허용/차단 규칙 평가
        │
        ▼
[3단계: VPC 암묵적 기본 규칙 (최하위 우선순위 65535)] ──▶ 모든 인바운드 차단(Implicit Deny Ingress) / 아웃바운드 허용
Stateful(상태 추적) 방화벽 동작 원리
  • GCP 방화벽은 Andromeda SDN에서 동작하는 완전한 Stateful 방화벽입니다.
  • 인바운드 허용 규칙을 통과해 세션 테이블(Conntrack)에 등록된 연결의 응답 패킷은 별도의 이그레스 허용 규칙 없이도 자동으로 통과합니다.
방화벽 규칙 설계 베스트 프랙티스
  • 우선순위(Priority) 숫자를 1000, 1001, 1002처럼 붙여서 쓰지 말고 1000, 1100, 1200처럼 최소 100 단위로 띄워서 부여해야 추후 긴급 차단 규칙을 중간에 끼워 넣을 수 있습니다.
발표자 노트 (스토리라인 가이드) 네트워크 방화벽에 이어, VM 내부에서 클라우드 API 자격증명을 가져오는 메타데이터 서버 보안을 점검합니다.
Session 1 · GCE 코어 아키텍처 (21 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.21 Metadata Server(169.254.169.254) SSRF 방어와 최소 권한 SA

맥락(Why): 웹 애플리케이션의 SSRF(Server-Side Request Forgery) 취약점을 통해 공격자가 클라우드 내부 메타데이터 서버(`169.254.169.254`)를 호출해 IAM 토큰을 탈취하려는 시도를 GCP는 어떻게 원천 차단할까요?
일반 HTTP GET(SSRF 공격) vs Metadata-Flavor: Google 헤더 검증 비교
# [공격자의 단순 SSRF URL 호출 (헤더 주입 불가)] ──▶ 403 Forbidden 즉시 차단!
$ curl http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
MissingMetadata: Your request must specify a 'Metadata-Flavor: Google' header.

# [정상 SDK 및 내부 에이전트 호출] ──▶ 단기(Short-lived) OAuth2 액세스 토큰 발급
$ curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token
절대 피해야 할 레거시 기본값
  • VM 생성 시 별도 설정을 안 하면 붙는 Default Compute Engine Service Account(project-number-compute@...)는 기본적으로 프로젝트 전체 편집자(Editor) 권한을 가집니다.
  • 만약 해당 VM이 침해되면 프로젝트 내 모든 리소스가 위험해집니다.
엔터프라이즈 하드닝 3원칙
  • 1. 조직 정책 강제: iam.automaticIamGrantsForDefaultServiceAccounts 조직 정책으로 기본 SA의 Editor 권한 자동 부여를 원천 차단합니다.
  • 2. 워크로드별 전용 커스텀 SA 생성: 필요한 권한(예: 로그 쓰기, 메트릭 전송, 특정 시크릿 읽기)만 가진 최소 권한 SA를 연결합니다.
  • 3. Access Scope는 cloud-platform으로 통일: 레거시 OAuth 스코프 대신 IAM 역할(Role)로만 권한을 단일 제어합니다.
발표자 노트 (스토리라인 가이드) 이제 Session 1의 마지막 핵심 보안 주제인 '공인 IP와 Bastion 없이 Private VM에 어떻게 안전하게 SSH 접속할 것인가?'를 2장에 걸쳐 살펴봅니다.
Session 1 · GCE 코어 아키텍처 (22 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.22 수동 SSH 키 관리를 제거하는 OS Login(PAM/NSS) 원리

맥락(Why): 엔지니어 50명이 서버 200대에 접속할 때, 메타데이터에 공개키를 수동으로 등록해 쓰면 퇴사자가 발생할 때 키 회수 누락이나 `root` 권한 남용을 막기 어렵습니다. OS Login은 이를 어떻게 해결할까요?
OS Login 활성화 시 리눅스 커널 PAM/NSS와 Google Cloud IAM의 실시간 인증 연동 흐름
[엔지니어 SSH 접속 시도] ──▶ [게스트 OS sshd & PAM/NSS 모듈 (google-oslogin)]
                                  │ (메타데이터 서버를 통해 Google Cloud IAM에 실시간 질의)
                                  ├─▶ 1. 계정 조회 (NSS): Cloud Identity 이메일 기반 고유 POSIX UID/GID 및 홈 디렉토리 매핑
                                  ├─▶ 2. 권한 검증 (IAM): roles/compute.osLogin (일반 유저) vs roles/compute.osAdminLogin (sudo 권한)
                                  └─▶ 3. 2단계 인증 (PAM): enable-oslogin-2fa=TRUE 설정 시 Google OTP / 보안키 2차 인증 강제!
OS Login이 제공하는 3대 보안 가치
  • 1. 즉각적인 권한 회수: 퇴사자나 부서 이동자 발생 시 서버에 접속해 `authorized_keys`를 지울 필요 없이, Cloud Identity 계정을 비활성화하거나 IAM 역할을 빼면 1초 만에 전체 VM 접속이 차단됩니다.
  • 2. 영구 고정 POSIX UID: 모든 VM에서 동일한 엔지니어는 항상 동일한 리눅스 UID를 부여받아 감사 로그(`auditd`) 추적이 명확합니다.
  • 3. 세분화된 sudo 통제: 일반 운영자는 osLogin만 부여해 조회만 허용하고, 시니어 관리자만 osAdminLogin을 부여합니다.
프로젝트 메타데이터에 OS Login 및 2FA 일괄 강제
gcloud compute project-info add-metadata   --metadata enable-oslogin=TRUE,enable-oslogin-2fa=TRUE
발표자 노트 (스토리라인 가이드) OS Login으로 '누가 로그인할 수 있는가'를 해결했다면, 공인 IP가 없는 Private VM까지 '어떤 네트워크 경로로 들어갈 것인가'를 IAP Tunneling으로 해결합니다.
Session 1 · GCE 코어 아키텍처 (23 / 24) 00:30 ~ 00:45 (Network & Security Baseline)

1.23 공인 IP와 Bastion Host를 없애는 IAP TCP Forwarding

맥락(Why): 과거에는 사설 서브넷의 VM에 접속하기 위해 공인 IP가 달린 Bastion VM을 띄우고 22번 포트를 열어야 했습니다. Identity-Aware Proxy(IAP)는 Bastion 없이 어떻게 사설 VM 터널링을 제공할까요?
Bastion 없는 제로 트러스트 SSH 접속: IAP TCP Forwarding 아키텍처
[엔지니어 노트북 (gcloud compute ssh --tunnel-through-iap)]
        │ (HTTPS TLS 443 암호화 터널 + OAuth2 인증 + 기기 보안 상태 검증)
        ▼
[Google Identity-Aware Proxy (IAP) 서버: 35.235.240.0/20]  ◀── IAM 검증: roles/iap.tunnelResourceAccessor 보유 여부 확인
        │ (VPC 내부 사설 라우팅으로 22번 포트 전달)
        ▼
[Private GCE VM (공인 IP 없음! 방화벽은 오직 35.235.240.0/20 -> TCP 22만 허용!)]
이중 잠금(Dual-Lock) 보안 구조
  • 엔지니어가 Private VM에 접속하려면 1) 네트워크 관문인 IAP 통과 권한(roles/iap.tunnelResourceAccessor)과 2) OS 로그인 권한(roles/compute.osLogin) 두 가지를 모두 통과해야 합니다.
  • 인터넷 공간에 노출된 공인 IP와 열린 22번 포트가 단 하나도 없으므로 무차별 대입 공격(Brute-force) 표면이 0이 됩니다.
실무 팁: 대용량 파일 전송(SCP) 속도 튜닝
  • gcloud compute scp --tunnel-through-iap 실행 시 기본 Python 래퍼 대신 NumPy 패키지가 설치된 환경에서 실행하면 XOR 마스킹 연산이 C로 가속되어 터널 전송 속도가 수 배 빨라집니다.
발표자 노트 (스토리라인 가이드) Session 1의 모든 이론을 마쳤습니다. 마지막 24번째 슬라이드에서 현장에서 가장 많이 나오는 질문 4가지를 정리하고 Session 2로 넘어갑니다.
Session 1 · GCE 코어 아키텍처 (24 / 24) 00:30 ~ 00:45 (Session 1 Wrap-up Q&A)

1.24 Session 1 실전 아키텍처 핵심 Q&A

맥락(Why): 단일 VM, Hyperdisk, Global VPC, 방화벽 및 OS Login을 실제 프로덕션에 적용할 때 시니어 엔지니어들이 가장 자주 묻는 핵심 질문과 해답입니다.
Q1. Live Migration 중 정말로 지연이 전혀 없나요?
  • A: 메모리 사전 복사(Pre-copy) 단계에서는 영향이 없으며, 마지막 스위치오버(Blackout) 순간에 약 수십~수백 밀리초(ms)의 짧은 멈춤만 발생합니다. 일반 웹/WAS의 TCP 세션은 전혀 끊기지 않으며, 초저지연 HFT 워크로드만 다중 노드 구성을 병행합니다.
Q2. Hyperdisk IOPS는 정말 초 단위로 계속 바꿀 수 있나요?
  • A: 무중단 온라인 변경이 가능하지만, 남용 방지를 위해 볼륨당 4시간에 1회의 성능 변경 쿨다운 주기가 적용됩니다. 따라서 피크 타임 전 상향 → 피크 종료 후 하향 같은 일간 스케줄링에 이상적입니다.
Q3. Shared VPC에서 개발팀이 실수로 다른 팀 서브넷에 VM을 띄우면요?
  • A: 프로젝트 전체가 아니라 개별 서브넷 리소스 단위(Subnet-level IAM)로 compute.networkUser를 부여하면, 권한이 없는 다른 팀 서브넷은 아예 선택하거나 배포할 수 없도록 API 수준에서 차단됩니다.
Q4. 사내 AD(Active Directory)/Okta 계정을 그대로 OS Login에 쓸 수 있나요?
  • A: 네, 사내 IdP(Okta, Entra ID 등)를 Google Cloud Identity와 SAML/OIDC 및 SCIM으로 연동하면 사내 이메일 계정과 그룹 권한 그대로 리눅스 VM의 SSH 및 `sudo` 권한이 자동 동기화됩니다.
발표자 노트 (스토리라인 가이드) Session 1의 24장을 마쳤습니다. 잠시 호흡을 가다듬고, 이제 이 단일 VM들을 묶어 무중단 클러스터로 운영하는 Session 2로 들어갑니다.
Session 2 · MIG 라이프사이클 (1 / 24) 00:45 ~ 00:57 (Topology & Distribution)

2.1 인스턴스 그룹 3종 비교: UMIG vs Zonal MIG vs Regional MIG

맥락(Why): Session 1에서 단일 VM과 단일 서브넷을 설계했습니다. 이제 여러 대의 VM을 하나의 논리적 클러스터로 묶을 때 어떤 그룹 유형을 선택해야 할까요?
비교 항목Unmanaged IG (UMIG)Zonal MIG (단일 존 관리형)Regional MIG (멀티존 관리형 · 표준)
인스턴스 구성서로 다른 스펙·이미지의 수동 생성 VM들을 임의로 묶음단일 Instance Template 기반으로 1개 존 내부에 동일 VM 자동 생성단일 Instance Template 기반으로 3개 존(Zone A/B/C)에 걸쳐 자동 분산 생성
자동화 기능Autoscaling, Autohealing, Rolling Update 전부 미지원Autoscaling, Autohealing, Rolling Update 지원 (단, 단일 존 내부 한정)멀티존 Autoscaling, Autohealing, 무중단 Rolling Update 및 Zone 장애 격리 지원
권장 사용처온프레미스에서 Lift & Shift한 이기종 수동 VM들을 LB에 연결할 때만 제한적 사용노드 간 초저지연 물리 인접 배치가 필수인 HPC/단일 존 배치 작업엔터프라이즈 프로덕션 웹, WAS, API, 상태 유지 클러스터의 기본 표준
발표자 노트 (스토리라인 가이드) Session 2의 첫 슬라이드입니다. 왜 UMIG가 아닌 Regional MIG가 프로덕션 기본값인지 짚어줍니다.
Session 2 · MIG 라이프사이클 (2 / 24) 00:45 ~ 00:57 (Topology & Distribution)

2.2 단일 서브넷 위에서 3개 존을 아우르는 Regional MIG 구조

맥락(Why): 타 클라우드에서는 멀티 AZ 오토스케일링 그룹을 만들려면 3개의 서로 다른 서브넷을 지정해야 하지만, GCP의 Regional MIG는 단 하나의 서브넷만 지정합니다.
단일 리전 서브넷(10.10.0.0/20) 위에서 3개 가용 영역에 걸쳐 동작하는 Regional MIG
[Cloud Load Balancer Backend Service]
        │
        ▼
[Regional MIG: prod-was-mig (Region: asia-northeast3, Subnet: 10.10.0.0/20)]
  ├──▶ Zone A (asia-northeast3-a): [was-vm-a1: 10.10.0.11]  [was-vm-a2: 10.10.0.12]
  ├──▶ Zone B (asia-northeast3-b): [was-vm-b1: 10.10.0.13]  [was-vm-b2: 10.10.0.14]
  └──▶ Zone C (asia-northeast3-c): [was-vm-c1: 10.10.0.15]  [was-vm-c2: 10.10.0.16]
아키텍처 단순성 및 방화벽 일관성
  • Zone A, B, C에 생성되는 모든 인스턴스가 동일한 서브넷 대역(`10.10.0.0/20`)에서 IP를 할당받으므로 라우팅과 IP 관리가 단순합니다.
  • 특정 존에 장애가 발생해 다른 존에서 VM이 추가로 뜨더라도 IP 대역이 바뀌지 않습니다.
Zonal 장애 격리 및 자동 복구
  • 만약 Zone A 전체에 정전이나 장애가 발생하면, Regional MIG 컨트롤러는 정상 가동 중인 Zone B와 Zone C로 즉시 용량을 확보하여 전체 목표 대수(Target Size)를 유지합니다.
발표자 노트 (스토리라인 가이드) 그렇다면 Regional MIG는 3개 존에 인스턴스를 어떤 비율과 우선순위로 배치할까요? 다음 장에서 Target Distribution Shape를 봅니다.
Session 2 · MIG 라이프사이클 (3 / 24) 00:45 ~ 00:57 (Topology & Distribution)

2.3 멀티존 분산 알고리즘: Target Distribution Shape 4종

맥락(Why): Regional MIG가 3개 존에 VM을 배치할 때, 무조건 1/3씩 칼같이 맞출 것인지 아니면 하드웨어 재고(Stockout)나 지연을 우선할 것인지 결정하는 알고리즘입니다.
분산 모드 (Shape)핵심 동작 알고리즘장점 및 트레이드오프권장 워크로드
1. EVEN (기본값)선택된 모든 존(3개 존)에 인스턴스 대수를 정확히 1/N씩 균등 분배 강제특정 존 장애 시 손실 용량이 정확히 33%로 예측 가능함일반 무상태 웹/WAS, API 서버 표준
2. BALANCED기본적으로 균등 분배를 추구하되, 특정 존에 자원 부족(Stockout) 발생 시 가용한 다른 존에 우선 생성피크 타임 스케일 아웃 시 특정 존 재고 부족으로 전체 확장이 멈추는 현상 방지!대규모 스케일 아웃이 빈번하거나 희소 스펙(대형 C3/C4, GPU)을 쓰는 클러스터
3. ANY존 간 균형을 고려하지 않고 가장 빠르게 프로비저닝 가능한 아무 존에나 배치가장 빠른 대량 생성 보장, 단 한 존에 몰릴 수 있음단기 대량 배치 워커(Batch Worker)
4. ANY_SINGLE_ZONE전체 용량을 수용할 수 있는 단 하나의 존을 골라 모든 VM을 한곳에 밀집 배치존 간 네트워크 RTT(약 0.5~1ms)와 교차 존 이그레스 비용을 완전히 제거노드 간 통신량이 극도로 많은 고성능 분산 연산 클러스터
발표자 노트 (스토리라인 가이드) 특히 피크 타임에 중요한 `EVEN`과 `BALANCED`의 결정적 차이를 구체적인 장애 시나리오로 비교해 봅니다.
Session 2 · MIG 라이프사이클 (4 / 24) 00:45 ~ 00:57 (Topology & Distribution)

2.4 특정 존 하드웨어 재고 부족(Stockout) 시 EVEN vs BALANCED

맥락(Why): 블랙프라이데이나 대형 이벤트 날, 목표 대수를 6대에서 12대로 늘렸는데 우연히 Zone C에 해당 머신 재고가 동났다면 `EVEN`과 `BALANCED`는 각각 어떻게 행동할까요?
목표 대수 12대(존당 4대) 확장 중 Zone C에 물리 서버 재고 부족(ZONE_RESOURCE_POOL_EXHAUSTED) 발생 시
[1. EVEN 모드인 경우]     Zone A: 4대 (성공) │ Zone B: 4대 (성공) │ Zone C: 2대 (2대 생성 실패 대기 중...) ──▶ 총 10대만 가동 (2대분 용량 부족 지속)
[2. BALANCED 모드인 경우] Zone A: 5대 (+1대!)│ Zone B: 5대 (+1대!)│ Zone C: 2대 (재고 부족)                ──▶ 가용한 Zone A/B에 즉시 대신 띄워 총 12대 100% 달성!
왜 BALANCED가 실무에서 강력한가?
  • 피크 타임에는 완벽한 4:4:4 비율보다 당장 트래픽을 받아낼 총 12대의 가용 코어 수를 채우는 것이 서비스 생존에 훨씬 중요합니다.
  • 이후 Zone C의 재고가 회복되면 점진적으로 다시 균형을 맞춥니다.
gcloud CLI · 분산 모드를 BALANCED로 지정
gcloud compute instance-groups managed update prod-was-mig   --region=asia-northeast3   --target-distribution-shape=BALANCED
발표자 노트 (스토리라인 가이드) 존 간 균형을 맞추는 또 하나의 중요한 스위치인 Proactive Redistribution이 언제 독이 될 수 있는지 다음 장에서 살펴봅니다.
Session 2 · MIG 라이프사이클 (5 / 24) 00:45 ~ 00:57 (Topology & Distribution)

2.5 Proactive Redistribution(능동적 재배치)을 꺼야 하는 순간

맥락(Why): 존 간 인스턴스 대수가 5 : 4 : 3으로 어긋났을 때, MIG가 자동으로 Zone A의 멀쩡한 VM 1대를 죽이고 Zone C에 새로 띄워 4 : 4 : 4를 맞추는 기능이 항상 좋을까요?
Proactive Redistribution = TRUE (기본값)
  • 존 간 대수 불균형이 감지되면 MIG 컨트롤러가 인스턴스가 많은 존의 VM을 자동으로 삭제하고 부족한 존에 새로 생성합니다.
  • 순수 무상태(Stateless) 웹 프론트엔드에서는 항상 균등한 존 분포를 유지해 주는 편리한 기능입니다.
반드시 FALSE(비활성화)로 꺼야 하는 워크로드
  • 1. 로컬 인메모리 캐시 워밍업 비용이 큰 서버: 부팅 후 로컬 캐시를 채우는 데 10분이 걸리는 서버가 단지 대수 균형을 맞추기 위해 예고 없이 삭제되면 응답 지연이 튑니다.
  • 2. 장시간 연결(WebSocket / 게임 서버 / 스트리밍) 및 상태 유지형 서버: 활성 세션이 강제로 끊어지는 것을 막기 위해 자동 재배치를 꺼야 합니다.
gcloud CLI · 불필요한 자동 VM 삭제·재배치(Proactive Redistribution) 비활성화
gcloud compute instance-groups managed update prod-cache-mig   --region=asia-northeast3   --instance-redistribution-type=NONE
발표자 노트 (스토리라인 가이드) 클러스터의 공간적 배치(Topology)를 마쳤으니, 이제 시간적 변화인 무중단 배포 및 롤링 업데이트(Part 2)로 넘어갑니다.
Session 2 · MIG 라이프사이클 (6 / 24) 00:57 ~ 01:10 (Zero-Downtime Rollout & Canary)

2.6 왜 GCE의 Instance Template은 수정 불가능(Immutable)한가?

맥락(Why): 운영 중인 MIG의 이미지 버전이나 시작 스크립트를 바꾸려고 기존 Instance Template 수정을 시도하면 거부됩니다. 왜 불변 리소스로 설계되었을까요?
불변(Immutable) Instance Template 기반의 안전한 버전 전환과 즉각적 롤백 구조
[기존 템플릿: was-tpl-v1 (변경 불가, 스냅샷처럼 영구 보존)]
                                                          ├──▶ [MIG 컨트롤러] ──(롤링 업데이트 또는 카나리 전환)
[신규 템플릿: was-tpl-v2 (새 이미지/환경변수로 신규 생성)]  * 만약 v2 배포 중 장애 발생 시? ──▶ 포인터만 다시 v1으로 바꾸면 100% 동일한 스펙으로 즉시 롤백!
불변 템플릿 설계가 보장하는 2가지 가치
  • 1. Configuration Drift(형상 오염) 원천 차단: 누군가 기존 템플릿을 몰래 덮어써서 지금 떠 있는 VM과 다음에 스케일 아웃될 VM의 스펙이 달라지는 사고를 막습니다.
  • 2. 결정론적 롤백(Deterministic Rollback): 이전 버전 템플릿(`v1`)이 수정되지 않고 그대로 남아 있으므로 언제든 1초 만에 과거 버전으로 되돌릴 수 있습니다.
템플릿 명명 규칙 모범 사례
  • 고정된 이름(`prod-was-tpl`) 대신 날짜·커밋 해시 접미사(`prod-was-tpl-20261019-a1b2`) 또는 Terraform의 name_prefix를 사용하여 매 변경 시 새 템플릿이 생성되도록 합니다.
발표자 노트 (스토리라인 가이드) 새 템플릿(`v2`)을 만들었다면, 이제 기존 VM들을 새 템플릿으로 교체하는 두 가지 업데이트 모드를 비교합니다.
Session 2 · MIG 라이프사이클 (7 / 24) 00:57 ~ 01:10 (Zero-Downtime Rollout & Canary)

2.7 Rolling Update 실행 모드: PROACTIVE vs OPPORTUNISTIC

맥락(Why): MIG의 템플릿 버전을 `v2`로 업데이트할 때, 지금 당장 기존 VM들을 교체할 것인지 아니면 자연스럽게 스케일 아웃·복구될 때만 적용할 것인지 선택할 수 있습니다.
비교 항목PROACTIVE (능동적 즉시 롤아웃 · 기본값)OPPORTUNISTIC (기회적 지연 롤아웃)
동작 방식명령 실행 즉시 MIG 컨트롤러가 지정된 maxSurge / maxUnavailable 속도 제한에 맞춰 기존 VM들을 순차적으로 새 템플릿으로 교체현재 실행 중인 기존 VM들은 건드리지 않고 그대로 두며, 오토스케일링으로 새 VM이 추가되거나 장애로 재생성될 때만 새 템플릿 적용
장점 및 주의점예측 가능한 시간 내에 클러스터 전체가 100% 신규 버전으로 통일됨배포로 인한 인스턴스 재시작 충격이 전혀 없으나, 신·구 버전이 장기간 혼재됨
적합한 시나리오애플리케이션 코드 배포, 긴급 보안 패치 적용 등 일반적인 모든 프로덕션 배포경미한 OS 라벨 변경이나 당장 재시작할 필요가 없는 비핵심 에이전트 설정 반영, 또는 특정 VM만 수동 선별 업데이트할 때
발표자 노트 (스토리라인 가이드) PROACTIVE 모드에서 단 1건의 트래픽 드롭도 발생하지 않게 만드는 정확한 수학적 공식을 다음 장에서 확인합니다.
Session 2 · MIG 라이프사이클 (8 / 24) 00:57 ~ 01:10 (Zero-Downtime Rollout & Canary)

2.8 무중단 배포를 보장하는 maxSurge · maxUnavailable · minReadySec 공식

맥락(Why): Regional MIG에서 롤링 업데이트를 돌렸는데 배포 중 서버 용량이 줄어들거나, 배포 속도가 너무 느리다면 이 세 가지 파라미터 설정이 잘못된 것입니다.
Regional MIG(3개 존, 현재 6대)에서 maxUnavailable=0, maxSurge=3 설정 시 병렬 무중단 교체 과정
[기존 용량 6대 100% 유지] ──▶ Zone A(+1), Zone B(+1), Zone C(+1)에 신규 v2 VM 3대 동시 추가 생성 (총 9대)
                          ──▶ 신규 3대가 LB Health Check 통과 + minReadySec(60초) 예열 완료 확인!
                          ──▶ 그제야 기존 구버전 v1 VM 3대를 Connection Draining 후 안전 삭제 (다시 6대 유지하며 다음 배치 진행)
1. maxUnavailable = 0
  • 배포 도중 정상 서비스 중인 인스턴스 대수가 기존 목표 대수 아래로 단 1대도 줄어들지 않도록 강제합니다.
2. Regional maxSurge >= 3
  • 3개 존에 걸친 Regional MIG에서는 maxSurge가 최소 3 이상(또는 존당 1대 이상)이어야 3개 존에서 동시에 병렬로 새 VM을 띄워 배포 시간이 3배 빨라집니다.
3. minReadySec = 30~60s
  • 신규 VM의 헬스 체크가 200 OK를 반환한 직후에도, JVM JIT 컴파일과 캐시 워밍업을 위해 구버전을 죽이기 전 최소 30~60초간 공존 시간을 부여합니다.
발표자 노트 (스토리라인 가이드) 템플릿의 무엇이 바뀌었느냐에 따라 굳이 VM을 삭제하지 않고도 업데이트할 수 있는 제어 옵션을 다음 장에서 봅니다.
Session 2 · MIG 라이프사이클 (9 / 24) 00:57 ~ 01:10 (Zero-Downtime Rollout & Canary)

2.9 업데이트 충격 최소화: minimalAction 및 교체 방식(SUBSTITUTE vs RECREATE)

맥락(Why): 단순히 메타데이터나 라벨 하나만 바꿨는데 VM 전체를 부수고 새로 만들면 낭비이고, 반대로 실수로 머신 타입을 바꿨다가 전체 서버가 재부팅되는 사고도 막아야 합니다.
충격 강도 4단계 제어 (Action Guardrails)
  • 강도 순서: NONE < REFRESH (재부팅 없이 메타데이터/디스크만 갱신) < RESTART (OS 재부팅) < REPLACE (VM 삭제 후 새로 생성)
  • minimalAction = REFRESH: 가능한 가장 가벼운 조치만 수행하도록 지정하면, 메타데이터 변경 시 VM을 죽이지 않고 즉시 반영합니다.
  • mostDisruptiveAllowedAction: 안전장치로 REFRESH를 걸어두면, 누군가 실수로 이미지 변경을 푸시해도 VM이 삭제되는 것을 API가 거부합니다.
REPLACE 시 교체 방식: SUBSTITUTE vs RECREATE
  • SUBSTITUTE (기본값 · 무상태 권장): 새로운 이름과 새 IP를 가진 VM을 옆에 먼저 띄운(Surge) 뒤 기존 VM을 지웁니다. maxUnavailable=0이 가능합니다.
  • RECREATE (고정 이름/IP 보존용): 기존 VM과 똑같은 이름·IP를 재사용해야 하므로 기존 VM을 먼저 죽인 뒤 새로 만듭니다. (Surge 불가)
gcloud CLI · 재부팅 없이 메타데이터 변경만 무중단 즉시 반영(REFRESH)
gcloud compute instance-groups managed rolling-action start-update prod-was-mig   --version=template=prod-was-tpl-v2   --minimal-action=refresh --most-disruptive-allowed-action=refresh --region=asia-northeast3
발표자 노트 (스토리라인 가이드) 전체 롤링 업데이트 전에 일부 트래픽으로만 신버전을 검증하는 카나리(Canary) 배포의 두 가지 아키텍처를 2장에 걸쳐 비교합니다.
Session 2 · MIG 라이프사이클 (10 / 24) 00:57 ~ 01:10 (Zero-Downtime Rollout & Canary)

2.10 카나리 배포 패턴 A: 단일 MIG 내 다중 버전 분할(Built-in Canary)

맥락(Why): 별도의 로드 밸런서 설정이나 추가 인프라 없이, 기존 MIG 하나 안에서 인스턴스의 10%만 신규 템플릿(`v2`)으로 먼저 올려 검증하는 내장 기능입니다.
단일 Regional MIG(총 10대) 내부에서 Primary(v1: 9대)와 Canary(v2: 1대/10%) 공존 구조
[단일 Regional MIG: prod-was-mig (총 10대)]
  ├─ Primary Version (template = was-tpl-v1) ──▶ 9대 가동 (전체 트래픽의 90% 처리)
  └─ Canary Version  (template = was-tpl-v2) ──▶ 1대(또는 3대) 가동 (전체 트래픽의 10% 처리 및 에러율 모니터링)
단일 MIG 카나리의 장점과 제약
  • 장점: 추가 Backend Service나 MIG를 만들 필요 없이 명령어 하나로 카나리 시작 → 100% 승격(Promote) 또는 즉시 롤백이 가능합니다.
  • 제약사항: Regional MIG에서 EVEN 분산 모드가 켜져 있으면 카나리 대수도 3개 존에 나뉘어야 하므로 최소 3대 이상을 요구할 수 있습니다. (소수 대수 테스트 시 BALANCED 권장)
카나리 배포 시작 및 검증 완료 후 100% 승격 명령
# 1. 10% 카나리 배포 시작
gcloud compute instance-groups managed rolling-action start-update prod-was-mig   --version=template=was-tpl-v1   --canary-version=template=was-tpl-v2,target-size=10%   --region=asia-northeast3

# 2. 이상 없을 시 전체 100% v2로 승격
gcloud compute instance-groups managed rolling-action start-update prod-was-mig   --version=template=was-tpl-v2 --region=asia-northeast3
발표자 노트 (스토리라인 가이드) 만약 서버 대수 비율이 아니라 정확히 1%의 트래픽만 보내거나 사내 테스터 헤더만 신버전으로 보내고 싶다면 어떻게 해야 할까요? 패턴 B를 살펴봅니다.
Session 2 · MIG 라이프사이클 (11 / 24) 00:57 ~ 01:10 (Zero-Downtime Rollout & Canary)

2.11 카나리 배포 패턴 B: 별도 카나리 MIG + Envoy ALB 트래픽 분할

맥락(Why): 서버가 총 6대뿐이면 단일 MIG 카나리에서는 최소 1대(16.6%)의 트래픽이 신버전으로 들어갑니다. 인스턴스 대수와 무관하게 0.5%, 1% 단위로 정밀 제어하거나 특정 헤더만 분기하는 아키텍처입니다.
Envoy 기반 Application Load Balancer의 URL Map 가중치/헤더 분기를 활용한 정밀 카나리 아키텍처
[Global / Regional / Internal ALB (Envoy 데이터 플레인)]
  ├─ 조건 1: 요청 헤더에 X-Canary-Test: true 포함 시 ──▶ 100% [Backend Service Canary (prod-was-mig-canary)]로 라우팅
  └─ 조건 2: 일반 고객 트래픽 가중치 분할(Weight Split)
       ├─▶ 99% 가중치 ──▶ [Backend Service Stable (prod-was-mig-stable: v1 20대)]
       └─▶  1% 가중치 ──▶ [Backend Service Canary (prod-was-mig-canary: v2  3대)]
비교 기준패턴 A: 단일 MIG 내 카나리패턴 B: 별도 MIG + ALB URL Map 가중치 분할
최소 트래픽 제어 단위인스턴스 대수 비율에 종속 (예: 10대 중 1대 = 최소 10%)인스턴스 대수와 무관하게 1% ~ 99% 단위 정밀 제어 가능
헤더/쿠키 조건부 라우팅불가 (LB가 단일 Backend Service로 취급하여 무작위 분배)특정 HTTP 헤더, 쿠키, URL 파라미터 기반 타겟 라우팅 완벽 지원
권장 적용 대상일반 마이크로서비스 및 내부 백엔드 정기 배포결제·송금·인증 등 1% 단위의 점진적 노출과 QA 헤더 테스트가 필수인 핵심 티어
발표자 노트 (스토리라인 가이드) 무중단 배포와 카나리 전략을 마쳤으니, 이제 세 번째 파트(Autoscaling & Health Check 분리)로 넘어갑니다.
Session 2 · MIG 라이프사이클 (12 / 24) 01:10 ~ 01:25 (Autoscaling & Health Check)

2.12 다중 지표 Autoscaling 평가 알고리즘과 Cool-down 설계

맥락(Why): CPU 사용률 하나만 보고 오토스케일링을 걸면, 외부 DB 지연이나 I/O 대기로 인해 CPU는 낮지만 요청 큐가 폭발하는 상황에서 스케일 아웃이 작동하지 않습니다.
다중 시그널 결합 시 최대값(MAX) 채택 원칙
  • 하나의 Autoscaler에 1) 평균 CPU 사용률(60%), 2) LB 용량 사용률(75%), 3) Cloud Monitoring 커스텀 지표(예: 워커 큐 대기 길이, JVM 활성 스레드 수), 4) 시간대별 스케줄을 동시에 등록할 수 있습니다.
  • Autoscaler는 각 지표가 계산한 필요 대수 중 가장 큰 대수(Max Recommended Size)를 최종 선택하여 안전하게 확장합니다.
초기화 주기(Initialization Period)의 중요성
  • VM이 갓 부팅될 때는 JVM 클래스 로딩과 초기화 작업으로 일시적으로 CPU가 90~100%까지 치솟습니다.
  • coolDownPeriodSec(초기화 주기, 예: 60~90초)를 정확히 설정해야, 부팅 중인 VM의 일시적 CPU 스파이크를 무시하고 연쇄 과잉 확장을 방지합니다.
다중 지표 평가 예시: CPU는 10대를, 큐 적체 지표는 18대를, 스케줄은 15대를 요구할 때
최종 목표 인스턴스 대수 = MAX( CPU 권장 10대, 큐 메트릭 권장 18대, 출근 시간 스케줄 15대 ) ──▶ 즉시 18대로 스케일 아웃!
발표자 노트 (스토리라인 가이드) 확장(Scale-out)만큼이나 위험한 것이 너무 빠른 축소(Scale-in)입니다. 다음 장에서 Scale-in Control을 살펴봅니다.
Session 2 · MIG 라이프사이클 (13 / 24) 01:10 ~ 01:25 (Autoscaling & Health Check)

2.13 급격한 축소로 인한 2차 장애를 막는 Scale-in Control

맥락(Why): 트래픽 스파이크가 잠깐 빠졌다고 100대이던 서버가 단 몇 분 만에 20대로 확 줄어들면, 직후 밀려오는 2차 파도에서 캐시 미스와 커넥션 스톰으로 전면 장애가 발생합니다.
Scale-in Control 미적용 시 플래핑(Flapping) vs 적용 시 완만한 계단식 축소 비교
[미적용 시] 피크 100대 ──(트래픽 3분 감소)──▶ 즉시 20대로 80대 대량 삭제! ──(2분 뒤 트래픽 재유입)──▶ 20대가 과부하로 전멸!
[적용 시]   피크 100대 ──(timeWindow=600초 동안 최대 20% 축소 제한)──▶ 최소 80대 이하로 절대 내려가지 않고 10분간 버퍼 용량 유지!
Scale-in Control 동작 공식
  • 지정된 과거 시간 창(timeWindowSec, 예: 600초) 동안 기록된 최대 피크 대수에서 최대 몇 대(또는 몇 %)까지만 줄일 수 있는지 하한선(Floor)을 설정합니다.
  • 확장(Scale-out) 속도에는 전혀 제약을 주지 않으면서 오직 축소(Scale-in) 속도만 보수적으로 브레이크를 걸어줍니다.
gcloud CLI · Scale-in Control 및 예측형 스케일링 적용
gcloud compute instance-groups managed update-autoscaling prod-was-mig   --region=asia-northeast3   --scale-in-control=max-scaled-in-replicas-percent=20,time-window=600   --cpu-utilization-predictive-method=OPTIMIZE_AVAILABILITY
발표자 노트 (스토리라인 가이드) 오토스케일링을 마쳤으니, 이제 Session 2에서 가장 중요한 아키텍처 원칙인 '두 가지 헬스 체크의 분리'를 2장에 걸쳐 깊게 다룹니다.
Session 2 · MIG 라이프사이클 (14 / 24) 01:10 ~ 01:25 (Autoscaling & Health Check)

2.14 두 가지 헬스 체크의 본질적 차이: Liveness vs Readiness

맥락(Why): GCE에서는 로드 밸런서(Backend Service)에도 헬스 체크를 달고, MIG(Autohealing Policy)에도 헬스 체크를 답니다. 많은 팀이 똑같은 헬스 체크 하나를 만들어 양쪽에 같이 쓰는데, 왜 이것이 시한폭탄일까요?
구분Load Balancer Health Check (Readiness · 수신 준비)MIG Autohealing Health Check (Liveness · 생존 확인)
설정 위치Load Balancer의 Backend Service에 연결MIG의 autoHealingPolicies에 연결
던지는 질문"지금 당장 이 VM에 고객 HTTP 요청을 보내도 정상 처리할 수 있는가?""이 VM의 로컬 프로세스나 OS가 완전히 멈춰서 VM을 부수고 새로 만들어야 하는가?"
실패 시 액션신규 트래픽 라우팅만 즉시 중단!
(VM은 삭제하지 않고 살려둔 채 복구 여부를 매초 다시 확인)
해당 VM을 강제 삭제(Delete)하고 처음부터 새로 생성(Recreate)!
(부팅 및 워밍업까지 수 분간 용량 영구 손실)
검사 범위로컬 앱 상태 + 워밍업 완료 여부 + Graceful Shutdown 플래그오직 로컬 프로세스/데몬 자체의 응답 가능 여부만 검사 (외부 DB/API 검사 절대 금지!)
발표자 노트 (스토리라인 가이드) 만약 두 헬스 체크를 하나로 묶고 거기에 DB 연결 확인 쿼리(`SELECT 1`)를 넣었다면 실제 장애 시 어떤 일이 벌어지는지 다음 장에서 시뮬레이션합니다.
Session 2 · MIG 라이프사이클 (15 / 24) 01:10 ~ 01:25 (Autoscaling & Health Check)

2.15 [장애 사례] DB 30초 순단이 전체 WAS 50대 동시 삭제로 번지는 과정

맥락(Why): 백엔드 데이터베이스가 페일오버나 순단으로 딱 30초 동안 끊겼을 뿐인데, 왜 30초 뒤 DB가 살아났는데도 전체 서비스는 15분 동안 전면 장애에 빠졌을까요?
DB 연결 체크를 포함하는 단일 /health 엔드포인트를 Autohealing에 연결했을 때의 연쇄 자폭 타임라인
[00:00] 백엔드 DB 마스터-슬레이브 페일오버로 인해 30초간 DB 연결 일시 실패 발생
[00:10] WAS 50대의 /health 엔드포인트가 일제히 "DB 연결 불가 -> HTTP 500 Unhealthy" 반환!
[00:25] MIG Autohealer가 "WAS 50대가 전부 고장 났다!"고 오판하여 WAS 인스턴스 대량 강제 삭제 및 재생성(RECREATE) 돌입!
[00:30] DB는 30초 만에 정상 복구 완료! ──▶ 하지만 이미 WAS 서버들은 삭제되어 부팅 중이므로 고객 요청을 받을 서버가 전멸!
[03:00] 새로 뜬 WAS 50대가 동시에 DB 커넥션 풀(수천 개) 생성을 시도하며 DB 재차 과부하 (Thundering Herd) 발생!
올바른 프로덕션 분리 공식
  • LB Readiness (/healthz/ready): 짧은 주기(interval=5s, threshold=2 -> 10초 내 제외). 배포 중이거나 종료 대기(`drain_mode`) 상태일 때 503 반환.
  • MIG Liveness (/healthz/live): 긴 주기(interval=20s, threshold=3 -> 60초 연속 응답 불가 시에만 재생성, initialDelaySec=300). 외부 의존성 없이 로컬 이벤트 루프만 확인!
애플리케이션 엔드포인트 분리 구현 예시
GET /healthz/live  -> return 200 OK (로컬 웹서버 생존만 확인)
GET /healthz/ready -> if (isShuttingDown || !isWarmedUp)
                        return 503 Service Unavailable
                      else return 200 OK
발표자 노트 (스토리라인 가이드) 헬스 체크 분리를 이해했다면, 이제 서버가 내려갈 때 단 1건의 진행 중인 요청도 잃지 않는 Graceful Shutdown 타임라인을 맞춥니다.
Session 2 · MIG 라이프사이클 (16 / 24) 01:10 ~ 01:25 (Autoscaling & Health Check)

2.16 진행 중인 트랜잭션을 지키는 Graceful Shutdown 시간차 공식

맥락(Why): 배포나 스케일 인으로 VM이 삭제될 때, LB의 Connection Draining 설정만 켜두면 왜 여전히 간헐적으로 요청이 끊길까요? 게스트 OS의 종료 속도와 LB의 전파 속도를 맞춰야 합니다.
LB 제어 플레인과 게스트 OS Shutdown Script의 무결점 동기화 시퀀스
[T = 0s]    MIG가 인스턴스 삭제 시작
             ├─▶ 1) LB Backend Service가 해당 VM을 백엔드에서 제외하고 Connection Draining(예: 60초) 타이머 시작
             └─▶ 2) 동시에 VM 내부에 ACPI 종료 신호 전달 ──▶ Shutdown Script 즉시 시작!
[T = 0~5s]  Shutdown Script가 먼저 /healthz/ready를 503으로 바꾸고 5초간 sleep!
             * 이유: 아직 앱 프로세스를 죽이지 않은 상태에서, 전 세계 GFE/Envoy 프록시에 제외 신호가 100% 도달할 시간을 벌어줌!
[T = 5~45s] 웹서버/WAS에 SIGTERM(Graceful Stop) 전달 ──▶ 새로 들어오는 패킷은 0건인 상태에서 기존 처리 중이던 요청만 완료 후 종료!
왜 종료 직전 sleep 5가 핵심인가?
  • 만약 `T=0s`에 ACPI 신호를 받자마자 웹서버가 즉시 리스닝 소켓을 닫아버리면, 아직 제외 신호를 전파받지 못한 일부 엣지 프록시가 `T=0.2s`에 보낸 마지막 요청이 `Connection Refused(502)`를 맞습니다.
  • 따라서 Readiness는 즉시 503으로 내리되, 실제 소켓 종료(`SIGTERM`)는 5~10초 뒤에 수행하는 것이 무결점 배포의 비결입니다.
Backend Service Connection Draining 설정
gcloud compute backend-services update prod-was-bs   --global   --connection-draining-timeout=60s
발표자 노트 (스토리라인 가이드) 여기까지 무상태(Stateless) 클러스터 운영을 완벽히 마스터했습니다. 이제 마지막 Part 4: 상태 유지형(Stateful) MIG로 넘어갑니다.
Session 2 · MIG 라이프사이클 (17 / 24) 01:25 ~ 01:35 (Stateful MIG & Operations)

2.17 언제 Stateful MIG를 사용하는가? (보존되는 4가지 상태)

맥락(Why): 일반 MIG는 VM이 죽고 새로 뜰 때마다 호스트 이름과 IP가 바뀌고 부팅 디스크가 초기화됩니다. 하지만 레거시 금융 대외계 서버나 라이선스 서버, 상태성 클러스터는 어떻게 해야 할까요?
1. 인스턴스 이름 보존
  • VM이 장애로 재생성되어도 fep-gw-01, fep-gw-02 같은 고유 호스트명이 영구 유지됩니다.
2. 디스크 데이터 보존
  • VM이 삭제되어도 부팅/데이터 디스크(PD/Hyperdisk)를 지우지 않고 새로 뜬 VM에 그대로 재마운트합니다.
3. 내부·외부 고정 IP 보존
  • 대외 기관 방화벽 화이트리스트에 등록된 사설 IP와 공인 IP를 재생성 후에도 그대로 다시 물려줍니다.
4. 개별 메타데이터 보존
  • 인스턴스마다 서로 다른 node_id, 샤드 번호, 전용 설정값을 영구 보존합니다.
Stateful MIG의 자동 복구(Autohealing) 동작 흐름
[fep-gw-01 (IP: 10.10.1.50, Disk: fep-disk-01) 장애 발생]
  ──▶ 1) MIG가 고장 난 VM 컴퓨팅 껍데기만 삭제 (디스크 fep-disk-01과 예약된 IP 10.10.1.50은 안전하게 보관!)
  ──▶ 2) 동일한 이름(fep-gw-01)의 새 VM을 생성하면서 기존 fep-disk-01과 IP 10.10.1.50을 그대로 재장착하여 부팅!
발표자 노트 (스토리라인 가이드) Stateful MIG를 설정하는 두 가지 메커니즘인 그룹 공통 정책(Stateful Policy)과 인스턴스별 구성(Per-instance Config)의 차이를 살펴봅니다.
Session 2 · MIG 라이프사이클 (18 / 24) 01:25 ~ 01:35 (Stateful MIG & Operations)

2.18 Stateful Policy(공통 정책) vs Per-instance Config(개별 구성)

맥락(Why): 그룹 내 모든 노드의 디스크와 IP를 똑같이 자동 보존할 것인지, 아니면 노드마다 각기 다른 디스크와 메타데이터를 지정할 것인지에 따라 설정 방식이 나뉩니다.
비교 항목Stateful Policy (그룹 공통 상태 보존 정책)Per-instance Configuration (인스턴스별 개별 구성 · PIC)
적용 범위MIG 내의 모든 인스턴스에 일괄 적용되는 보존 규칙 정의특정 이름을 가진 개별 인스턴스 하나하나마다 고유 리소스 매핑
주요 설정 대상템플릿에 정의된 디스크 이름(`device-name`) 및 네트워크 인터페이스(`nic0`)의 IP 자동 보존 활성화node-01에는 disk-a와 my_id=1을, node-02에는 disk-b와 my_id=2를 명시적으로 지정
반영 방식그룹 정책 업데이트 시 전체 인스턴스에 자동 적용PIC 생성/수정 후 apply-updates-to-instances로 해당 인스턴스에 반영
gcloud CLI · 그룹 전체에 부팅 디스크 및 내부 고정 IP 보존(Stateful Policy) 일괄 활성화
gcloud compute instance-groups managed update prod-stateful-mig   --region=asia-northeast3   --stateful-disk=device-name=boot-disk,auto-delete=on-permanent-instance-deletion   --stateful-internal-ip=interface-name=nic0,auto-delete=on-permanent-instance-deletion
발표자 노트 (스토리라인 가이드) Stateful MIG는 매우 유용하지만 만능은 아닙니다. 도입 전에 아키텍트가 반드시 알고 있어야 할 3가지 치명적 제약사항을 다음 장에서 다룹니다.
Session 2 · MIG 라이프사이클 (19 / 24) 01:25 ~ 01:35 (Stateful MIG & Operations)

2.19 [필수 숙지] Stateful MIG의 3대 구조적 한계

맥락(Why): 고정 IP와 디스크가 보존된다고 해서 모든 서비스를 Stateful MIG로 만들면 안 되는 이유가 있습니다. 특히 '존(Zone) 전체 장애' 시의 동작을 정확히 이해해야 합니다.
제약 1: Autoscaling 절대 불가
  • 각 인스턴스가 고유한 영구 상태와 디스크를 가지고 있으므로, 트래픽에 따라 자동으로 대수를 늘렸다 줄이는 Autoscaling을 동시에 켤 수 없습니다.
  • 용량 증설은 관리자가 명시적으로 수행해야 합니다.
제약 2: 교차 존 자동 페일오버 불가
  • Stateful MIG의 Autohealing은 장애가 발생한 바로 그 존(Zone) 내부에서만 VM을 다시 띄우고 Zonal 디스크를 재부착합니다.
  • 만약 Zone A 전체가 다운되면, Zone A에 있던 Stateful VM이 자동으로 Zone B로 이주하여 살아나지 않습니다! (Proactive Redistribution도 NONE으로 고정됨)
제약 3: 업데이트 시 RECREATE 강제
  • 기존 VM이 잡고 있는 똑같은 이름, 고정 IP, 디스크를 새 VM에 물려주어야 하므로, 새 VM을 옆에 먼저 띄우는 SUBSTITUTE(Surge)가 불가능합니다.
  • 반드시 기존 VM을 먼저 종료한 뒤 새 VM을 띄우는 RECREATE 방식으로만 롤링 업데이트됩니다.
발표자 노트 (스토리라인 가이드) 만약 정말로 특정 존 전체가 죽었을 때 디스크 데이터를 다른 존에서 살려내야 한다면 어떻게 구성할까요? Regional PD 조합을 살펴봅니다.
Session 2 · MIG 라이프사이클 (20 / 24) 01:25 ~ 01:35 (Stateful MIG & Operations)

2.20 존 장애 대비: Regional PD/Hyperdisk와 Stateful 아키텍처

맥락(Why): Zonal 디스크는 해당 존이 죽으면 함께 접근이 막힙니다. 2개 존에 실시간 동기 복제되는 Regional Persistent Disk / Regional Hyperdisk Balanced를 활용하는 방법입니다.
Regional Hyperdisk Balanced (Zone A ↔ Zone B 실시간 동기 복제) 기반 데이터 보호 구조
[정상 시] Zone A의 VM이 [Regional Hyperdisk (Replica: Zone A + Zone B)]를 마운트하여 쓰기 수행 (두 존에 실시간 동기 기록)
[Zone A 전면 장애 시] ──▶ Regional 디스크의 Zone B 복제본은 100% 최신 상태 유지!
                     ──▶ Zone B의 대기(Standby) VM 또는 복구 스크립트가 해당 디스크를 강제 부착(force-attach)하여 데이터 유실(RPO=0) 복구!
아키텍처 의사결정 가이드
  • 패턴 1 (클라우드 네이티브 권장): DB는 Cloud SQL(HA) / AlloyDB / Spanner 등 완전관리형 서비스를 쓰고, 애플리케이션 서버는 100% 무상태(Stateless) Regional MIG로 구성합니다.
  • 패턴 2 (자체 클러스터링 솔루션): Kafka, Elasticsearch, Redis Cluster는 3개 존에 걸친 Stateful Regional MIG로 구성해 자체 쿼럼 복제를 수행합니다.
  • 패턴 3 (단일 액티브 상용 솔루션): 2개 존에 Regional Hyperdisk를 공유하거나 Terraform으로 개별 VM + 내부 Passthrough NLB 페일오버를 구성합니다.
고정 아웃바운드 IP가 목적일 때의 팁
  • 외부 기관 방화벽 화이트리스트 때문에 VM마다 고정 공인 IP를 주려고 Stateful MIG를 쓸 필요는 없습니다!
  • 일반 Stateless MIG 앞단에 고정 IP가 할당된 Cloud NAT를 두면, VM이 수백 번 바뀌어도 외부 기관은 항상 동일한 Cloud NAT 공인 IP로만 인식합니다.
발표자 노트 (스토리라인 가이드) 실무 운영자가 MIG에 속한 VM을 다룰 때 가장 흔히 저지르는 명령어 실수를 다음 장에서 짚어봅니다.
Session 2 · MIG 라이프사이클 (21 / 24) 01:25 ~ 01:35 (Stateful MIG & Operations)

2.21 [운영 주의] MIG 소속 VM은 절대 compute instances API로 직접 제어하지 마십시오

맥락(Why): 점검을 위해 MIG에 속한 특정 VM 하나를 콘솔이나 CLI(`gcloud compute instances stop/delete`)로 직접 내렸는데, 몇 초 뒤 불사조처럼 다시 살아나거나 상태가 꼬이는 이유는 무엇일까요?
단일 VM API 직접 호출 시의 충돌 vs 올바른 MIG 전용 API 호출 비교
[잘못된 방법] 운영자가 gcloud compute instances delete was-vm-01 실행
              ──▶ MIG 컨트롤러: "앗! 목표 대수가 6대인데 1대가 비정상 유실되었다!" ──▶ 즉시 새 VM을 다시 생성해 버림!

[올바른 방법] 운영자가 gcloud compute instance-groups managed delete-instances prod-was-mig --instances=was-vm-01 실행
              ──▶ MIG 컨트롤러: "관리자가 명시적으로 was-vm-01 제거를 지시했군." ──▶ 목표 대수(targetSize)를 6 -> 5로 차감하며 영구 삭제!
수행하려는 운영 작업절대 쓰면 안 되는 명령 (단일 VM API)반드시 사용해야 하는 올바른 명령 (MIG API)
특정 VM을 그룹에서 영구 제거 및 삭제compute instances deletecompute instance-groups managed delete-instances
특정 VM만 새 이미지/디스크로 강제 재구축compute instances reset / stopcompute instance-groups managed recreate-instances
특정 VM은 삭제하지 않고 MIG 관리에서만 분리(디버깅용)지원 안 됨compute instance-groups managed abandon-instances
발표자 노트 (스토리라인 가이드) 부팅 시간을 30초보다도 더 줄여 수 초 내에 투입하고 싶을 때 사용하는 Standby Pool 기능을 살펴봅니다.
Session 2 · MIG 라이프사이클 (22 / 24) 01:25 ~ 01:35 (Stateful MIG & Operations)

2.22 MIG Standby Pool(대기 풀)을 활용한 초고속 스케일 아웃

맥락(Why): Golden Image를 써도 OS 부팅과 무거운 애플리케이션 초기화에 2~3분이 걸리는 레거시 워크로드라면, 미리 초기화까지 끝내고 일시 중지(Stopped/Suspended) 상태로 대기시키는 풀을 운영할 수 있습니다.
MIG Standby Pool (Stopped / Suspended VM 풀) 기반 즉시 투입 구조
[Standby Pool: 미리 부팅·초기화 후 메모리 상태를 얼려둔(Suspended) VM 5대 대기 (CPU 요금 미과금, 메모리/디스크 보관료만 과금)]
        │
        ▼ (스케일 아웃 신호 발생 시 새로 VM을 생성하는 대신 Standby Pool에서 즉시 깨움!)
[Active Pool: 메모리 상태 그대로 수 초 만에 Resume 되어 즉시 트래픽 처리 투입!] (빠진 Standby Pool은 백그라운드에서 다시 보충)
Suspended(절전) vs Stopped(중지) 대기 풀
  • Suspended Pool: 게스트 OS의 RAM 메모리 상태를 그대로 디스크에 얼려두었다가 ACPI S3 절전 해제처럼 깨우므로, 앱 재기동 없이 가장 빠르게 투입됩니다.
  • Stopped Pool: 디스크 프로비저닝과 사전 스크립트 실행을 마친 뒤 전원을 꺼둔 상태로, 컴퓨팅 비용 없이 디스크 비용만 내며 대기합니다.
gcloud CLI · 일시 중지(Suspended) 대기 풀 3대 설정
gcloud compute instance-groups managed update prod-was-mig   --region=asia-northeast3   --standby-policy-mode=scale-out-pool   --suspended-pool-size=3
발표자 노트 (스토리라인 가이드) Session 2의 전체 설계 원칙을 한 장의 체크리스트로 정리합니다.
Session 2 · MIG 라이프사이클 (23 / 24) 01:25 ~ 01:35 (Session 2 Summary)

2.23 프로덕션 MIG 아키텍처 7대 필수 점검표

맥락(Why): 클러스터를 프로덕션에 투입하기 전, 인프라 운영팀이 코드 리뷰(Terraform PR)에서 반드시 확인해야 할 7가지 설정 항목입니다.
점검 항목권장 프로덕션 설정값미준수 시 발생 가능한 장애 리스크
1. 그룹 유형 및 분산 ShapeRegional MIG + BALANCED (또는 EVEN)단일 존 장애 시 서비스 중단 또는 Stockout 시 스케일 아웃 멈춤
2. 재배치 정책 (Redistribution)무상태는 PROACTIVE, 캐시/상태성은 NONE로컬 캐시 서버가 대수 균형을 맞추느라 불필요하게 재시작됨
3. 롤링 배포 용량 보장maxUnavailable = 0, maxSurge >= 3배포 중 가용 용량 축소로 인한 응답 지연 또는 순차 배포로 인한 시간 지연
4. 예열 대기 시간minReadySec = 30 ~ 60s포트만 열리고 JIT 워밍업이 안 된 신규 VM에 트래픽이 몰려 타임아웃 발생
5. 급격한 축소 방어scale_in_control (10분간 최대 20% 축소)일시적 트래픽 감소 직후 서버 대량 삭제로 2차 트래픽 유입 시 전면 장애
6. 헬스 체크 완벽 분리LB(/healthz/ready) vs Autohealing(/healthz/live)하위 DB/Redis 일시 순단 시 전체 WAS 서버가 동시에 삭제되는 연쇄 자폭
7. 우아한 종료 시퀀스Draining 60s + Shutdown Script(sleep 5 후 종료)배포 및 스케일 인 시 진행 중이던 인플라이트 요청 502 에러 발생
발표자 노트 (스토리라인 가이드) Session 2의 마지막 슬라이드인 실전 Q&A로 이어집니다.
Session 2 · MIG 라이프사이클 (24 / 24) 01:25 ~ 01:35 (Session 2 Wrap-up Q&A)

2.24 Session 2 실전 아키텍처 핵심 Q&A

맥락(Why): MIG 롤링 업데이트, 오토스케일링, 헬스 체크 및 Stateful 운영과 관련해 현장에서 가장 많이 나오는 질문 4가지입니다.
Q1. 롤링 업데이트 도중 새 버전에 버그가 발견되면 즉시 멈출 수 있나요?
  • A: 네, 즉시 rolling-action start-update --version=template=이전버전(v1) 명령을 실행하면 진행 중이던 `v2` 롤아웃을 그 자리에서 중단하고, 이미 `v2`로 넘어간 인스턴스들만 다시 `v1`으로 안전하게 되돌립니다.
Q2. 오토스케일러가 줄어들 때(Scale-in) 어떤 존의 어떤 VM부터 먼저 죽이나요?
  • A: 먼저 3개 존의 대수 균형을 맞추기 위해 가장 인스턴스가 많은 존을 고르고, 그 안에서 구버전 템플릿 VM → 아직 부팅 중인 VM → 가장 최근에 생성된(또는 오래된) VM 순으로 선별하여 종료합니다.
Q3. 메모리 사용률로 오토스케일링을 걸려면 어떻게 해야 하나요?
  • A: Golden Image에 Ops Agent를 설치한 뒤, Autoscaler의 커스텀 메트릭 조건에 agent.googleapis.com/memory/percent_used 지표를 지정하고 필터로 state = "used"를 걸면 정확한 가용 메모리 기준 확장이 가능합니다.
Q4. 문제 생긴 VM 하나만 로그 분석을 위해 살려두고 새 VM을 보충하려면요?
  • A: gcloud compute instance-groups managed abandon-instances 명령을 쓰면 해당 VM은 종료되지 않고 그 자리에서 단독 VM으로 독립하며, MIG는 줄어든 1대만큼 즉시 새 정상 VM을 생성해 클러스터 용량을 채웁니다.
발표자 노트 (스토리라인 가이드) Session 2의 24장도 마쳤습니다. 이제 가장 비중이 높고 중요한 핵심 네트워크 세션인 Session 3(28장)로 들어갑니다.
Session 3 · Cloud Load Balancing (1 / 28) 01:35 ~ 01:48 (SDN & Proxy Architecture)

3.1 타 클라우드 가상 어플라이언스 LB의 한계와 Pre-warming 문제

맥락(Why): 타 클라우드에서 대형 프로모션 전에 왜 로드 밸런서 용량을 미리 늘려달라(Pre-warming)고 티켓을 열거나 서서히 트래픽을 올려야 할까요? 그 구조적 원인부터 짚어봅니다.
인스턴스(가상 어플라이언스) 기반 LB vs Google Cloud 소프트웨어 정의(SDN) LB 비교
[타 클라우드 인스턴스 기반 LB]
  고객 VPC 서브넷 내부에 ENI(네트워크 카드)를 가진 숨겨진 LB 가상머신(노드)들을 프로비저닝하고 DNS( 다중 A레코드)로 분산
  ──▶ 문제점 1: 초당 요청이 1만 -> 100만으로 급증하면 LB 가상머신 자체를 새로 띄우고 DNS TTL이 퍼지는 데 수 분 소요 (그 사이 패킷 드롭!)
  ──▶ 문제점 2: 고객 서브넷의 사설 IP를 LB 노드들이 갉아먹음

[Google Cloud 소프트웨어 정의 LB]
  고객 VPC 안에 생성되는 개별 장비가 아님! 전 세계 80+ 엣지 거점의 GFE/Maglev 및 호스트 하이퍼바이저의 Andromeda SDN에 라우팅 규칙만 배포!
  ──▶ 결과: 평소 0 RPS이던 VIP에 1초 만에 100만 RPS가 꽂혀도, 이미 상시 가동 중인 글로벌 엣지 플릿이 예열(Pre-warming) 없이 즉시 처리!
발표자 노트 (스토리라인 가이드) Session 3의 첫 장입니다. 기존 인스턴스 기반 LB와의 근본적 차이를 먼저 각인시켜 주세요.
Session 3 · Cloud Load Balancing (2 / 28) 01:35 ~ 01:48 (SDN & Proxy Architecture)

3.2 GCP Load Balancing을 움직이는 4대 핵심 기술 스택

맥락(Why): Google Cloud 공식 문서에 명시된 4가지 핵심 기술(Maglev, GFE, Envoy, Andromeda)이 패킷의 여정에서 각각 어느 위치를 담당하는지 전체 지도를 그립니다.
글로벌 엣지 PoP부터 고객 VPC 백엔드 VM까지의 4대 엔진 배치도
[인터넷 클라이언트]
        │ (단일 글로벌 Anycast VIP 접속)
        ▼
[전 세계 80+ 엣지 PoP] ──▶ 1. Maglev (L3/L4 초고속 Consistent Hashing 패킷 분산기)
                       ──▶ 2. GFE (Google Front End: 최단 거리 TCP/TLS 종료, Cloud Armor WAF, DDoS 흡수)
                       ──▶ 3. Envoy (차세대 L7 프록시 엔진: 정규식/가중치 라우팅, 헤더 변환, mTLS)
        │ (Google 전용 광케이블 백본망 경유)
        ▼
[고객 VPC 호스트 서버] ──▶ 4. Andromeda SDN (호스트 하이퍼바이저/Titanium 내장 가상 네트워크 스택: 캡슐화 및 무중단 직접 전달)
        │
        ▼
[백엔드 MIG VM / GKE NEG]
발표자 노트 (스토리라인 가이드) 4대 엔진 중 최전방에서 패킷을 받아내는 Maglev의 동작 원리부터 하나씩 깊게 들어갑니다.
Session 3 · Cloud Load Balancing (3 / 28) 01:35 ~ 01:48 (SDN & Proxy Architecture)

3.3 Maglev: 어떻게 수백 대의 분산 라우터가 상태 공유 없이 같은 서버를 고르는가?

맥락(Why): 일반적인 L4 장비는 Active-Standby로 세션 테이블을 동기화하느라 확장에 한계가 있습니다. Google이 NSDI 학회에 공개한 Maglev는 어떻게 수평 확장을 달성했을까요?
1. Maglev Consistent Hashing (일관된 해싱)
  • 클라이언트 패킷의 5-Tuple(Src IP, Dst IP, Src Port, Dst Port, Protocol)을 해싱하여 크기 `M`(예: 65,537)의 순열 조회 테이블(Lookup Table)에 매핑합니다.
  • 모든 Maglev 노드가 동일한 결정론적 해시 테이블 알고리즘을 공유하므로, 노드 간에 세션 상태를 동기화하지 않아도 어느 Maglev 노드로 패킷이 들어오든 동일한 백엔드로 패킷을 보냅니다.
2. 백엔드 변경 시 충격 최소화 + 로컬 Conntrack
  • 만약 앞단 BGP ECMP 경로가 바뀌거나 뒤쪽 백엔드 풀이 증감하더라도, Consistent Hashing 특성 덕분에 전체 연결의 극히 일부만 재조정됩니다.
  • 또한 각 노드의 로컬 Connection Tracking 테이블이 이미 맺어진 활성 TCP 세션을 끝까지 원래 백엔드로 고정시켜 세션 끊김을 방지합니다.
핵심 효과: 상태 동기화 병목 제거 = 무한한 수평 확장성
[BGP ECMP 라우터] ──(아무 Maglev 노드로 패킷 전달)──▶ [Maglev Node 1..N (동일한 Consistent Hash 링 보유)] ──▶ 동일한 타겟 GFE/VM으로 정확히 전달!
발표자 노트 (스토리라인 가이드) Maglev 바로 뒤에서 TCP와 TLS를 받아주는 GFE가 어떻게 사용자 체감 속도를 높이는지 살펴봅니다.
Session 3 · Cloud Load Balancing (4 / 28) 01:35 ~ 01:48 (SDN & Proxy Architecture)

3.4 GFE(Google Front End) 엣지 TLS 종료와 RTT 단축 원리

맥락(Why): 백엔드 서버는 서울 리전 하나에만 있는데, 싱가포르나 유럽에 있는 사용자가 접속할 때 왜 리전 LB보다 Global External ALB(Premium Tier)가 훨씬 빠를까요?
일반 인터넷 경유(Standard Tier) vs 가장 가까운 GFE에서 TCP/TLS 종료(Premium Tier) RTT 비교
[일반 리전 LB]     런던 사용자 ◀──(공용 인터넷 해저케이블 왕복 220ms × 3회 핸드셰이크 = 첫 요청까지 660ms 소요!)──▶ 서울 백엔드 서버
[Global ALB (GFE)] 런던 사용자 ◀──(런던 로컬 GFE PoP와 5ms 만에 TCP+TLS 핸드셰이크 완료!)──▶ [런던 GFE] ══(Google 전용 광케이블 + 기존 풀링 연결)══▶ 서울 백엔드
1. TCP 및 TLS 핸드셰이크 거리 단축
  • TCP 3-Way Handshake(1 RTT)와 TLS 1.3 Handshake(1 RTT)는 전 세계 80개 이상 거점 중 사용자와 가장 가까운 로컬 도시의 GFE에서 즉시 완료(수 ms 이내)됩니다.
  • GFE와 서울 백엔드 사이는 이미 맺어져 있는 고속 Keep-alive 연결 풀을 재사용하므로 왕복 횟수가 획기적으로 줄어듭니다.
2. 엣지에서의 L3/L4 SYN Flood 완벽 흡수
  • GFE는 완전히 성립된 정상 HTTP 요청만 고객 VPC 백엔드로 전달하므로, 대규모 TCP SYN Flood 같은 L3/L4 DDoS 공격은 전 세계 엣지 PoP에서 자연 흡수되어 백엔드 VM까지 도달하지 않습니다.
발표자 노트 (스토리라인 가이드) L7 Application Load Balancer를 만들 때 선택하게 되는 Classic 모드와 차세대 Envoy 기반(`*_MANAGED`) 모드의 차이를 비교합니다.
Session 3 · Cloud Load Balancing (5 / 28) 01:35 ~ 01:48 (SDN & Proxy Architecture)

3.5 Classic ALB(EXTERNAL) vs 차세대 Envoy ALB(*_MANAGED)

맥락(Why): 콘솔이나 Terraform에서 ALB를 만들 때 `load_balancing_scheme`을 구형 `EXTERNAL`로 할지, 차세대 `EXTERNAL_MANAGED` / `INTERNAL_MANAGED`로 할지에 따라 쓸 수 있는 트래픽 제어 기능이 완전히 달라집니다.
비교 항목Classic Application LB (EXTERNAL)Global External ALB (EXTERNAL_MANAGED)Regional / Cross-Region Internal ALB (*_MANAGED)
프록시 데이터 플레인1세대 GFE 단독 처리GFE + Envoy 프록시 결합 (권장 표준)Envoy 프록시 기반
고급 라우팅 (Envoy)기본 호스트·경로 매칭만 가능가중치 기반 트래픽 분할(Weight Split), 정규식(Regex) 매칭, 헤더 기반 라우팅, 요청/응답 헤더 추가·삭제, 트래픽 미러링, 이상 탐지(Outlier Detection), 상호 TLS(mTLS) 전부 지원!
Proxy-only Subnet 필요 여부불필요 (Google 공용 대역 사용)불필요 (Google 공용 대역 사용)필수! (고객 VPC 내 전용 서브넷에서 SNAT IP 할당)
발표자 노트 (스토리라인 가이드) 위 표의 마지막 줄에서 본 'Proxy-only Subnet'이 왜 Regional ALB와 Internal ALB에서 필수인지 다음 장에서 해부합니다.
Session 3 · Cloud Load Balancing (6 / 28) 01:35 ~ 01:48 (SDN & Proxy Architecture)

3.6 왜 Internal ALB는 Proxy-only Subnet을 요구하는가?

맥락(Why): Internal ALB나 Regional External ALB를 만들려고 하면 먼저 `--purpose=REGIONAL_MANAGED_PROXY` 서브넷을 만들라고 합니다. 이 서브넷의 IP는 누가, 어떻게 쓰는 걸까요?
Internal ALB(Envoy 프록시 풀)가 Proxy-only Subnet의 IP를 빌려 백엔드 VM과 통신하는 과정
[클라이언트 VM (10.10.1.5)]
        │ 1) 패킷 전송 (Src: 10.10.1.5 ──▶ Dst: Internal ALB VIP 10.10.2.99)
        ▼
[Google 관리형 Envoy 프록시 풀 (고객 VPC의 Proxy-only Subnet 10.129.0.0/23에서 IP들을 자동 대여하여 장착!)]
        │ 2) 기존 연결 종료 후 새 TCP 연결 생성! (Src: 10.129.0.15 [Proxy-only IP로 SNAT!] ──▶ Dst: 백엔드 VM 10.10.2.10)
        ▼
[백엔드 WAS VM (10.10.2.10)]  * 주의: 백엔드 VM 입장에서 패킷의 출발지 IP는 클라이언트가 아니라 10.129.0.0/23 대역입니다!
Proxy-only Subnet의 3가지 핵심 특징
  • 1. Envoy 전용 SNAT IP 풀: Google이 관리하는 Envoy 프록시 인스턴스들이 고객 VPC 안의 백엔드 VM으로 패킷을 보낼 때 출발지 IP로 사용하는 전용 대역입니다.
  • 2. 리전당 1개만 생성하여 전체 LB가 공유: LB마다 만들 필요 없이, VPC 내 리전당 딱 1개의 ACTIVE Proxy-only Subnet만 만들면 그 리전의 모든 Envoy LB가 함께 씁니다.
  • 3. 일반 VM 생성 불가: 오직 Google 관리형 프록시만 IP를 가져갈 수 있으며 고객이 직접 VM을 띄울 수는 없습니다.
가장 흔한 방화벽 실수!
  • 백엔드 VM 앞단 방화벽에 클라이언트 서브넷(`10.10.1.0/24`)만 허용하고 Proxy-only Subnet(`10.129.0.0/23`) 허용을 빼먹으면 100% 연결 타임아웃(502)이 발생합니다!
발표자 노트 (스토리라인 가이드) Proxy-only Subnet의 크기를 얼마나 크게 잡아야 프록시 스케일 아웃 시 IP 고갈이 나지 않는지 확인합니다.
Session 3 · Cloud Load Balancing (7 / 28) 01:35 ~ 01:48 (SDN & Proxy Architecture)

3.7 Proxy-only Subnet 크기 산정 공식과 BACKUP 서브넷 무중단 마이그레이션

맥락(Why): 처음에 Proxy-only Subnet을 너무 작게(`/28` 등) 만들면, 나중에 트래픽이 늘어 Envoy 프록시가 스케일 아웃될 때 IP가 모자라 확장이 막힙니다. 얼마나 크게 잡아야 할까요?
구분최소 허용 크기프로덕션 표준 권장 크기대규모 엔터프라이즈 권장 크기
CIDR 프리픽스 및 IP 수/26 (64개 IP)/23 (512개 IP · 공식 권장 기본값)/22 ~ /20 (1,024 ~ 4,096개 IP)
적용 환경단순 기능 테스트용 샌드박스일반 프로덕션 리전 환경다수의 Internal/Regional ALB를 운영하거나 초당 수만 RPS 이상을 처리하는 핵심 리전
gcloud CLI · 만약 기존 Proxy-only Subnet이 꽉 찼을 때 무중단으로 새 대역으로 교체하는 절차(BACKUP -> ACTIVE 승격)
# 1. 더 큰 대역(/22)을 가진 신규 Proxy-only Subnet을 먼저 BACKUP 역할로 생성
gcloud compute networks subnets create proxy-only-seoul-v2   --purpose=REGIONAL_MANAGED_PROXY --role=BACKUP --region=asia-northeast3 --network=prod-vpc --range=10.130.0.0/22

# 2. 방화벽에 신규 대역(10.130.0.0/22)을 추가 허용한 뒤, 신규 서브넷을 ACTIVE로 승격 (기존 연결 Draining 후 무중단 전환!)
gcloud compute networks subnets update proxy-only-seoul-v2 --role=ACTIVE --region=asia-northeast3 --drain-timeout=300s
발표자 노트 (스토리라인 가이드) 여기까지 Part 1(SDN & Proxy 아키텍처)을 마쳤습니다. 이제 Part 2(Proxy LB vs Passthrough LB 패킷 흐름 및 커널 DSR 원리)로 넘어갑니다.
Session 3 · Cloud Load Balancing (8 / 28) 01:48 ~ 02:02 (Proxy vs Passthrough & DSR)

3.8 Proxy 기반 LB의 패킷 변환 구조와 클라이언트 원IP 추출

맥락(Why): Application Load Balancer(L7)와 Proxy Network Load Balancer(L4)는 모두 프록시 방식입니다. 패킷이 프록시를 지날 때 IP 헤더와 HTTP 헤더가 어떻게 바뀌는지 확인합니다.
Proxy LB에서 두 개의 독립된 TCP 세션 분리 및 X-Forwarded-For 헤더 자동 주입 과정
[클라이언트 단말 (공인 IP: 203.0.113.7)]
   │  * TCP 세션 #1: Src IP = 203.0.113.7  ──▶  Dst IP = 34.120.55.10 (ALB VIP)
   ▼
[GFE / Envoy 프록시 (TCP 및 TLS 종료 후 HTTP 요청 파싱)]
   │  * TCP 세션 #2: Src IP = 35.191.x.x (또는 Proxy-only IP)  ──▶  Dst IP = 10.10.1.12 (백엔드 VM NIC IP)
   │  * 자동 추가되는 HTTP 헤더: X-Forwarded-For: 203.0.113.7, 34.120.55.10  /  X-Forwarded-Proto: https
   ▼
[백엔드 WAS VM (10.10.1.12)]
L7 ALB에서 실제 클라이언트 IP 읽는 법
  • X-Forwarded-For 헤더의 뒤에서 두 번째 IP(또는 클라이언트가 위조 헤더를 붙였을 때를 대비해 뒤에서 N번째 신뢰 홉)가 GFE가 직접 관측한 실제 클라이언트 IP입니다.
  • Envoy 기반 ALB에서는 커스텀 요청 헤더 기능으로 X-Client-Geo-Location: {client_region}이나 {client_ip_address} 변수를 별도 헤더에 깔끔하게 담아 백엔드로 넘길 수도 있습니다.
L4 Proxy NLB에서 클라이언트 IP 읽는 법
  • HTTP가 아닌 순수 TCP 프록시(Proxy NLB)에서는 HTTP 헤더를 넣을 수 없으므로, Target TCP Proxy 설정에서 --proxy-header=PROXY_V1을 활성화합니다.
  • 백엔드 서버(Nginx/HAProxy 등)에서 PROXY protocol 파싱을 켜면 원본 클라이언트 IP를 정확히 복원합니다.
발표자 노트 (스토리라인 가이드) 그렇다면 프록시를 거치지 않고 L3 소켓 레벨에서 클라이언트 원본 IP와 패킷을 손대지 않고 그대로 전달하는 Passthrough LB는 어떻게 동작할까요?
Session 3 · Cloud Load Balancing (9 / 28) 01:48 ~ 02:02 (Proxy vs Passthrough & DSR)

3.9 Passthrough 기반 LB(NLB)의 무변조 패킷 전달과 DSR 구조

맥락(Why): 특수 금융 프로토콜, UDP 실시간 미디어, 방화벽 어플라이언스처럼 패킷 헤더(Src IP/Port)가 단 1비트도 바뀌면 안 되거나 초저지연이 필요할 때 Passthrough NLB를 사용합니다.
Passthrough Network Load Balancer의 패킷 무변조 전달 및 Direct Server Return(DSR) 흐름
[클라이언트 (10.20.1.50)]
   │  * 요청 패킷: Src IP = 10.20.1.50  ──▶  Dst IP = 10.10.99.99 (Internal NLB VIP)
   ▼
[Andromeda SDN (프록시 서버 없음! 패킷 헤더의 Src/Dst IP를 전혀 고치지 않고 그대로 캡슐화하여 백엔드 VM 호스트로 워프!)]
   │  * 백엔드 VM의 ens4 랜카드에 도착한 패킷: Src IP = 10.20.1.50 (원본 그대로!)  ──▶  Dst IP = 10.10.99.99 (VIP 그대로!)
   ▼
[백엔드 VM (자신의 원래 IP는 10.10.1.12)]
   │  * 응답 패킷(DSR): 백엔드 VM이 직접 Src IP = 10.10.99.99 (VIP)  ──▶  Dst IP = 10.20.1.50 으로 클라이언트에게 바로 응답!
Passthrough NLB의 3대 핵심 강점
  • 1. 클라이언트 원본 IP 100% 보존: 별도의 `XFF`나 `PROXY protocol` 파싱 없이 애플리케이션 소켓에서 `getpeername()`을 호출하면 실제 클라이언트 IP가 그대로 나옵니다.
  • 2. 프록시 홉 지연 제로(Zero Extra Hop): 중간 프록시 VM을 거치지 않고 호스트 SDN 간 직접 통신하므로 일반 VM 간 직접 통신과 동일한 지연 시간을 보장합니다.
  • 3. 모든 포트(`--ports=ALL`) 지원: TCP/UDP 특정 포트뿐만 아니라 전체 포트 대역을 단일 VIP로 묶을 수 있습니다.
방화벽 허용 대상의 차이!
  • SNAT가 일어나지 않으므로, 백엔드 VM 인바운드 방화벽에는 프록시 대역이 아니라 실제 클라이언트 IP 대역(예: `10.20.1.0/24`)과 헬스 체크 대역을 허용해야 합니다!
발표자 노트 (스토리라인 가이드) 네트워크 엔지니어들이 가장 흥미로워하는 커널 딥다이브 슬라이드로 이어집니다.
Session 3 · Cloud Load Balancing (10 / 28) 01:48 ~ 02:02 (Proxy vs Passthrough & DSR)

3.10 [커널 딥다이브] 백엔드 VM이 LB VIP 패킷을 내 것처럼 받는 원리

맥락(Why): 원래 리눅스 커널은 내 네트워크 카드(NIC)에 할당된 IP(`10.10.1.12`)가 아닌 다른 목적지 IP(`10.10.99.99`)로 온 패킷은 즉시 드롭합니다. 누가, 어떻게 커널을 속이고 있을까요?
백엔드 VM 내부에서 실행한 로컬 라우팅 테이블 조회 결과 (ip route show table local proto 66)
$ ip addr show ens4
  inet 10.10.1.12/32 brd 10.10.1.12 scope global dynamic ens4   # <-- NIC에는 내 IP(10.10.1.12)만 보입니다.

$ ip route show table local proto 66
  local 10.10.99.99 dev ens4 proto 66 scope host                # <-- 숨겨진 local 테이블에 LB VIP(10.10.99.99)가 등록되어 있습니다!
1단계: 메타데이터에 VIP 전파
  • VM이 Passthrough NLB의 백엔드 그룹에 포함되면, Andromeda 제어 플레인이 해당 VM의 메타데이터(forwarded-ips)에 LB의 VIP 주소를 실시간으로 추가합니다.
2단계: Guest Agent 라우트 주입
  • VM 내부에서 상시 실행 중인 google-guest-agent 데몬이 메타데이터 변화를 감지하여, 커널의 local 라우팅 테이블에 proto 66으로 VIP를 자동 삽입합니다.
3단계: 로컬 수신 및 DSR 응답
  • 리눅스 커널은 local 테이블에 적힌 IP를 자기 자신의 로컬 IP로 취급하므로 패킷을 드롭하지 않고 애플리케이션(`0.0.0.0:8080`)에 전달하며, 응답도 VIP로 직접 보냅니다!
발표자 노트 (스토리라인 가이드) 이 `proto 66` 원리를 알면 실무에서 겪는 두 가지 난해한 네트워크 미스터리가 단번에 풀립니다. 다음 장에서 확인합니다.
Session 3 · Cloud Load Balancing (11 / 28) 01:48 ~ 02:02 (Proxy vs Passthrough & DSR)

3.11 proto 66 원리로 푸는 2가지 실전 네트워크 미스터리

맥락(Why): 커널의 `local` 라우팅 테이블 동작을 이해하면, 왜 커스텀 이미지에서 NLB 헬스 체크가 죽는지, 왜 백엔드 서버가 자기 LB VIP를 호출하면 안 되는지 명확해집니다.
미스터리 1: 방화벽도 다 열었는데 NLB 헬스 체크가 100% 실패해요!
  • 원인: 보안팀에서 자체 OS 이미지를 하드닝하면서 "불필요해 보이는 데몬"이라며 google-guest-agent 서비스를 비활성화했거나 삭제한 경우입니다.
  • 결과: proto 66 로컬 라우트가 커널에 주입되지 않으므로, LB가 VIP를 목적지로 찍어서 보낸 헬스 체크 패킷을 게스트 커널이 전부 드롭해 버립니다!
  • 조치: systemctl status google-guest-agent 가동 확인 및 ip route show table local proto 66 출력 확인.
미스터리 2: 백엔드 VM이 자기가 속한 NLB VIP를 호출하면 로드밸런싱이 안 돼요! (Hairpinning)
  • 원인: 백엔드 VM(`was-01`) 내부에는 이미 `local 10.10.99.99(VIP)` 라우트가 들어 있습니다.
  • 결과: `was-01`이 `10.10.99.99`로 패킷을 보내면, 패킷이 가상 랜카드 밖(Andromeda)으로 나가서 다른 서버(`was-02`, `was-03`)로 분산되는 것이 아니라, 리눅스 커널 내부에서 즉시 자기 자신(Loopback)에게 100% 꺾여 들어갑니다!
  • 조치: 백엔드가 자기 자신의 LB를 호출해야 하는 구조라면 Passthrough NLB 대신 Internal ALB(Proxy 기반)를 사용해야 정상 분산됩니다.
발표자 노트 (스토리라인 가이드) Part 2를 마무리하며 어떤 워크로드에 Proxy를 쓰고 어떤 워크로드에 Passthrough를 쓸지 한 장의 표로 정리합니다.
Session 3 · Cloud Load Balancing (12 / 28) 01:48 ~ 02:02 (Proxy vs Passthrough & DSR)

3.12 아키텍트를 위한 Proxy LB vs Passthrough LB 최종 선택 기준

맥락(Why): 신규 서비스를 구축할 때 L7 Proxy(ALB), L4 Proxy(Proxy NLB), L4 Passthrough(Passthrough NLB) 중 무엇을 골라야 할지 결정하는 기준표입니다.
판단 기준L7 Application LB (Proxy)L4 Proxy Network LB (Proxy)L4 Passthrough Network LB (DSR)
주요 대상 프로토콜HTTP/1.1, HTTP/2, HTTP/3(QUIC), gRPC, WebSocket비 HTTP 계열 TCP 프로토콜 (커스텀 바이너리 TCP, TLS 패스스루)TCP, UDP, ESP, GRE, ICMP 및 모든 IP 프로토콜 (전체 포트 동시 처리 가능)
핵심 기능 우위URL/헤더 분기, 카나리 가중치, Cloud Armor WAF, Cloud CDN, 인증서 관리글로벌/리전 Anycast 수신, 멀티 리전 TCP 페일오버, PROXY protocol초저지연, 원본 Client IP 무변조 보존, 대칭 해싱(`--next-hop-ilb`)
클라이언트 자기 호출정상 분산 가능 (프록시 경유)정상 분산 가능 (프록시 경유)불가 (커널 local 테이블로 인해 자기 자신에게만 연결됨)
대표 적용 워크로드모든 표준 웹 프론트엔드, REST/gRPC API 게이트웨이, 마이크로서비스글로벌 게임 TCP 서버, 사설망 내 TLS 종료 대행실시간 UDP 미디어/VoIP, 서드파티 방화벽(NVA) 클러스터, 고성능 DB/캐시 VIP
발표자 노트 (스토리라인 가이드) 이제 Part 3(컴포넌트 체인 해부 및 하이브리드 BGP 연동)로 넘어갑니다.
Session 3 · Cloud Load Balancing (13 / 28) 02:02 ~ 02:16 (Components & Hybrid Networking)

3.13 GCP Load Balancer의 5단계 모듈형 조립 체인 구조도

맥락(Why): 왜 GCP에서는 로드 밸런서 하나를 만들 때 5개의 리소스를 레고 블록처럼 연결하도록 설계했을까요? 각 블록의 정확한 경계를 도식화합니다.
프론트엔드 진입점부터 백엔드 워크로드까지 이어지는 5단계 리소스 체인
[1. Forwarding Rule]        ──▶ "어떤 IP(VIP)와 포트로 트래픽을 받을 것인가?" (예: 34.120.1.1:443, PREMIUM Tier)
         │
         ▼
[2. Target (HTTPS) Proxy]   ──▶ "어떻게 TLS를 종료하고 어떤 인증서/보안 정책을 적용할 것인가?" (Certificate Manager, TLS 1.3)
         │
         ▼
[3. URL Map]                ──▶ "호스트명(Host)과 경로(Path)/헤더를 보고 어느 백엔드 서비스로 보낼 것인가?" (/api -> BS-A, /static -> GCS)
         │
         ▼
[4. Backend Service]        ──▶ "어떻게 헬스 체크하고, 부하를 분산(RATE/UTILIZATION)하며, WAF(Cloud Armor)와 Draining을 걸 것인가?"
         │
         ▼
[5. Instance Group / NEG]   ──▶ "실제 패킷을 처리할 서버(MIG VM)나 컨테이너 파드(Zonal NEG) 또는 온프레미스 IP(Hybrid NEG)는 어디인가?"
발표자 노트 (스토리라인 가이드) 5단계 컴포넌트 중 앞단(1~3번)과 뒷단(4~5번)의 실무 설정 포인트를 다음 두 장에서 정리합니다.
Session 3 · Cloud Load Balancing (14 / 28) 02:02 ~ 02:16 (Components & Hybrid Networking)

3.14 앞단 컴포넌트(Forwarding Rule · Target Proxy · URL Map) 설계 포인트

맥락(Why): 클라이언트와 직접 맞닿는 앞단 3개 컴포넌트에서 보안성과 성능을 극대화하는 필수 설정 옵션입니다.
1. Forwarding Rule
  • 반드시 고정 예약 IP(Reserved Static IP)를 연결하십시오. 임시(Ephemeral) IP를 쓰면 재생성 시 DNS를 전부 다시 바꿔야 합니다.
  • Internal LB의 경우 타 리전 및 온프레미스 접근을 위해 allowGlobalAccess 여부를 결정합니다.
2. Target HTTPS Proxy
  • 취약한 구형 TLS 1.0/1.1을 막기 위해 반드시 SSL Policy(MODERN 또는 RESTRICTED 프로파일, 최소 TLS 1.2 이상)를 연결합니다.
  • 모바일 환경 가속을 위해 --quic-override=ENABLE로 HTTP/3(QUIC)를 켤 수 있습니다.
3. URL Map (Envoy 고급 기능)
  • HTTP(80)로 들어온 요청을 백엔드까지 보내지 않고 엣지 URL Map에서 즉시 HTTPS(443)로 301 리다이렉트 처리합니다.
  • 경로 재작성(urlRewrite), 카나리 가중치 분기, CORS 헤더 처리를 코드 수정 없이 LB에서 수행합니다.
gcloud CLI · 최소 TLS 1.2 및 현대적 암호화 스위트만 허용하는 SSL Policy 생성 및 연결
gcloud compute ssl-policies create prod-tls12-policy --profile=MODERN --min-tls-version=1.2
gcloud compute target-https-proxies update prod-https-proxy --ssl-policy=prod-tls12-policy
발표자 노트 (스토리라인 가이드) 이제 뒷단 컴포넌트인 Backend Service와 그 뒤에 붙을 수 있는 다양한 엔드포인트 유형(Part 3 후반부)으로 넘어갑니다.
Session 3 · Cloud Load Balancing (15 / 28) 02:02 ~ 02:16 (Components & Hybrid Networking)

3.15 Backend Service 뒤에 연결 가능한 4가지 엔드포인트(MIG & NEG)

맥락(Why): GCP Load Balancer는 GCE 가상머신(MIG)뿐만 아니라 컨테이너, 서버리스, 심지어 온프레미스 물리 서버까지 동일한 아키텍처로 묶을 수 있습니다.
백엔드 유형동작 방식 및 타겟핵심 활용 시나리오
1. Instance Group (MIG / UMIG)GCE VM의 기본 네트워크 인터페이스 IP로 트래픽 전달표준 GCE 기반 웹/WAS 클러스터 로드밸런싱
2. Zonal NEG (GCE_VM_IP_PORT)GKE 컨테이너 파드(Pod)의 고유 IP:Port로 Container-Native 직접 라우팅 (kube-proxy/NodePort 홉 제거!)VM 기반 레거시 서비스와 GKE 컨테이너 서비스를 동일한 ALB 아래에 공존시킬 때
3. Serverless NEGCloud Run, App Engine, Cloud Functions 서비스 연결정적 페이지나 버스트성 API는 Cloud Run으로, 코어 트랜잭션은 GCE MIG로 하이브리드 구성
4. Hybrid Connectivity NEG (NON_GCP_PRIVATE_IP_PORT)전용선(Interconnect)이나 VPN 너머에 있는 온프레미스 데이터센터 서버의 사설 IP:Port로 직접 라우팅!온프레미스 → GCP 무중단 마이그레이션 시, 앞단 ALB에서 가중치로 10%씩 트래픽을 GCP MIG로 옮길 때
발표자 노트 (스토리라인 가이드) 이제 네트워크 운영팀이 현장에서 가장 많이 마주하는 하이브리드 전용선/VPN 연동 심화 주제로 들어갑니다.
Session 3 · Cloud Load Balancing (16 / 28) 02:02 ~ 02:16 (Components & Hybrid Networking)

3.16 [하이브리드 필수] 온프레미스에서 Internal LB 호출 시 타임아웃 원인과 해법

맥락(Why): 온프레미스와 서울 리전을 전용선(Dedicated/Partner Interconnect)으로 연결하고 일반 GCE VM과는 ping/통신이 잘 되는데, 왜 유독 Internal LB VIP만 호출하면 응답이 없을까요?
Internal LB의 기본 리전 잠금(Regional Client Only)과 --allow-global-access 해제 비교
[기본 상태 (allowGlobalAccess = false)]
  온프레미스 서버(192.168.1.10) ──(Dedicated Interconnect / VPN)──▶ [서울 리전 Internal LB VIP (10.10.99.99)] ──▶ 패킷 즉시 드롭!
  * 원인: Internal LB는 기본적으로 "자신과 동일한 리전의 GCP 서브넷 내부에서 출발한 패킷"만 허용하도록 설계되어 있음!

[해결 상태 (allowGlobalAccess = true 설정 후)]
  온프레미스 서버(192.168.1.10) ──(Dedicated Interconnect / VPN)──▶ [서울 리전 Internal LB VIP (10.10.99.99)] ──▶ 정상 수신 및 응답!
온프레미스 → Internal LB 개통 3대 체크리스트
  • 1. --allow-global-access 활성화: Internal Passthrough NLB 및 Internal ALB의 Forwarding Rule에 반드시 글로벌 액세스 플래그를 켭니다.
  • 2. BGP 서브넷 광고 확인: Cloud Router가 Internal LB VIP가 속한 서브넷 대역을 온프레미스로 정상 BGP 광고하고 있는지 확인합니다.
  • 3. 인바운드 방화벽 오픈: 온프레미스 소스 대역(`192.168.0.0/16` 등)을 허용합니다 (Internal ALB는 Proxy-only 대역 허용).
gcloud CLI & Terraform 글로벌 액세스 설정
# gcloud CLI
gcloud compute forwarding-rules update ilb-fr   --region=asia-northeast3 --allow-global-access

# Terraform HCL (google_compute_forwarding_rule)
allow_global_access = true
발표자 노트 (스토리라인 가이드) 하이브리드 구간의 두 번째 핵심 아키텍처인 '서드파티 방화벽(Palo Alto, Fortinet 등) 어플라이언스 클러스터링'을 다음 장에서 다룹니다.
Session 3 · Cloud Load Balancing (17 / 28) 02:02 ~ 02:16 (Components & Hybrid Networking)

3.17 서드파티 방화벽(NVA) MIG 이중화와 --next-hop-ilb 대칭 해싱

맥락(Why): 온프레미스처럼 방화벽 VM 2대를 Active-Standby(HA 프로토콜/가상 IP 스왑)로 묶으면 클라우드에서는 API 호출로 라우트를 바꾸느라 페일오버에 수십 초가 걸립니다. GCP의 Active-Active 해법은 무엇일까요?
Internal Passthrough NLB를 Next-Hop 게이트웨이로 사용하는 Active-Active NVA 방화벽 아키텍처
[Spoke VPC (업무망 VM)] ──(VPC 커스텀 라우트: 0.0.0.0/0 의 Next-Hop = Internal Passthrough NLB VIP!)
                                 │
                                 ▼ (Andromeda SDN Symmetric Hashing: 왕복 패킷이 100% 동일한 방화벽 VM을 지나가도록 보장!)
                 [Regional MIG: Active-Active 방화벽 어플라이언스 (NVA VM 1, VM 2, VM 3)]
                                 │
                                 ▼
                   [온프레미스 전용선 또는 인터넷 출구]
왜 --next-hop-ilb 아키텍처가 우월한가?
  • 1. 대역폭 선형 확장 (Active-Active): 노는 Standby 장비 없이 MIG 내 모든 방화벽 VM이 동시에 트래픽을 처리합니다.
  • 2. 대칭 해싱(Symmetric Hashing) 내장: Stateful 방화벽은 나갈 때 거친 장비와 들어올 때 거치는 장비가 다르면(비대칭 라우팅) 패킷을 드롭합니다. GCP NLB는 왕복 5-Tuple을 대칭 해싱하여 SNAT 없이도 항상 같은 방화벽 노드로 패킷을 보내줍니다!
VPC 라우트의 Next-Hop을 Internal NLB로 지정
gcloud compute routes create route-to-firewall   --network=spoke-vpc   --destination-range=0.0.0.0/0   --next-hop-ilb=central-fw-nlb   --next-hop-ilb-region=asia-northeast3
발표자 노트 (스토리라인 가이드) 인바운드와 내부 라우팅을 마쳤으니, 이제 Private VM들이 외부 인터넷/파트너사 API로 나갈 때 거치는 Cloud NAT 심화로 넘어갑니다.
Session 3 · Cloud Load Balancing (18 / 28) 02:02 ~ 02:16 (Components & Hybrid Networking)

3.18 소프트웨어 정의 Cloud NAT 동작 원리와 포트 고갈(OUT_OF_RESOURCES)

맥락(Why): GCP의 Cloud NAT 역시 중앙 프록시 장비가 아니라 호스트의 Andromeda SDN에서 동작하므로 대역폭 병목이 없습니다. 그런데 왜 대규모 외부 API 호출 시 패킷 드롭(`OUT_OF_RESOURCES`)이 발생할까요?
단일 외부 파트너사(예: 카드사 승인 서버 211.55.1.10:443) 집중 호출 시 포트 고갈 메커니즘
* 물리적 한계: NAT 공인 IP 1개가 특정 목적지(211.55.1.10:443)와 동시에 맺을 수 있는 최대 소스 포트 수 = 64,512개 (1024~65535)
* 만약 VM당 기본 정적 포트 할당(64개) 상태에서 HTTP Keep-Alive 없이 매번 새 소켓을 열고 닫는다면?
  ──▶ 닫힌 연결도 커널 및 NAT에서 120초(2분, TCP TIME_WAIT) 동안 포트 반환 불가!
  ──▶ 해당 VM이 2분 동안 단 64건(초당 0.53건!)만 외부 API를 호출해도 65번째 요청에서 즉시 포트 고갈 드롭 발생!
포트 고갈이 발생하는 2가지 결정적 원인
  • 원인 1: Cloud NAT의 VM당 할당 포트 수(기본 64개)가 해당 VM의 초당 신규 아웃바운드 연결 수 × 120초(`TIME_WAIT`)보다 작을 때
  • 원인 2: 전체 VM들이 요구하는 총 포트 합계가 현재 Cloud NAT에 할당된 공인 IP 개수 × 64,512개를 초과했을 때
모니터링에서 즉시 확인하는 메트릭
  • Cloud Monitoring에서 router.googleapis.com/nat/nat_allocation_failed (할당 실패) 및 dropped_sent_packets_count (이유: OUT_OF_RESOURCES) 지표를 알람으로 등록해야 합니다.
발표자 노트 (스토리라인 가이드) Cloud NAT 포트 고갈을 영구적으로 해결하는 3가지 설정 공식과 코드를 살펴봅니다.
Session 3 · Cloud Load Balancing (19 / 28) 02:02 ~ 02:16 (Components & Hybrid Networking)

3.19 Cloud NAT 포트 고갈을 원천 차단하는 3대 엔지니어링 공식

맥락(Why): 외부 PG사, 은행, 오픈뱅킹, 알림톡 서버로 대량 아웃바운드 호출을 수행하는 핀테크·이커머스 환경의 Cloud NAT 표준 설정입니다.
1. Dynamic Port Allocation 활성화
  • 고정 64포트 대신, 평시 minPortsPerVm = 1024에서 시작해 트래픽 급증 시 maxPortsPerVm = 16384(또는 32768)까지 VM별로 포트를 자동 확장합니다.
2. Endpoint-Independent Mapping 비활성화
  • --no-enable-endpoint-independent-mapping을 유지하면, 목적지 IP:Port가 다를 경우 동일한 NAT 소스 포트를 재사용할 수 있어 가용 용량이 수십 배 늘어납니다.
3. 필요 공인 IP 수 산정 및 앱 커넥션 풀링
  • 필요 NAT 공인 IP 수 공식:
    ceil( (최대 VM 수 × 평균 할당 포트) / 64,512 )
  • 애플리케이션의 HTTP Client에서 반드시 Keep-Alive Connection Pool을 켜서 매번 새 포트를 쓰지 않게 합니다.
gcloud CLI · 동적 포트 할당(1024~16384) 및 EIM 비활성화가 적용된 고성능 Cloud NAT 구성
gcloud compute routers nats update prod-nat-gw --router=prod-cloud-router --region=asia-northeast3   --enable-dynamic-port-allocation   --min-ports-per-vm=1024   --max-ports-per-vm=16384   --no-enable-endpoint-independent-mapping
발표자 노트 (스토리라인 가이드) 이제 Session 3의 마지막 Part 4(LB + MIG 실전 연동 및 Keep-alive 502 에러 해결)로 들어갑니다.
Session 3 · Cloud Load Balancing (20 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.20 LB가 백엔드 용량을 계산하는 기준: Balancing Mode 3종 비교

맥락(Why): 로드 밸런서가 여러 존에 있는 MIG들로 트래픽을 나눌 때, 각 그룹이 '얼마나 바쁜지(여유 용량이 얼마인지)'를 판단하는 3가지 척도입니다.
밸런싱 모드지원 LB 유형트래픽 분배 및 상한선(Cap) 판단 기준실무 권장 시나리오
1. RATE (권장)L7 Application LB인스턴스당 초당 최대 요청 수(maxRatePerInstance, RPS)를 기준으로 분배표준 REST/gRPC API, 웹 서버 (CPU 지연보다 즉각적으로 반응하여 가장 안정적!)
2. UTILIZATIONL7 ALB, L4 Proxy NLB, Internal NLB 일부백엔드 VM의 평균 CPU 사용률(maxUtilization, 기본 0.8 = 80%)과 RPS/연결 수를 복합 평가요청 1건당 CPU 소모량 편차가 극심한 무거운 연산 워크로드
3. CONNECTIONL4 Proxy NLB, External Passthrough NLB인스턴스당 동시 활성 TCP 연결 수(maxConnectionsPerInstance) 기준WebSocket, 장시간 유지되는 커스텀 TCP 연결 서비스
발표자 노트 (스토리라인 가이드) 만약 `UTILIZATION` 모드를 쓸 때 LB의 상한선과 MIG Autoscaler의 임계치를 잘못 맞추면 어떤 사고가 나는지 다음 장에서 봅니다.
Session 3 · Cloud Load Balancing (21 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.21 [설계 주의] LB 용량 상한선과 MIG Autoscaler 임계치의 충돌 방지

맥락(Why): LB의 `maxUtilization`은 기본값이 80%(0.8)입니다. 만약 운영자가 MIG Autoscaler의 목표 CPU를 85%로 높여 잡으면 어떤 기현상이 벌어질까요?
안티 패턴: MIG Autoscaler 목표 CPU(85%) > LB maxUtilization(80%) 일 때의 부하 전이(Spillover)
[상황: 서울 리전 MIG의 평균 CPU가 82%에 도달함]
  ├─▶ 1. MIG Autoscaler의 판단: "내 목표치는 85%니까 아직 여유 있네! 서버를 안 늘려도 되겠다." (스케일 아웃 안 함!)
  └─▶ 2. Load Balancer의 판단:  "앗! 이 그룹의 최대 허용 용량(80%)을 넘었다! 여긴 포화 상태니 잉여 트래픽을 다른 백엔드 그룹/타 리전으로 넘기자!"
      ──▶ 결과: 서버는 늘어나지 않은 채 다른 존이나 리전으로 트래픽이 쏟아지며 도미노 과부하 발생!
절대 불변의 부등식 규칙
  • 항상 MIG Autoscaler 목표 임계치 < LB Backend Service 최대 용량 상한선이어야 합니다!
  • 권장 수치: MIG Autoscaler CPU 목표치는 60% ~ 65%로 설정하고, LB의 `maxUtilization`은 80% ~ 85%로 두어, LB가 트래픽을 튕겨내기 훨씬 전에 MIG가 먼저 넉넉히 스케일 아웃되도록 설계합니다.
capacityScaler (0.0 ~ 1.0) 활용 팁
  • 특정 리전이나 백엔드 그룹에 긴급 작업이 필요할 때, 백엔드에서 MIG를 아예 빼버리지 않고 --capacity-scaler=0.0으로 바꾸면 기존 설정을 유지한 채 유입 트래픽만 즉시 0%로 차단(Drain)할 수 있습니다.
발표자 노트 (스토리라인 가이드) 상태 유지나 로컬 캐시 효율을 위해 사용하는 Session Affinity(세션 어피니티)의 동작 방식과 함정을 살펴봅니다.
Session 3 · Cloud Load Balancing (22 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.22 Session Affinity(세션 고정) 옵션과 오토스케일링 불균형 주의점

맥락(Why): 특정 사용자의 요청을 계속 같은 백엔드 VM으로 보내고 싶을 때 Session Affinity를 켜지만, 잘못 사용하면 오토스케일링 효과를 무력화시킬 수 있습니다.
어피니티 유형동작 원리주요 특징 및 한계점
1. NONE (기본값 · 권장)매 요청/연결마다 가장 여유 있는 백엔드로 고르게 분산완벽한 부하 분산 달성 (세션 상태는 Redis/Memorystore 또는 JWT로 외부화)
2. CLIENT_IP클라이언트의 출발지 IP 주소를 해싱하여 동일 VM으로 고정기업 사설망이나 통신사 NAT 뒤에 수만 명이 숨어 있을 경우, 특정 VM 1대에만 트래픽이 몰리는 핫스팟(Hotspot) 발생!
3. GENERATED_COOKIELB가 첫 응답 시 GCLB(또는 GCILB) 쿠키를 자동 발급해 개별 브라우저 단위로 고정NAT 환경에서도 사용자별로 정교하게 분산됨 (단, 클라이언트가 쿠키를 지원해야 함)
4. HEADER_field / HTTP_COOKIEEnvoy 기반 ALB에서 특정 커스텀 헤더(예: X-User-ID)나 기존 앱 쿠키 값을 해싱하여 고정가장 유연하고 정밀한 라우팅 가능 (샤딩된 인메모리 캐시 서버 라우팅에 최적)
발표자 노트 (스토리라인 가이드) 이제 오늘 Session 3의 하이라이트이자 실무에서 가장 중요한 'Keep-alive 타임아웃 미스매치로 인한 간헐적 502 에러'를 4장에 걸쳐 완벽히 정복합니다.
Session 3 · Cloud Load Balancing (23 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.23 [프로덕션 최다 빈출] 평온한 서버에서 발생하는 간헐적 502의 정체

맥락(Why): 서버 CPU는 10%이고 에러 로그도 전혀 없는데, 매일 고객들로부터 '간헐적으로 502 에러가 뜬다'는 민원이 들어옵니다. Cloud Logging을 열면 정확히 어떤 시그니처가 찍혀 있을까요?
Cloud Logging에서 간헐적 502 Bad Gateway 발생 시 관측되는 결정적 증거(Smoking Gun)
{
  "httpRequest": {
    "requestMethod": "POST",
    "status": 502,
    "latency": "0.003s"          // <-- 백엔드가 느려서 타임아웃 난 것이 아님! 단 3ms 만에 즉시 502 발생!
  },
  "jsonPayload": {
    "@type": "type.googleapis.com/google.cloud.loadbalancing.type.LoadBalancerLogEntry",
    "statusDetails": "backend_connection_closed_before_data_sent_to_client"   // <-- 100% Keep-alive 타임아웃 미스매치 시그니처!
  }
}
왜 개발팀은 자기 서버 문제가 아니라고 할까?
  • 이 에러는 요청이 애플리케이션 비즈니스 로직까지 도달하기도 전에, 커널 TCP 소켓 계층에서 연결이 닫히며 거절(RST)된 사건입니다.
  • 따라서 백엔드 애플리케이션 로그(Spring/Node.js 에러 로그)에는 아예 요청 기록조차 남지 않아 원인을 찾지 못하고 헤매게 됩니다.
진단의 출발점
  • LB 로그의 statusDetails 값이 backend_connection_closed_before_data_sent_to_client라면, 이는 버그나 하드웨어 장애가 아니라 LB와 백엔드 웹서버 간의 Keep-alive 타임아웃 설정 불일치로 인한 전형적인 Race Condition입니다!
발표자 노트 (스토리라인 가이드) 왜 타임아웃 설정이 다르면 패킷이 공중에서 충돌해 502가 나는지, 밀리초 단위의 패킷 타임라인을 다음 장에서 해부합니다.
Session 3 · Cloud Load Balancing (24 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.24 [패킷 타임라인 해부] TCP FIN과 HTTP 요청의 Race Condition

맥락(Why): Google Cloud ALB(GFE 및 Envoy)는 백엔드 VM과 맺은 유휴 TCP 연결을 600초(10분) 동안 재사용합니다. 반면 Nginx의 기본값은 65초, Node.js는 5초입니다. 이때 무슨 일이 벌어질까요?
백엔드 Keep-alive(예: Nginx 65초) < LB Keep-alive(600초) 일 때 벌어지는 찰나의 충돌 과정
[GFE / Envoy 프록시 (Keep-alive: 600초)]                       [백엔드 Nginx / WAS (Keep-alive: 65초)]
        │                                                                      │
        │ ◀══════════════ (기존 요청 처리 후 64.999초 동안 유휴 상태 유지) ══════════════▶ │
        │                                                                      │
[T = 65.000초]                                                          1) "65초 동안 아무 요청이 없네! 소켓 닫자!"
        │                                     ◀──── [TCP FIN 패킷 출발] ─────── │ (백엔드가 먼저 연결 종료 시작)
        │
[T = 65.001초] (아직 백엔드의 FIN 패킷이 네트워크 선로를 날아오는 중이라 LB에 도착하기 직전!)
  2) "내 기준(600초)엔 아직 생생한 연결이네! 새로 들어온 고객의 결제 POST 요청을 이 소켓으로 보내자!"
        │ ─────── [HTTP POST /pay 패킷 출발!] ────▶ (공중에서 FIN과 엇갈림!) ────▶ │
        │                                                               3) "이미 닫은 소켓인데 데이터가 오네? 거부!"
        │ ◀────── [TCP RST (Reset) 패킷 폭탄 반환!] ─────────────────────────── │
        ▼
  4) LB가 클라이언트에게 즉시 502 Bad Gateway 반환! (POST 요청은 멱등성이 없으므로 LB가 다른 서버로 자동 재시도도 못 함!)
발표자 노트 (스토리라인 가이드) 원인을 정확히 봤으니 해결책은 놀라울 만큼 단순하고 확실합니다. 다음 장에서 황금 공식을 확인합니다.
Session 3 · Cloud Load Balancing (25 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.25 간헐적 502를 0건으로 만드는 황금 공식: 백엔드 Keep-alive 620초

맥락(Why): 누가 먼저 유휴 연결을 끊어야 공중 충돌(Race Condition)이 절대 일어나지 않을까요? 바로 '요청을 보내는 주체인 Load Balancer'가 먼저 끊게 만들면 됩니다!
백엔드 Keep-alive(620초) > LB Keep-alive(600초) 설정 시의 완벽한 종료 순서
[GFE / Envoy 프록시 (고정 600초)]                              [백엔드 웹서버 / WAS (620초로 상향!)]
        │                                                                      │
[T = 600.000초] 1) LB가 먼저 "600초가 지났으니 이 소켓에는 더 이상 새 요청을 절대 배정하지 말자!"고 내부 풀에서 제외
        │ ─────── [LB가 먼저 TCP FIN 전송] ───────────────────────────────────▶ │
        │ ◀────── [백엔드가 안전하게 FIN-ACK 응답 및 소켓 정리 완료] ─────────────── │
        * 결과: LB가 스스로 닫기로 결정한 소켓에는 새 HTTP 요청을 보내지 않으므로 Race Condition 발생 확률 = 0%!
반드시 함께 체크해야 할 2가지 추가 조건
  • 1. 최대 재사용 요청 횟수(Max Requests) 상향: 타임아웃을 620초로 늘려도, 웹서버의 기본 `keepalive_requests`(예: 100건 또는 1000건)에 도달하면 백엔드가 또 먼저 FIN을 보냅니다! 이 값도 100,000 이상으로 충분히 키우십시오.
  • 2. VM 내부에 앞단 Nginx + 뒷단 WAS(Node/Spring) 2단 구성인 경우: LB ↔ Nginx 구간뿐만 아니라 Nginx ↔ 로컬 WAS 구간의 Keep-alive도 맞춰야 합니다.
왜 LB의 600초는 바꿀 수 없나요?
  • Google Cloud ALB의 백엔드 유휴 연결 타임아웃(600초)은 글로벌 공유 프록시 아키텍처의 고정 상수입니다. 따라서 항상 백엔드 설정을 620초로 맞추는 것이 공식 표준입니다.
발표자 노트 (스토리라인 가이드) 당장 내일 Golden Image에 복사해 넣을 수 있도록 Nginx, Apache, Spring Boot(Tomcat), Node.js, Go 각각의 정확한 설정 코드를 다음 장에서 제공합니다.
Session 3 · Cloud Load Balancing (26 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.26 [실전 코드] 웹서버 및 프레임워크별 Keep-alive 620초 설정 가이드

맥락(Why): 사용 중인 기술 스택에 맞춰 아래 설정 코드를 사내 표준 이미지(Golden Image) 및 애플리케이션 설정 파일에 그대로 반영하십시오.
1. Nginx (nginx.conf) & 2. Apache (httpd.conf)
# [Nginx: http 또는 server 블록]
keepalive_timeout 620s;
keepalive_requests 100000;

# [Apache HTTP Server]
KeepAlive On
KeepAliveTimeout 620
MaxKeepAliveRequests 0     # 0 = 무제한 허용
3. Node.js (Express / NestJS) & 4. Spring Boot / Go
// [Node.js: 기본 5초이므로 가장 빈번하게 502 발생!]
const server = app.listen(8080);
server.keepAliveTimeout = 620 * 1000; // 620초
server.headersTimeout   = 625 * 1000; // 반드시 620초보다 크게!

# [Spring Boot (application.yml - Embedded Tomcat)]
server:
  tomcat:
    keep-alive-timeout: 620s
    max-keep-alive-requests: -1       # 무제한

// [Go (net/http)] -> IdleTimeout: 620 * time.Second
특히 Node.js 사용 시 필수 주의사항!
  • Node.js의 기본 keepAliveTimeout은 고작 5초(5000ms)여서 튜닝하지 않으면 GCP ALB 뒤에서 엄청난 양의 502 에러를 뿜어냅니다. 또한 Node.js에서는 headersTimeout을 반드시 keepAliveTimeout보다 크게(예: 625초) 설정해야 정상 동작합니다.
발표자 노트 (스토리라인 가이드) 유휴 연결 타임아웃(Keep-alive 600초)과 자주 혼동하는 '실제 요청 처리 타임아웃(`timeoutSec`)'의 차이를 다음 장에서 명확히 구분합니다.
Session 3 · Cloud Load Balancing (27 / 28) 02:16 ~ 02:30 (LB + MIG Tuning & Keep-alive 502)

3.27 유휴 연결 타임아웃(600초) vs 백엔드 응답 타임아웃(기본 30초) 구분

맥락(Why): Keep-alive 타임아웃을 620초로 맞췄는데도 대용량 엑셀 다운로드나 AI 추론 API에서 정확히 30초 만에 `504 Gateway Timeout`이 나는 이유는 무엇일까요?
구분TCP Keep-alive Idle Timeout (유휴 연결 유지 시간)Backend Service Timeout (timeoutSec · 응답 대기 시간)
의미아무런 HTTP 요청이 오가지 않는 빈 소켓을 끊지 않고 열어두는 시간클라이언트가 요청을 보낸 후 백엔드가 전체 응답을 다 보낼 때까지 기다려 주는 최대 시간
기본값 및 변경 가능 여부LB 측 600초 고정 (변경 불가 → 백엔드를 620초로 맞춤)기본값 30초 (사용자가 1초 ~ 86,400초(24시간) 사이로 자유롭게 변경 가능!)
초과 시 발생하는 에러불일치 시 간헐적 502 Bad Gateway30초 초과 시 확정적 504 Gateway Timeout (backend_timeout)
WebSocket에서의 역할무관WebSocket 연결의 최대 총 지속 시간을 결정! (실시간 채팅/알림용이면 3600s 이상으로 상향 필수)
gcloud CLI · 장시간 배치 API 또는 WebSocket 서비스를 위해 응답 타임아웃을 30초 -> 3600초(1시간)로 상향
gcloud compute backend-services update prod-websocket-bs --global --timeout=3600s
발표자 노트 (스토리라인 가이드) Session 3의 28번째 마지막 슬라이드인 실전 네트워크 Q&A로 이어집니다.
Session 3 · Cloud Load Balancing (28 / 28) 02:16 ~ 02:30 (Session 3 Wrap-up Q&A)

3.28 Session 3 실전 네트워크 & 로드 밸런싱 핵심 Q&A

맥락(Why): Cloud Load Balancing, DSR, 하이브리드 BGP 및 502 튜닝과 관련해 네트워크 운영팀에서 가장 자주 묻는 질문 4가지입니다.
Q1. 대외 기관에서 우리 인바운드 LB VIP가 고정 단일 IP인지 묻는데 맞나요?
  • A: 네! DNS 이름으로 여러 IP가 계속 바뀌는 타 클라우드 ALB와 달리, GCP의 모든 Load Balancer는 영구 고정된 단일 VIP 주소를 제공하므로 고객사나 대외 기관 방화벽 화이트리스트에 IP로 직접 등록할 수 있습니다.
Q2. 백엔드 VM까지 End-to-End로 암호화(HTTPS)하려면 어떻게 하나요?
  • A: GFE/Envoy와 백엔드 VM 구간은 이미 Andromeda SDN 수준에서 자동 암호화되지만, 규정상 L7 패킷 페이로드까지 재암호화가 필요하다면 Backend Service의 프로토콜을 HTTPS 또는 HTTP2로 지정하면 LB가 백엔드 VM과 다시 TLS 세션을 맺습니다.
Q3. GKE(쿠버네티스)로 점진적 전환 시 기존 GCE VM과 같은 LB를 쓸 수 있나요?
  • A: 완벽히 가능합니다. 기존 ALB의 URL Map과 Backend Service에 GCE MIG와 GKE Zonal NEG를 나란히 연결하고 가중치를 조절하면 클라이언트 인지 없이 VM → 컨테이너 무중단 이관이 끝납니다.
Q4. Cloud Armor(WAF)를 붙이면 레이턴시가 많이 늘어나나요?
  • A: 별도의 WAF 장비를 경유하는 것이 아니라 이미 패킷이 통과하고 있는 GFE/Envoy 프록시 메모리 내부에서 인라인으로 룰을 평가하므로 추가 네트워크 홉 지연이 사실상 없습니다.
발표자 노트 (스토리라인 가이드) 가장 길고 깊었던 Session 3(28장)를 마쳤습니다. 이제 마지막 30분 동안 진행할 Session 4(18장)로 들어갑니다.
Session 4 · Day-2 트러블슈팅 및 IaC (1 / 18) 02:30 ~ 02:42 (Observability & Latency Triage)

4.1 왜 기본 모니터링에는 메모리 사용률이 보이지 않는가?

맥락(Why): GCE VM을 생성하고 Cloud Monitoring을 열면 CPU와 네트워크는 바로 나오는데, 정작 메모리 사용률(`memory/percent_used`)과 디스크 잔여 공간은 보이지 않습니다. 왜 그럴까요?
비교 항목하이퍼바이저 기본 메트릭 (compute.googleapis.com/*)Ops Agent 심층 메트릭 (agent.googleapis.com/* · 필수)
관측 위치호스트 하이퍼바이저가 VM 외부에서 물리 I/O만 관측게스트 OS 내부에 설치된 에이전트가 커널 /proc 테이블을 직접 조회
왜 메모리를 못 보는가?리눅스 커널은 남는 RAM을 Page Cache로 다 채워 쓰므로, 외부 하이퍼바이저에서 보면 항상 메모리가 99% 사용 중인 것처럼 보임 (또한 고객 메모리 무단 열람 불가)커널 내부에서 Used, Buffered, Cached, Slab, Free를 정확히 구분하여 실제 애플리케이션 가용 메모리를 산출!
수집 지표 범위CPU 사용률, 네트워크 바이트, 디스크 블록 IOPS실제 메모리 점유율, 마운트 파티션별 디스크 사용량(%), 프로세스별 CPU/메모리, TCP 연결 상태(TIME_WAIT 수), GPU/JVM/Nginx 지표
발표자 노트 (스토리라인 가이드) Session 4의 첫 장입니다. 왜 Ops Agent가 선택이 아닌 필수인지 커널 Page Cache 원리로 설명합니다.
Session 4 · Day-2 트러블슈팅 및 IaC (2 / 18) 02:30 ~ 02:42 (Observability & Latency Triage)

4.2 Ops Agent 내부 아키텍처와 구조화(JSON) 로그 파이프라인

맥락(Why): 과거에는 모니터링용 Stackdriver 에이전트와 로깅용 Fluentd 에이전트를 따로 깔았으나, 현재는 단일 Ops Agent로 완전히 통합되었습니다.
Google Cloud Ops Agent 내부 2대 서브시스템 구조
[단일 설정 파일: /etc/google-cloud-ops-agent/config.yaml]
   ├─▶ 1. Metrics 엔진 (OpenTelemetry Collector 기반) ──▶ OS 커널(/proc), Nginx/Tomcat/Redis/JVM JMX 메트릭 ──▶ [Cloud Monitoring]
   └─▶ 2. Logging 엔진 (Fluent Bit 고성능 C 엔진 기반) ──▶ syslog, 애플리케이션 JSON 로그 파싱 및 스트리밍 ──▶ [Cloud Logging]
왜 멀티라인 텍스트보다 JSON 로그인가?
  • Java Stack Trace처럼 여러 줄로 찍히는 일반 텍스트 로그는 파싱 규칙이 깨지면 줄마다 별개의 로그 엔트리로 쪼개져 검색이 어렵습니다.
  • 애플리케이션에서 처음부터 1줄짜리 JSON 포맷(severity, trace, message, stack_trace)으로 출력하고 Ops Agent의 parse_json 프로세서를 거치면 Cloud Logging에서 필드별 인덱싱과 고속 검색이 즉시 가능합니다.
/etc/google-cloud-ops-agent/config.yaml 표준 예시
logging:
  receivers:
    app_json:
      type: files
      include_paths: [/var/log/app/*.json.log]
  processors:
    parse_json:
      type: parse_json
  service:
    pipelines:
      app_pipeline:
        receivers: [app_json]
        processors: [parse_json]
발표자 노트 (스토리라인 가이드) 에이전트 관측을 마쳤으니, 이제 장애 발생 시 1분 안에 네트워크와 백엔드 중 누구의 문제인지 가려내는 LB 지연 분석법으로 들어갑니다.
Session 4 · Day-2 트러블슈팅 및 IaC (3 / 18) 02:30 ~ 02:42 (Observability & Latency Triage)

4.3 API 응답 지연 시 1분 내 범인 특정: 2가지 Latency 지표 대조

맥락(Why): '결제 API가 느려요! 네트워크나 로드 밸런서 문제 아닌가요?'라는 연락을 받았을 때, LB 로그의 두 시간 필드만 빼기(-) 연산해 보면 1분 안에 책임 구간이 갈립니다.
Cloud Load Balancing이 측정하는 2가지 지연 시간(Latency)의 정확한 경계
[클라이언트 앱] ◀──── (인터넷/모바일 무선망 RTT 및 대용량 요청·응답 본문 전송 시간) ────▶ [GFE / Envoy 프록시] ◀── (순수 WAS 처리 시간) ──▶ [백엔드 MIG VM]
               │◀────────────────────── 1. httpRequest.latency (Monitoring: total_latencies) ──────────────────────▶│
                                                                                │◀─ 2. jsonPayload.backend_target_latency ─▶│
                                                                                │      (Monitoring: backend_latencies)      │
로그 필드 / 메트릭 명칭정확한 측정 시작점 ~ 종료점포함되는 시간 요소
1. backend_target_latency
(https/backend_latencies)
프록시가 백엔드 VM으로 요청 전송을 시작한 순간부터 ~ 백엔드 VM이 응답의 마지막 바이트를 프록시에 다 넘긴 순간까지순수 백엔드 WAS 애플리케이션 로직 실행 시간 + DB 쿼리 시간 + VPC 내부 홉(수 ms 미만)
2. httpRequest.latency
(https/total_latencies)
클라이언트의 요청 첫 바이트가 프록시에 도착한 순간부터 ~ 클라이언트에게 응답 마지막 바이트 전송이 끝난 순간까지위 백엔드 처리 시간 + 클라이언트와 프록시 간의 인터넷 업로드/다운로드 전송 시간 전체!
발표자 노트 (스토리라인 가이드) 실제 장애 상황에서 이 두 숫자가 어떻게 나타나는지 3가지 케이스로 판독해 봅니다.
Session 4 · Day-2 트러블슈팅 및 IaC (4 / 18) 02:30 ~ 02:42 (Observability & Latency Triage)

4.4 지연 시간(total vs backend) 대조를 통한 3가지 병목 판독법

맥락(Why): 장애 브리핑 채널에서 추측성 논쟁을 끝내고 데이터로 즉시 원인을 지목하는 3가지 패턴입니다.
패턴 1: 둘 다 3.0초로 거의 같음
  • total: 3.02s / backend: 3.00s
  • 판정: 100% 백엔드 서버 또는 DB 병목!
  • LB와 네트워크 구간에서 쓰인 시간은 단 20ms뿐이며, 3.00초 내내 백엔드 VM이 응답을 만들지 못해 잡고 있었던 상태입니다.
  • 조치: 백엔드 WAS의 스레드 덤프, GC 로그, DB 슬로우 쿼리/락 대기를 즉시 점검합니다.
패턴 2: total만 3.0초, backend는 0.03초
  • total: 3.00s / backend: 0.03s
  • 판정: 백엔드 서버는 30ms 만에 칼같이 처리 완료!
  • 나머지 2.97초는 클라이언트 단말과 GFE 프록시 사이에서 대용량 파일(이미지/영상)을 느린 모바일 통신망으로 주고받느라 걸린 시간입니다.
  • 조치: 응답 페이로드 압축(Gzip/Brotli), Cloud CDN 캐싱, 클라이언트 청크 업로드 점검.
패턴 3: backend가 없다(비어 있음)
  • total: 0.005s / backend: -
  • 판정: 요청이 백엔드 VM에 아예 도달하지도 못함!
  • 앞단 Cloud Armor WAF에서 차단(403)되었거나, Healthy 백엔드가 0대이거나, 방화벽에 막혀 프록시가 연결에 실패한 케이스입니다.
  • 조치: 즉시 statusDetails 필드를 확인합니다.
발표자 노트 (스토리라인 가이드) 지연 시간 다음으로 중요한 `statusDetails` 에러 코드 전체 정리표로 넘어갑니다.
Session 4 · Day-2 트러블슈팅 및 IaC (5 / 18) 02:30 ~ 02:42 (Observability & Latency Triage)

4.5 5xx 장애의 정답지: jsonPayload.statusDetails 판독 플레이북

맥락(Why): 똑같은 502나 503 에러라도 원인은 수십 가지입니다. Cloud Logging의 `jsonPayload.statusDetails` 문자열 하나만 보면 10초 안에 정확한 원인을 알 수 있습니다.
jsonPayload.statusDetails 값코드정확한 발생 메커니즘즉각 해결 조치
response_sent_by_backend2xx~5xxLB는 아무 문제 없이 전달했고, 백엔드 앱 코드 자체가 해당 상태 코드(예: 500/502)를 리턴함인프라 정상. 백엔드 애플리케이션 에러 로그 확인
backend_connection_closed_before_data_sent_to_client502Keep-alive 타임아웃 미스매치! LB가 요청을 보낸 순간 백엔드가 유휴 소켓을 닫아 RST 발생백엔드 웹서버/WAS Keep-alive를 620초로 상향
failed_to_connect_to_backend502LB 프록시가 백엔드 VM으로 보낸 TCP SYN 패킷이 거부되거나 타임아웃됨VPC 방화벽에서 프록시/헬스체크 대역 허용 여부 및 앱 포트 리스닝 확인
failed_to_pick_backend502/503현재 트래픽을 받을 수 있는 Healthy 상태의 백엔드 VM이 단 1대도 없음(전멸)LB Health Check 경로 오타 또는 전체 백엔드 서버 다운 확인
backend_timeout504백엔드 연결은 성공했으나 Backend Service의 timeoutSec(기본 30초) 안에 응답이 안 옴Backend Service의 --timeout 값을 상향하고 백엔드 병목 제거
client_disconnected_after_partial_response499/200서버가 응답을 다 주기도 전에 클라이언트(앱/브라우저)가 먼저 연결을 끊어버림모바일 앱의 자체 HTTP 타임아웃(예: 3초)이 너무 짧은지 확인
발표자 노트 (스토리라인 가이드) 위 `statusDetails`를 실제로 조회하고 집계하는 Cloud Logging(LQL) 쿼리 3종을 다음 장에서 제공합니다.
Session 4 · Day-2 트러블슈팅 및 IaC (6 / 18) 02:30 ~ 02:42 (Observability & Latency Triage)

4.6 온콜 엔지니어를 위한 Cloud Logging(LQL) 실전 쿼리 3선

맥락(Why): 장애 발생 시 로그 탐색기(Logs Explorer)에 바로 붙여넣어 범인을 색출하는 필수 쿼리입니다.
쿼리 1 · 백엔드 앱이 자체 리턴한 500을 제외하고, 순수하게 LB/네트워크 구간에서 발생한 5xx 에러만 추출
resource.type="http_load_balancer"
httpRequest.status>=500
jsonPayload.statusDetails!="response_sent_by_backend"
쿼리 2 · Keep-alive 불일치로 인한 502 에러만 필터링하여 어느 백엔드 그룹에서 나는지 확인
resource.type="http_load_balancer"
httpRequest.status=502
jsonPayload.statusDetails="backend_connection_closed_before_data_sent_to_client"
쿼리 3 · 순수 백엔드 처리 시간이 3초(3s)를 초과한 슬로우 API 요청만 추출
resource.type="http_load_balancer"
jsonPayload.backend_target_latency>"3s"
발표자 노트 (스토리라인 가이드) 이제 Part 2(부팅 불능 복구, 네트워크 정적/동적 진단 및 Terraform 무중단 IaC)로 넘어갑니다.
Session 4 · Day-2 트러블슈팅 및 IaC (7 / 18) 02:42 ~ 02:52 (Boot & Network Debugging)

4.7 SSH조차 붙지 않는 먹통 VM 진단: Serial Console(직렬 콘솔)

맥락(Why): 커스텀 이미지를 잘못 구웠거나 `/etc/fstab`에 오타를 내서 VM이 부팅 도중 멈춰버리면 SSH나 IAP 터널로도 접속할 수 없습니다. 물리 서버에 모니터 케이블을 꽂듯 확인하는 방법은 무엇일까요?
1. Serial Port 1 (읽기 전용 부팅 로그 출력)
  • 게스트 내부에 에이전트가 없거나 네트워크 카드가 안 올라온 상태에서도, 커널 부팅 메시지(dmesg), systemd 기동 로그, cloud-init, Startup Script 표준 에러 출력을 하이퍼바이저가 밖으로 스트리밍해 줍니다.
  • SSH 타임아웃 발생 시 가장 먼저 확인해야 할 1순위 도구입니다.
2. Interactive Serial Console (대화형 응급 복구 쉘)
  • 네트워크 방화벽 실수로 내 SSH 접근이 완전히 차단되었거나 `fstab` 마운트 실패로 Emergency Mode에 빠졌을 때 사용합니다.
  • 인스턴스 메타데이터에 serial-port-enable=TRUE를 일시적으로 켜면, 네트워크를 거치지 않고 하이퍼바이저 시리얼 포트를 통해 직접 리눅스 로그인 프롬프트(`ttyS0`)로 진입해 설정을 고칠 수 있습니다.
gcloud CLI · 먹통이 된 VM의 직렬 콘솔 부팅 로그 조회 및 대화형 시리얼 콘솔 접속
# 1. 부팅 중인 VM의 커널/스타트업 스크립트 콘솔 로그 마지막 100줄 즉시 확인
gcloud compute instances get-serial-port-output prod-was-01 --zone=asia-northeast3-a --port=1 | tail -n 100

# 2. 긴급 복구 시 대화형 직렬 콘솔(ttyS0) 직접 접속 (복구 완료 후에는 보안을 위해 serial-port-enable=FALSE로 즉시 원복!)
gcloud compute connect-to-serial-port prod-was-01 --zone=asia-northeast3-a
발표자 노트 (스토리라인 가이드) 만약 root 패스워드도 없고 대화형 시리얼 콘솔도 보안 정책으로 막혀 있는데 부팅 디스크 설정(`/etc/fstab`, `/etc/ssh/sshd_config`)을 고쳐야 한다면 어떻게 할까요?
Session 4 · Day-2 트러블슈팅 및 IaC (8 / 18) 02:42 ~ 02:52 (Boot & Network Debugging)

4.8 시리얼 콘솔 없이 고장 난 부팅 디스크를 살려내는 Rescue VM 기법

맥락(Why): 조직 보안 정책(`compute.disableSerialPortAccess`) 때문에 대화형 시리얼 콘솔을 켤 수 없을 때, 부팅에 실패한 Stateful VM의 디스크를 3분 만에 고치는 표준 복구 절차입니다.
고장 난 VM의 부팅 디스크를 정상 복구용 VM(Rescue VM)에 데이터 디스크로 임시 부착하여 수리하는 4단계
[1단계] 고장 난 VM(broken-vm) 중지 후, 부팅 디스크(broken-boot-disk) 분리(Detach)
        │
[2단계] 같은 존에 있는 정상 Rescue VM에 broken-boot-disk를 추가 데이터 디스크(/dev/sdb)로 부착(Attach)
        │
[3단계] Rescue VM 안에서 mount /dev/sdb1 /mnt/recovery 실행 ──▶ /mnt/recovery/etc/fstab 오타 수정 후 umount!
        │
[4단계] 디스크를 다시 분리하여 원래 broken-vm의 부팅 디스크로 재부착 후 기동 ──▶ 정상 부팅 완료!
gcloud CLI · 부팅 디스크 분리 및 복구용 VM 부착 명령
# 1. 고장 난 VM 중지 후 부팅 디스크 분리
gcloud compute instances stop broken-vm --zone=asia-northeast3-a
gcloud compute instances detach-disk broken-vm --disk=broken-boot-disk --zone=asia-northeast3-a

# 2. 정상 복구용 VM에 데이터 디스크로 마운트하여 파일 수정
gcloud compute instances attach-disk rescue-vm --disk=broken-boot-disk --zone=asia-northeast3-a
발표자 노트 (스토리라인 가이드) 부팅 디스크 복구를 마쳤으니, 이제 복잡한 네트워크 패킷 드롭을 추적하는 두 가지 무기(VPC Flow Logs와 Connectivity Tests)를 살펴봅니다.
Session 4 · Day-2 트러블슈팅 및 IaC (9 / 18) 02:42 ~ 02:52 (Boot & Network Debugging)

4.9 Andromeda SDN 기반 VPC Flow Logs와 샘플링 최적화

맥락(Why): VM 내부에서 무겁게 `tcpdump`를 돌리지 않고도, 서브넷 전체의 5-Tuple 트래픽 흐름과 RTT 지연을 실시간으로 기록하는 VPC Flow Logs의 동작 원리입니다.
Andromeda SDN 직접 수집 (오버헤드 0%)
  • 게스트 VM 내부 에이전트가 아니라 호스트의 Andromeda 가상 스위치 계층에서 패킷 플로우를 직접 캡처하므로 VM CPU나 네트워크 대역폭에 영향을 전혀 주지 않습니다.
  • 각 로그 엔트리에는 src_ip, dest_ip, 포트, 바이트 수뿐만 아니라 SRC/DEST VM 이름, VPC 이름, 지리적 정보, TCP RTT 지연 시간이 풍부하게 태깅됩니다.
비용 폭탄을 막는 샘플링 및 필터링 설계
  • 대규모 트래픽 서브넷에서 100%(1.0) 수집을 켜면 Cloud Logging 수집 비용이 과도하게 나올 수 있습니다.
  • 평시 표준 설정: 집계 간격은 INTERVAL_5_SEC 또는 INTERVAL_30_SEC, 샘플링 비율은 0.1(10%) ~ 0.5(50%)로 두고, 트러블슈팅 시에만 --filter-expr로 특정 IP만 100% 수집합니다.
gcloud CLI · 특정 서브넷에 VPC Flow Logs 활성화 및 특정 IP 플로우만 정밀 필터링
gcloud compute networks subnets update prod-was-subnet --region=asia-northeast3   --enable-flow-logs   --logging-aggregation-interval=interval-5-sec   --logging-flow-sampling=0.5   --logging-metadata=include-all
발표자 노트 (스토리라인 가이드) 패킷을 실제로 쏘지 않고도 방화벽과 BGP 라우팅 어디서 막혔는지 30초 만에 찾아내는 Connectivity Tests를 다음 장에서 봅니다.
Session 4 · Day-2 트러블슈팅 및 IaC (10 / 18) 02:42 ~ 02:52 (Boot & Network Debugging)

4.10 30초 만에 방화벽·라우팅 차단 지점을 지목하는 Connectivity Tests

맥락(Why): Shared VPC, VPC Peering, 전용선 BGP, 계층형 방화벽, Internal LB가 겹쳐 있을 때 '왜 A 서버에서 B 서버로 통신이 안 될까요?'라는 문의를 가장 빠르게 해결하는 도구입니다.
Connectivity Tests의 이중 검증 엔진: 1) Andromeda 정적 구성 시뮬레이션 + 2) 라이브 데이터 플레인 프로빙
[입력: 출발지 192.168.10.5 (온프레미스) ──▶ 목적지 10.10.99.99:443 (서울 Internal ALB VIP)]
   ├──▶ [Hop 1: Cloud Router & VLAN Attachment]  PASS (BGP 경로 수신 정상)
   ├──▶ [Hop 2: VPC 라우팅 테이블]                PASS (10.10.0.0/20 서브넷 매칭)
   ├──▶ [Hop 3: Internal LB Forwarding Rule]     DROP! ──▶ 원인 즉시 지목: "Forwarding Rule에 allowGlobalAccess가 꺼져 있어 타 리전/온프레미스 패킷이 거부됨!"
왜 `ping`이나 `traceroute`보다 강력한가?
  • 일반 `traceroute`는 중간 방화벽에 막히면 그냥 `* * *` 타임아웃만 보여줄 뿐, 몇 번 방화벽 규칙에 의해 막혔는지, 아니면 돌아오는 역방향 라우트(Return Path)가 없는지 알려주지 않습니다.
  • Connectivity Tests는 Andromeda SDN의 제어 플레인 그래프를 역추적하여 정확히 차단을 일으킨 방화벽 규칙 이름이나 누락된 라우트를 화면에 바로 찍어줍니다.
gcloud CLI · 경로 진단 테스트 생성 및 결과 확인
gcloud network-management connectivity-tests create debug-test-01   --source-ip-address=192.168.10.5   --destination-ip-address=10.10.99.99   --destination-port=443 --protocol=TCP

gcloud network-management connectivity-tests describe debug-test-01
발표자 노트 (스토리라인 가이드) 이제 마지막 주제인 Infrastructure as Code(Terraform 무중단 운영 패턴)로 들어갑니다.
Session 4 · Day-2 트러블슈팅 및 IaC (11 / 18) 02:52 ~ 03:00 (Terraform IaC & Wrap-up)

4.11 왜 Terraform으로 Instance Template을 수정하면 에러가 날까?

맥락(Why): Terraform 코드에서 VM의 머신 타입이나 시작 스크립트를 한 줄 고치고 `terraform apply`를 쳤는데, 왜 배포가 실패하며 `resourceInUseByAnotherResource` 에러가 뜰까요?
Terraform의 기본 동작(Destroy -> Create)과 불변(Immutable) Instance Template의 충돌 과정
[Terraform의 기본 동작 순서: 기존 리소스 먼저 삭제(Destroy) 후 새 리소스 생성(Create)]
  1) 운영자가 google_compute_instance_template의 startup_script를 수정하고 terraform apply 실행
  2) Instance Template은 수정 불가(Immutable) 리소스이므로, Terraform은 먼저 기존 템플릿(was-tpl) 삭제 API를 호출!
  3) GCP API의 응답: "Error 400: The instance_template resource 'was-tpl' is already being used by 'prod-was-mig' (resourceInUseByAnotherResource)"
  ──▶ 현재 MIG가 그 템플릿을 물고 돌아가고 있으므로 삭제 거부 및 배포 실패!
어떻게 순서를 뒤집어야 하는가?
  • 기존 템플릿을 먼저 지우려고 하니까 실패하는 것입니다. 순서를 정반대로 뒤집어 1) 다른 이름의 새 템플릿을 먼저 만들고 → 2) MIG가 새 템플릿을 바라보게 롤링 업데이트를 시킨 뒤 → 3) 아무도 참조하지 않게 된 구버전 템플릿을 마지막에 삭제하도록 Terraform 생명주기(Lifecycle)를 구성해야 합니다!
발표자 노트 (스토리라인 가이드) 모든 GCP 엔지니어가 외워야 할 Terraform MIG 무중단 교체 공식 슬라이드입니다.
Session 4 · Day-2 트러블슈팅 및 IaC (12 / 18) 02:52 ~ 03:00 (Terraform IaC & Wrap-up)

4.12 [필수 패턴] Terraform 무중단 Instance Template 교체 3대 공식

맥락(Why): 단 3줄의 설정(`name_prefix`, `create_before_destroy`, `self_link_unique`)만으로 템플릿 변경부터 MIG 롤링 업데이트, 구버전 템플릿 삭제까지 완벽히 자동화합니다.
Terraform HCL · 종속성 에러 없는 무중단 Instance Template + Regional MIG 표준 코드
resource "google_compute_instance_template" "was_tpl" {
  name_prefix  = "prod-was-tpl-"          # [공식 1] 고정 name 대신 name_prefix를 써야 새 템플릿이 이름 충돌 없이 생성됨!
  machine_type = "c3-standard-4"
  # ... (디스크, 네트워크, 이미지, 메타데이터 설정) ...

  lifecycle {
    create_before_destroy = true          # [공식 2] 구버전을 먼저 지우지 말고, 새 템플릿 생성 및 MIG 교체 후 마지막에 삭제!
  }
}

resource "google_compute_region_instance_group_manager" "was_mig" {
  name               = "prod-was-mig"
  region             = "asia-northeast3"
  distribution_policy_target_shape = "BALANCED"

  version {
    # [공식 3] .self_link 대신 반드시 .self_link_unique 를 참조해야 템플릿 내부 속성 변경 시 MIG 업데이트가 정확히 트리거됨!
    instance_template = google_compute_instance_template.was_tpl.self_link_unique
  }

  update_policy {
    type                         = "PROACTIVE"
    minimal_action               = "REPLACE"
    replacement_method           = "SUBSTITUTE"
    max_surge_fixed              = 3      # 3개 존 동시 병렬 Surge
    max_unavailable_fixed        = 0      # 배포 중 가용 용량 100% 사수
    min_ready_sec                = 60     # 60초 예열 후 구버전 제거
  }
}
발표자 노트 (스토리라인 가이드) Terraform으로 MIG를 운영할 때 또 하나 자주 겪는 '오토스케일러가 늘려놓은 대수를 Terraform이 다시 줄여버리는 현상'을 막는 법을 다음 장에서 봅니다.
Session 4 · Day-2 트러블슈팅 및 IaC (13 / 18) 02:52 ~ 03:00 (Terraform IaC & Wrap-up)

4.13 Terraform과 Autoscaler 대수 충돌 방지 및 선언적 카나리 제어

맥락(Why): 오토스케일러가 피크 타임에 서버를 6대에서 20대로 늘려놓았는데, 개발자가 `terraform apply`를 실행하는 순간 코드에 적힌 `target_size = 6` 때문에 14대가 갑자기 삭제되는 사고를 어떻게 막을까요?
1. Autoscaler 사용 시 target_size 충돌 방지
  • Autoscaler(`google_compute_region_autoscaler`)가 연결된 MIG에서는 MIG 리소스 안에 `target_size`를 하드코딩하지 않거나, `lifecycle { ignore_changes = [target_size] }`를 선언해야 합니다!
  • 그래야 오토스케일러가 실시간으로 조절해 놓은 현재 인스턴스 대수를 Terraform이 덮어쓰지 않습니다.
2. Terraform을 통한 선언적 카나리 배포
  • MIG 리소스 내부에 두 번째 version 블록을 추가하고 target_size { percent = 10 }을 선언하면 Terraform Plan/Apply만으로 안전하게 10% 카나리 테스트를 수행할 수 있습니다.
Terraform HCL · ignore_changes로 오토스케일링 대수 보호 및 10% 카나리 버전 블록 예시
resource "google_compute_region_instance_group_manager" "was_mig" {
  # ...
  version {
    name              = "primary"
    instance_template = google_compute_instance_template.was_tpl_v1.self_link_unique
  }
  version {
    name              = "canary"
    instance_template = google_compute_instance_template.was_tpl_v2.self_link_unique
    target_size { percent = 10 }
  }
  lifecycle {
    ignore_changes = [target_size]   # <-- 오토스케일러가 늘려놓은 대수를 Terraform이 강제 축소하지 않도록 보호!
  }
}
발표자 노트 (스토리라인 가이드) 실무에서 언제 CLI를 쓰고 언제 Terraform을 써야 형상 불일치(Drift) 없이 운영할 수 있는지 거버넌스를 정리합니다.
Session 4 · Day-2 트러블슈팅 및 IaC (14 / 18) 02:52 ~ 03:00 (Terraform IaC & Wrap-up)

4.14 엔터프라이즈 운영 거버넌스: gcloud CLI vs Terraform 역할 분담

맥락(Why): 모든 것을 Terraform으로만 하려다 긴급 장애 대응이 늦어지거나, 반대로 콘솔/CLI로만 고치다 코드와 실제 인프라가 따로 노는(Drift) 문제를 막는 운영 원칙입니다.
구분선언적 형상 관리: Terraform + GitOps (평시 표준)명령형 실시간 제어: gcloud CLI / 콘솔 (디버깅·긴급 조치)
담당 영역VPC, 서브넷, 방화벽 정책, Cloud NAT, Load Balancer 체인, MIG, Instance Template, Autoscaler, IAM 권한실시간 로그/시리얼 콘솔 조회, Connectivity Tests 실행, 장애 VM abandon-instances 분리, 긴급 트래픽 우회
변경 절차Git PR 생성 → terraform plan 자동 리뷰 → 승인 후 머지 시 CI/CD 파이프라인이 terraform apply 실행온콜 엔지니어가 Break-glass 권한으로 즉시 실행
사후 동기화 원칙단일 진실 공급원(Single Source of Truth) 유지긴급 조치로 콘솔/CLI에서 설정(예: 타임아웃, 방화벽)을 바꾼 경우, 반드시 당일 내 Terraform 코드에 역반영하여 Drift 0% 확인!
발표자 노트 (스토리라인 가이드) 3시간 본 과정 이론에 이어, 별도 옵션으로 제공되는 Hands-on Lab(+60분)에서 무엇을 직접 구축하고 검증하는지 안내합니다.
Session 4 · Day-2 트러블슈팅 및 IaC (15 / 18) 02:52 ~ 03:00 (Optional Hands-on Lab Guide)

4.15 [별도 옵션] 60분 실전 Hands-on Lab 아키텍처 및 검증 시나리오

맥락(Why): 오늘 3시간 동안 배운 핵심 아키텍처를 실제 GCP 프로젝트에서 Terraform과 gcloud CLI로 60분 만에 직접 배포하고, 502 장애 재현부터 무중단 롤링 업데이트까지 눈으로 확인하는 실습입니다.
Hands-on Lab(gcp.geap.dev/#labs)에서 직접 구축하고 테스트하는 End-to-End 토폴로지
[인터넷 클라이언트 / 부하 생성기 (trigger_502_race.py & watch_rollout.sh)]
        │
        ▼
[Global External Application Load Balancer (EXTERNAL_MANAGED, Envoy 데이터 플레인)]
        │ (Connection Draining = 60s, Readiness HC = /healthz/ready)
        ▼
[서울 리전 단일 서브넷 (10.10.0.0/20) + Cloud NAT (Dynamic Port Allocation) + IAP SSH 방화벽]
        │
        ▼
[Regional MIG (Zone A/B/C 균등 분산, Liveness HC = /healthz/live, maxSurge=3, maxUnavailable=0)]
Lab 1: 베이스라인 일괄 구축
  • terraform/ 디렉토리의 코드로 VPC, Cloud NAT, Private MIG, Envoy ALB를 단 3분 만에 프로비저닝하고 IAP 터널 접속을 검증합니다.
Lab 2: 무중단 롤링 배포 모니터
  • scripts/watch_rollout.sh로 초당 요청을 쏘면서 `v1 -> v2` 롤링 배포 시 에러율 0.00%로 버전이 전환되는 과정을 실시간 관측합니다.
Lab 3: Keep-alive 502 재현·해결
  • 백엔드 Keep-alive가 짧을 때 trigger_502_race.py로 실제 502 에러와 로그를 재현한 뒤, 620초 설정 적용 후 502가 0건이 됨을 증명합니다.
발표자 노트 (스토리라인 가이드) 마지막으로 오늘 3시간 동안 다룬 Session 1~4의 핵심 골든 룰을 2장의 요약 슬라이드로 정리합니다.
Session 4 · Day-2 트러블슈팅 및 IaC (16 / 18) 02:52 ~ 03:00 (Final Summary 1/2)

4.16 [총정리 1/2] Session 1 & Session 2 프로덕션 골든 룰 요약

맥락(Why): 인프라 운영팀이 GCE 단일 VM과 MIG 클러스터를 설계할 때 반드시 챙겨야 할 핵심 공식 요약입니다.
Session 1: GCE 코어 & 보안 베이스라인
  • 머신 & NIC: 프로덕션은 Titanium IPU 기반 C3/C4/N4를 선택하고, 커스텀 이미지에는 반드시 GVNIC 피처를 태그합니다 (vCPU당 2Gbps, 최대 200Gbps Tier 1).
  • 스토리지: 용량과 성능이 분리된 Hyperdisk Balanced를 사용하고 피크 타임 전후로 IOPS를 무중단 동적 조절합니다.
  • 이미지: 부팅 시 외부 패키지 설치를 금지하고 Packer Golden Image(30초 부팅) + Image Family로 관리합니다.
  • VPC & 보안: 리전 단일 서브넷 + Shared VPC(Subnet-level IAM) + IAM Tags 방화벽 + OS Login & IAP 터널링(35.235.240.0/20)으로 Bastion과 공인 IP를 제거합니다.
Session 2: MIG 라이프사이클 & 무중단 운영
  • 멀티존 분산: 단일 서브넷 위에서 3개 존에 걸친 Regional MIG를 쓰되, 재고 부족(Stockout) 방어를 위해 BALANCED Shape를 권장합니다.
  • 무중단 롤링 배포 공식: maxUnavailable = 0, 3개 존 병렬 배포를 위한 maxSurge >= 3, 예열을 위한 minReadySec = 60s, 교체 방식 SUBSTITUTE.
  • 스케일링 방어: 다중 지표 OR 확장을 걸고, 급격한 축소로 인한 콜드 스타트를 막기 위해 반드시 scale_in_control을 설정합니다.
  • 헬스 체크 분리: LB Readiness(/healthz/ready)와 MIG Autohealing Liveness(/healthz/live, DB 체크 제외!)를 철저히 분리하여 연쇄 자폭을 막습니다.
발표자 노트 (스토리라인 가이드) 이어서 Session 3과 Session 4의 핵심 요약을 확인합니다.
Session 4 · Day-2 트러블슈팅 및 IaC (17 / 18) 02:52 ~ 03:00 (Final Summary 2/2)

4.17 [총정리 2/2] Session 3 & Session 4 네트워크·트러블슈팅 골든 룰 요약

맥락(Why): 네트워크 운영팀과 SRE가 Cloud Load Balancing, 하이브리드 연동 및 Day-2 장애 대응 시 기억해야 할 핵심 공식 요약입니다.
Session 3: Cloud Load Balancing & 하이브리드 제어
  • 차세대 ALB & 서브넷: Envoy 기반 EXTERNAL_MANAGED / INTERNAL_MANAGED를 선택하고, 리전당 /23 이상의 Proxy-only Subnet을 사전 할당합니다.
  • Passthrough DSR 원리: google-guest-agent가 커널 local 테이블에 주입하는 proto 66 VIP 라우트를 유지하고, 백엔드 자기 호출(Hairpinning)을 피합니다.
  • 하이브리드 & NAT: 온프레미스 연동 Internal LB에는 --allow-global-access를 켜고, Cloud NAT에는 Dynamic Port Allocation과 충분한 공인 IP를 부여합니다.
  • 간헐적 502 박멸 공식: LB 유휴 타임아웃(600초)보다 백엔드 웹서버(Nginx/Node/Tomcat/Go)의 Keep-alive 타임아웃을 무조건 크게(620초) 설정합니다!
Session 4: Day-2 관측성 & Terraform 자동화
  • 심층 관측성: Golden Image에 Ops Agent를 기본 내장하여 실제 가용 메모리와 디스크 사용률, JSON 구조화 로그를 수집합니다.
  • 1분 내 병목 특정: 지연 발생 시 httpRequest.latency와 backend_target_latency를 비교하고, 5xx 발생 시 jsonPayload.statusDetails로 원인을 즉시 판별합니다.
  • 네트워크·부팅 진단: SSH 먹통 시 Serial Console을, 하이브리드 경로 차단 시 Connectivity Tests를 실행합니다.
  • Terraform 무중단 코드: name_prefix + create_before_destroy = true + self_link_unique + ignore_changes = [target_size]를 표준화합니다.
발표자 노트 (스토리라인 가이드) 마지막 98번째 슬라이드인 종합 Q&A로 넘어갑니다.
Session 4 · Day-2 트러블슈팅 및 IaC (18 / 18) 02:52 ~ 03:00 (Final Q&A & Closing)

4.18 종합 아키텍처 & 실무 운영 Q&A

맥락(Why): 3시간 동안 GCE 코어, MIG 라이프사이클, Cloud Load Balancing, Day-2 트러블슈팅 및 Terraform IaC까지 전 과정을 함께 살펴보았습니다.
1. 아키텍처 심화 문서 포털
  • 주소: https://gcp.geap.dev
  • Session 1~4 전체 이론 해설, 아키텍처 비교표, 웹서버별 Keep-alive 설정 코드, LQL 쿼리 수록
2. 발표 슬라이드 데크 (현재 화면)
  • 주소: https://gcp.geap.dev/slides.html
  • 총 98장 구성 · O 키로 전체 목차 이동 · S 키로 강사 노트 확인 · Ctrl+P로 PDF 인쇄 지원
3. Terraform & 재현 스크립트
  • 저장소: github.com/hajekim/gcp-infra
  • terraform/ (베이스라인 코드) 및 scripts/ (롤링 업데이트 모니터 & 502 재현기)
Thank You · Open Discussion & Architecture Q&A
현재 운영 중인 인프라/네트워크 환경과 관련하여 궁금하신 점이나 아키텍처 논의 사항을 자유롭게 질문해 주세요!
발표자 노트 (스토리라인 가이드) 3시간 98장 전체 발표가 마무리되었습니다. 질문에 나오는 주제 번호를 `O` 키(전체 목차 그리드)에서 바로 클릭해 해당 슬라이드를 띄워놓고 답변하시면 매우 효과적입니다.