인프라 트러블슈팅 마스터 가이드: Docker, Kubernetes, GCP Cloud Run, Cloudflare

인프라 트러블슈팅 마스터 가이드: Docker, Kubernetes, GCP Cloud Run, Cloudflare


컨테이너 가상화와 클라우드 서비스가 보편화되면서 인프라 관리의 복잡도는 급격히 증가했습니다. 로컬에서는 완벽히 돌던 코드가 배포 컨테이너 내부의 환경 설정이나 네트워크 구성, 권한 정책 차이 등으로 인해 배포 직후 중단되거나 런타임에 불규칙한 타임아웃을 유발하는 장애가 심심치 않게 발생합니다.

본 가이드에서는 클라우드 네이티브 환경의 필수 구성품인 컨테이너 최적화부터 시작하여 Kubernetes 장애 디버깅, 서버리스(GCP Cloud Run) 성능 튜닝, 네트워크 및 보안 레이어(Cloudflare, Supabase) 최적화 방법론까지 집대성하여 설명합니다.


1. Docker 컨테이너 최적화: 이미지 크기 감축

도커 이미지의 크기가 비대하면 배포 속도(Image Pull 시간)가 지연될 뿐 아니라 컨테이너 내부의 보안 공격 노출 면적도 함께 넓어집니다.

멀티 스테이지 빌드 (Multi-stage Build)

빌드 단계의 도구체인(SDK 등)과 실제 실행 단계의 런타임 환경을 분리하여 최종 산출 이미지에 순수 바이너리/산출물만 담는 구조입니다.

  • Node.js 실전 Dockerfile 구성 예시:
    # Stage 1: Build stage
    FROM node:18-alpine AS builder
    WORKDIR /app
    COPY package*.json ./
    RUN npm ci
    COPY . .
    RUN npm run build
    
    # Stage 2: Production runner stage
    FROM node:18-alpine AS runner
    WORKDIR /app
    ENV NODE_ENV=production
    COPY package*.json ./
    # 빌드에 쓰인 모듈 중 운영에 필요한 모듈만 설치
    RUN npm ci --only=production
    # 빌드 산출물 복사
    COPY --from=builder /app/dist ./dist
    
    EXPOSE 3000
    CMD ["node", "dist/index.js"]
  • 효과: 불필요한 개발 모듈이나 캐시 파일을 소거하여 이미지 크기를 70% 이상 감축할 수 있습니다. 추가로 경량화가 필요하면 Alpine OS 또는 패키지 매니저마저 없는 Distroless 이미지를 기반 이미지로 지정합니다.

2. Kubernetes Pod 장애 탐색 및 디버깅

Kubernetes 환경에 배포된 애플리케이션(Pod)이 원활하게 돌지 않고 멈출 때, 빠른 CLI 진단 명령으로 문제의 노드를 좁혀야 합니다.

대표적인 Pod 실패 상태명과 원인

  • CrashLoopBackOff: 컨테이너가 시작되자마자 에러를 뿜으며 즉시 종료되는 현상이 반복되는 상태입니다. 주요 원인은 환경 변수 누락, 잘못된 시작 명령어, 파일 권한 부재 등입니다.
  • OOMKilled: Pod에 할당된 메모리 한계치(Limits)를 넘어가 Linux 커널의 Out Of Memory Killer에 의해 강제 종료된 상태입니다.
  • ImagePullBackOff: 프라이빗 이미지 저장소(ECR 등)의 접근 권한 인증 실패나 존재하지 않는 이미지 태그명을 지정했을 때 발생합니다.

2단계 고속 진단 커맨드

# 1단계: Pod 상태 요약 및 이벤트 로그 파악 (상태 실패의 근본 이유 추적)
kubectl describe pod <pod-name>

# 2단계: 종료되기 직전 컨테이너의 stdout/stderr 출력 디버깅
kubectl logs <pod-name> --previous

3. GCP Cloud Run 서버리스 지연 및 Cold Start 개선

GCP Cloud Run과 같은 컨테이너 기반 서버리스 플랫폼은 미사용 시 인스턴스를 0개로 축소하여 비용을 절감하지만, 트래픽 유입 시 인스턴스가 생성되는 동안 첫 요청의 응답이 수초 지연되는 콜드 스타트(Cold Start) 문제를 안고 있습니다.

콜드 스타트 최소화 전략

  • 최소 인스턴스 (Min Instances) 지정: 항상 1개 이상의 대기형(Warm) 인스턴스를 활성화하여 대기 시간을 제로로 제어합니다.
  • CPU 항상 할당 (CPU Allocation Always On): 기본적으로 요청 처리 중에만 CPU가 할당되어 백그라운드 스케줄러가 잠깁니다. CPU 항상 할당을 켜면 백그라운드 캐시 갱신이나 비동기 통신이 매끄러워져 첫 부팅 성능이 개선됩니다.
  • 컨테이너 경량화: 부팅 단계에서 로딩되는 메모리 모듈 크기를 줄여 로딩 시간을 단축합니다.

4. 네트워크 배포 및 보안 제어: Cloudflare & Supabase

Cloudflare DNS 프록시 설정

Cloudflare의 DNS 설정 시 주황색 구름 아이콘(Proxy Status = Proxied)을 활성화하면 아래의 혜택을 받습니다.

  • 보안 강화: 실제 오리진 서버의 Public IP를 가리고 Cloudflare가 프록시 IP를 반환하여 DDoS 공격을 1차 방어합니다.
  • SSL/TLS 암호화 수준: 오리진 서버에 자체 서명 인증서만 설치되어 있다면 Full 모드를 사용하고, 신뢰된 공인 인증서가 있다면 Full (strict) 모드로 지정해야 구간 암호화가 완벽히 적용됩니다.

Supabase 백엔드 RLS (Row Level Security) 정책

Supabase는 PostgreSQL의 테이블 행 단위 보안 정책인 RLS를 브라우저 SDK 전면에 노출하여 안전한 권한 제어를 보장합니다.

  • 보안 설정 법칙: RLS를 활성화하고, 인증된 사용자(auth.uid())만 자신의 행을 삽입/조회할 수 있는 명시적인 정책을 구성해야 클라이언트 측에서 악의적으로 타인의 개인정보 데이터를 위조 조회하는 탈취 사고를 예방할 수 있습니다.

먼저 읽어볼 가이드

검색 유입이 많은 핵심 글부터 이어서 보세요.